1. 程式人生 > 程式設計 >SpringCloud實戰:Jenkins持續整合

SpringCloud實戰:Jenkins持續整合

什麼是持續整合?

簡單來說,大型系統拆分為多個服務後,每個小團隊負責一個服務,服務的更新、釋出會變得很頻繁,通過工具監控程式碼的每次提交,持續進行自動化的構建過程,就是持續整合。

為什麼要用 Jenkins 做持續整合?

Jenkins是一個功能強大的應用程式,允許持續整合和持續交付專案,是一個免費的開源平臺,可以處理任何型別的構建或持續整合。

安裝 Jenkins 與其他必備環境
  • 1.伺服器環境:centos7(192.168.68.141),Tomcat8 ,Git ,jdk1.8,maven3.5.2
  • 2.Git碼雲帳號與倉庫程式碼,jenkins從該倉庫拉取程式碼,進行構建編譯,構建完後,自動執行shell命令啟動服務,完成釋出,該倉庫下有多個Spring Cloud的服務,
    原始碼
  • 在這裡插入圖片描述
  • 3.安裝 jdk1.8,maven3.5.2,把jdk與maven配置到 /etc/profile中,再 source /etc/profile 使其生效
    在這裡插入圖片描述
  • 4.centos安裝git,yum install git-core,輸入 git --version,配置git全域性使用者與郵箱資訊,先把 git 上的專案 clone 到伺服器上,看通過 git 命令是否能克隆專案,此步驟很重要,在家目錄拉取程式碼 git clone [email protected]:zhuyu1991/spring-cloud.git 命令的方式拉取到本地,第一次構建時在jenkins中配置該目錄,之後的構建,需要配置jenkins的工作區,在 /root/.jenkins/workspace/ 下,下面有說明, 再對jenkins配置定期拉取倉庫中的程式碼進行構建,下面截圖說明倉庫的程式碼拉到了本地。
    在這裡插入圖片描述

    在這裡插入圖片描述
  • 4.下載 jenkins.war,https://jenkins.io/download/
  • 5.下載 Tomcat ,https://tomcat.apache.org/
  • 6.把 jenkins.war 包放在 tomcat 的 webapps 目錄下,啟動tomcat
    在這裡插入圖片描述
  • 7.然後在瀏覽器中訪問 : http://192.168.68.141:8080/jenkins/ , 你將會看到如下介面,代表 Jenkins 已經部署完成了,下一步安裝配置 Jenkins
  • 獲取Jenkins admin的預設密碼 cat /root/.ssh/secrets/initalAdminPassword
    在這裡插入圖片描述
  • 8.進入選擇外掛安裝介面,選擇第一個(Install suggested plugins)安裝預設Jenkins外掛
  • 9.外掛安裝完成之後,需要建立一個使用者
  • 10.進入系統主介面後,點選左側的系統管理,再點選又側的管理外掛,jenkins需要安裝 Git plugin 、Maven Integration外掛
  • 11.安裝完必備外掛後,點選系統管理,再點選全域性工具配置,給jenkins 配置 構建需要的 jdk、maven、git,jdk與maven的路徑已在 /etc/profile中配置,把路徑複製到對應的Home中,git的用預設
    在這裡插入圖片描述
  • 12.伺服器生成ssh key,key分為:id_rsa(私鑰),id_rsa.pub(公鑰),把公鑰配置到git倉庫的公鑰管理配置處,私鑰配置在jenkins中,jenkins憑藉私鑰向Git倉庫拉取程式碼,Git倉庫通過私鑰與公鑰對比驗證決定是否能拉取
  • 在centos中輸入:ssh-keygen -t rsa -C “[email protected]”,會在/root/.ssh/下生成2個檔案,把公鑰配置到git倉庫的專案上,把私鑰配置到 jenkins 全域性憑據中,檢視公、私鑰:cat /root/.sshh/id_rsa
    在這裡插入圖片描述
    在這裡插入圖片描述
  • 13.環境配置工作已經完成,回到主介面,點選新建任務,輸入名稱,選擇構建maven專案,點選儲存,如果沒有maven說明jenkins的maven外掛沒有安裝
    在這裡插入圖片描述
  • 14.開始配置 jenkins單個job

    選擇Git,輸入git倉庫地址,選擇Credentials憑據,就是前面建立的
    在這裡插入圖片描述
    勾選輪詢SCM,每隔10分鐘構建一次(H/10 * * * *),只要Git中資料有更新,則觸發構建任務
    在這裡插入圖片描述
    構建環境選擇 Add timestamps to the Console Output
    在這裡插入圖片描述
    注意:Pre Steps Build 需要輸入要構建專案的 pom.xml,第一次構建時,因為是在家目錄clone的,輸入 /root/spring-cloud/fast/pom.xml,第一次構建完後jenkins會把專案拷貝至它的工作目錄中 /root/.jenkins/workspace/ 下,第二次構建時需要修改此路徑,因為jenkins通過git拉取的程式碼在此工作目錄下

