介紹centos系統上安裝Jenkins部署Spring Boot項目流程,并通過github Webhooks通知Jenkins代碼更新信息并自動重新部署項目。
準備環境
- JDK1.8
yum install JAVA-1.8.0-openjdk* -y java -version
能顯示版本即安裝成功,無需再配置環境
- Maven
個人的Maven安裝目錄是/usr/bin/maven:
mkdir /usr/bin/mavenwget http://mirror.bit.edu.cn/Apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gztar xzvf apache-maven-3.6.3-bin.tar.gzcd /usr/bin/maven/apache-maven-3.6.3/conf
將settings.xml倉庫更改為阿里云倉庫并配置服務器倉庫路徑,如本地已有Maven配置文件,直接把本地文件上傳到服務器并更改倉庫路徑即可(推薦一款有理想的國產SSH工具-FinalShell,可直接拖到文件到指定文件夾)
配置Maven環境變量(vi /etc/profile):
export M2_HOME=/usr/bin/maven/apache-maven-3.6.3PATH=$M2_HOME/bin:$PATH
保存退出,source /etc/profile重載環境變量,mvn -v能正確顯示maven版本即配置成功
- Jenkins
Jenkins安裝命令:
wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.reporpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.keyyum install -y jenkins
修改配置文件vi /etc/sysconfig/jenkins并將端口號配置為8500:JENKINS_PORT=“8500”
jenkins啟動相關指令:
service jenkins start #啟動service jenkins restart #重啟service jenkins stop#停止
初始密碼在/var/lib/jenkins/secrets/initialAdminPassword文件中,訪問http://ip:8500/安裝推薦插件。
Jenkins配置(Manage Jenkins)
- System Configuration(系統管理)
配置maven、git、email并Save,其中maven與git配置為必須,maven配置用于jenkins找到mvn指令位置,git用于jenkins從倉庫拉取文件:
- Global Tool Configuration(全局工具管理)
配置全局工具路徑,主要配置JDK、Git、Maven并Save:
注:java地址可通過ls -lrt /etc/alternatives/java查找,截取jre之前的路徑。
- Manage Plugins(插件管理)
如果需要構建Jenkins的Maven項目則需安裝Maven Integration插件,但使用jenkins maven插件創建的項目執行mvn install后就會顯示sucess,如需再執行指令設置構建unstable的話使用Freestyle項目也可。由于Freestyle的把控性更強且更自由,配置了maven環境后也可通過maven指令構建而不需再按照Jenkins Maven Integration插件,所以該文著重介紹Freestyle且更推薦使用Freestyle構建。
Jenkins項目配置(New Item)
1. 配置項目github地址,git Credentials可使用用戶名密碼或SSH key
2. 配置執行腳本
BUILD_ID=DONTKILLME# 獲取正在運行的ecs-Application程序pidpid=$(ps -aux|grep ecs-application | grep -v grep| gawk '{print $2}')if [ ${#pid} != 0 ] then kill -9 $pidficd /var/lib/jenkins/workspace/ecs-applicationmvn clean packagenohup java -jar /var/lib/jenkins/workspace/ecs-application/target/ecs-application.jar -Xmx512m -Xms512m -Xss4m &pid=$(ps -aux|grep ecs-application | grep -v grep| gawk '{print $2}')# 獲取正在運行的ecs-application的pid并判斷其字符串長度,0為不存在(即構建失敗)if [ ${#pid} == 0 ] then echo "***** BUILD FAILED ******" exit 1 else echo "***** BUILD SUCCESS *****"fi
需要注意的是Jenkins執行腳本中若不添加BUILD_ID=DONTKILLME的話則會在執行完腳本后會把腳本中的程序關閉。jenkins創建的所有項目都可以在/var/lib/jenkins/workspace中找到。為了避免程序運行失敗結果卻顯示成功,當執行程序后pid不存在則exit 1,且需設置build unstable符號值,如下圖:
如有郵箱發送需求也可在Post-build Actions設置Email Notification
3.構建
直接在項目Build Now或在jenkins主頁面中點擊項目最右側符號即可。通過項目Workspace可查看/var/lib/jenkins/workspace當前項目中的所有文件,將日志文件配置為該workspace目錄下文件時即可查看當前程序的運行日志,如在jenkins查看當前項目日志/var/lib/jenkins/workspace/ecs-application/logs/info.log:
附日志配置文件logback-spring.xml(為了出錯更容易定位添加error.log配置):
<?xml version="1.0" encoding="UTF-8"?><configuration debug="true" scan="true"> <!-- 文件輸出格式 --> <property name="PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) %-5level [%thread] %c [%L] : %msg%n"/> <!-- log文件路徑 --> <property name="LOG_PATH" value="/var/lib/jenkins/workspace/ecs-application/logs"/> <!--彩色日志定義--> <property name="CONSOLE_LOG_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %([%thread]) %cyan(%logger) : %msg%n"/> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <charset>UTF-8</charset> <pattern>${CONSOLE_LOG_PATTERN}</pattern> </encoder> </appender> <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>${LOG_PATH}/info.log</File> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符 --> <pattern>${PATTERN}</pattern> <charset>UTF-8</charset> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${LOG_PATH}/info.%d{yyyy-MM-dd}.log.zip</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> </appender> <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender"> <File>${LOG_PATH}/error.log</File> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <charset>UTF-8</charset> <pattern>${PATTERN}</pattern> </encoder> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.log.zip</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> </appender> <springProfile name="dev"> <root level="info"> <appender-ref ref="console"/> <appender-ref ref="info"/> <appender-ref ref="error"/> </root> </springProfile></configuration>
4. 配置Webhook
每次推完代碼之后都要上Jenkins重新點擊啟動項目,這肯定是很麻煩的,但可以通過安裝Webhook插件,讓github或gitlab接收到代碼更新后把該信息發送到服務器jenkins上,讓jenkins自動去拉代碼重新部署項目。在Jenkins插件管理安裝Generic Webhook Trigger Plugin插件:
當然了,只裝不看就沒有用了,點擊插件看一下了解一下用法:
該Webhook插件的一個規則是接收所有HTTP請求,接收地址為JenkinsURL/generic-webhook-trigger/invoke 。既然有接收地址自然有發送地址,github配置Webhook入口在項目的Settings菜單下,配置如下:
雖然配置了github Webhooks,但Jenkins接收到github的消息后仍不知要更新哪個項目,因為可能jenkins下有多個同一github地址下的項目,此時就需要對Jenkins的項目進行Webhook配置了。上圖中的URL地址欄添加了token參數,該參數是根據Jenkins的Webhook插件規則配置的。Jenkins安裝Webhook插件后Jenkins項目Configure中的Build Triggers中會出現Generic Webhook Trigger選項,勾選該選項Jenkins即可監聽到該項目對應的github倉庫代碼更新后自動重新部署項目。為了提高安全性可以在地址欄參數或header添加Token。
注:如果沒有硬件防護建議開啟防火墻只暴露有需要的端口,避免服務器被挖礦(親身體驗),相關指令如下(在本文中的服務器是進行了8500端口的開放):
重啟:firewall-cmd --reload
永久開放端口:firewall-cmd --zone=public --add-port={port}/tcp --permanent
永久關閉端口:firewall-cmd --remove-port={port}/tcp --permanent
查看開放端口:firewall-cmd --list-ports
關閉防火墻命令:systemctl stop firewalld.service
開啟防火墻:systemctl start firewalld.service
更多指令可通過tab鍵或firewall-cmd -h查看
結語
在實際生產中如果項目只有幾個人負責沒有更多的要求的話按以上流程就基本可以完成項目的自動部署流程了(曾經工作過的小公司大致流程跟以上差不多,開發公眾號時自己一個負責也就沒有太多的Jenkins鑒權管理),當然git的分支也可能需要切換,當項目有一定規模開發人員有一定數量時則必須做好權限的管理了,把分支的整合部署集權在少數人少,避免每次的小更改都需重新部署。以上流程看看就好,因為沒必要記住自己吃過多少面包片,了解一些吃法就行。