Post Steps 構建完成後新增執行 shell 指令碼,指令碼的意思是查詢eureka-server的程式,並殺死,然後啟動 eureka-server包
在這裡插入圖片描述
在這裡插入圖片描述

  • 點選儲存,再點選構建,左側會有一個藍白相間的進度條,點選進度條上面的黑色三角形,檢視控制檯輸出,可以看到 maven 只在編譯專案
    在這裡插入圖片描述
    下面可以看到構建成功了,因設定了構建成功後執行一段指令碼,用來啟動服務
    所以接下來會執行的shell指令碼,內容如下:
#!/bin/bash
echo "********************** Jenkins Stopping SpringBoot Application*************************"
jar_name=eureka-server-0.0.1-SNAPSHOT.jar
pid=`ps -ef | grep $jar_name | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
#!kill -9 強制終止
   echo "kill -9 的pid:" $pid
   kill -9 $pid
fi
file_path=/root/.jenkins/workspace/eureka-server/eureka/eureka-server/target/
echo "執行....."
java -jar $file_path$jar_name
echo "********************** Jenkins Started SpringBoot Application*************************"
1234567891011121314複製程式碼

在這裡插入圖片描述
可以看到日誌輸出 Started Eureka Server,ok到此構建完成了

訪問 eureka-server地址 http://192.168.68.141:10025/ ,可以看到剛剛的構建成功了
在這裡插入圖片描述
因為上面配置了 輪詢 SCM,每隔10分鐘查詢一次Git倉庫,是否有程式碼提交,有就會觸發構建,在Git倉庫改動程式碼後提交(提交時的備註資訊是:新增列印日誌),等待10分鐘的週期,看看是否會構建一次
隔了10多分鐘後,進行了一次自動構建,git提交時的備註資訊也拉取過來了
在這裡插入圖片描述

好了,Jenkins輪詢拉取 Git 倉庫中的程式碼,有變動就會觸發構建,構建後可以執行自定義 shell 指令碼,可以很方便的做整合測試,打包到 docker 私有倉庫,再通過運維拉取docker映象到測試、正式環境進行上線

補充一點,上面是 java -jar xxx.jar 的形式啟動,不是後臺啟動的,jenkins預設會在構建完成後殺掉構建過程中有jenkins中shell命令觸發的衍生程式。jenkins根據BUILD_ID識別某個程式是否為構建過程的衍生程式,故修改BUILD_ID後,jenkins就無法識別是否為衍生程式,則此程式能在後臺保留執行
1.改造 shell 指令碼,能後臺啟動,在Post Steps中,替換之前的指令碼,使用下面的指令碼
在這裡插入圖片描述

OLD_BUILD_ID=$BUILD_ID
echo $OLD_BUILD_ID
BUILD_ID=dontKillMe

#此處放入shell指令碼或者shell命令
sh /restartBoot1.sh

BUILD_ID=$OLD_BUILD_ID
echo $BUILD_ID
123456789複製程式碼

2.然後在伺服器的根目錄放一個 restartBoot1.sh 檔案,該檔案在centos上建立,然後把內容複製進去,因為windows上的檔案格式與linux上的不一樣,啟動時會報錯,此處坑了我一下,內容如下:

#!/bin/bash
echo "********************** Jenkins Stopping SpringBoot Application*************************"
pid=`ps -ef | grep eureka-server-0.0.1-SNAPSHOT | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
#!kill -9 強制終止
   echo "kill -9 的pid:" $pid
   kill -9 $pid
fi
echo "執行....."
nohup java -jar /root/.jenkins/workspace/eureka-server/eureka/eureka-server/target/eureka-server-0.0.1-SNAPSHOT.jar &
echo "********************** Jenkins Started SpringBoot Application*************************"
123456789101112複製程式碼

手動多構建幾次,可以看伺服器上 eureka-server的程式號,前面的被後面的kill,然後後面的後臺啟動
在這裡插入圖片描述

專案中使用了lombok,伺服器上 jenkins 編譯報錯,需要更改maven complier的版本,低版本的才相容

<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.6.2</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
	</plugins>
</build>			
1234567891011121314151617複製程式碼