Jenkins叢集下的pipeline實戰
關於Jenkins叢集
在《快速搭建Jenkins叢集》一文中,我們藉助docker快速搭建了Jenkins叢集,今天就在這個叢集環境中建立pipeline任務,體驗Jenkins叢集下的並行任務;
環境資訊
整個叢集環境一共有三臺電腦,資訊如下:
| 主機名 | IP地址 | 作用 |
|--|--|--|
| master | 192.168.133.131 | Jenkins叢集的master節點,提供web服務 |
| agent1 | 192.168.133.132 | Jenkins叢集的一號工作接節點,標籤是maven |
| agent2 | 192.168.133.133 | Jenkins叢集的二號工作接節點,標籤是gradle |
實戰內容
本次實戰要體驗Jenkins叢集同時執行兩個任務,都是編譯構建GitHub上的熱門開源專案:
- 在agent1上編譯和構建spring-cloud-alibaba,再通過scp命令將構建結果傳輸到master電腦的/usr/local/build_result目錄下;
- 在agent2編譯和構建spring-framework,再通過scp命令將構建結果傳輸到master電腦的/usr/local/build_result目錄下;
準備工作
要做以下準備工作才能順利執行後續的任務:
- 在master電腦上建立資料夾/usr/local/build_result
- 配置maven,在Jenkins網頁上選擇Global Tool Configuration,如下圖紅框所示:
- 新增一個maven配置,名為mvn-3.6.2,然後點選“儲存”按鈕,如下圖:
- agent1和agent2上用scp命令傳輸檔案到master上的時候,第一次ssh要在控制檯輸入"yes",為了避免執行任務的時候出現這個等待輸入的操作,我們去手動執行一遍,後面就再也不用了,ssh登入agent1之後,執行以下命令進入容器:
docker exec -it agent /bin/bash
- 執行命令ssh [email protected],這時候控制檯提示輸入yes或者no,請您輸入yes,再根據提示輸入master的密碼,此時登入master成功:
[root@agent1 16]# docker exec -it agent /bin/bash root@82eb8cfec0a6:/# ssh [email protected] The authenticity of host '192.168.133.131 (192.168.133.131)' can't be established. ECDSA key fingerprint is SHA256:DPE2nldWHiOhC4DB9doy7jPWNZVup6XFZ+sR2i1gqz8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.133.131' (ECDSA) to the list of known hosts. [email protected]'s password: Last login: Sat Nov 16 19:59:42 2019 from 192.168.133.132
- 此時您是在agent1的容器中ssh登入了master,所以要連續輸入兩次exit命令才能返回到agent1的控制檯;
- 在agent2電腦上也執行相同的操作;
至此,準備完畢,可以建立任務了;
編譯構建spring-cloud-alibaba的任務
spring-cloud-alibaba是個maven工程,要用maven來編譯構建:
- 在Jenkins網頁上,點選下圖紅框位置,建立一個任務:
- 如下圖,建立名為spring-clolud-alibaba的pipeline任務:
- 下圖紅框位置就是輸入pipeline指令碼的地方:
- 在上圖紅框位置輸入以下內容:
pipeline {
agent {
label 'maven'
}
tools {
maven 'mvn-3.6.2'
}
stages {
stage('Checkout') {
steps {
echo '從GitHub下載spring-cloud-alibaba工程的原始碼(2.1.1.RELEASE歸檔包)'
sh 'wget https://github.com/alibaba/spring-cloud-alibaba/archive/v2.1.1.RELEASE.tar.gz'
echo '下載結束,解壓歸檔包'
sh 'tar -zxf v2.1.1.RELEASE.tar.gz'
}
}
stage('Build') {
steps {
echo '開始編譯構建'
sh 'cd spring-cloud-alibaba-2.1.1.RELEASE && mvn clean package -U -DskipTests'
}
}
stage('Save') {
steps {
echo '將構建結果傳送到儲存伺服器'
sh 'cd spring-cloud-alibaba-2.1.1.RELEASE/spring-cloud-alibaba-nacos-discovery/target && sshpass -p 888888 scp ./*.jar [email protected]:/usr/local/build_result'
echo '傳送完畢'
}
}
stage('Clean') {
steps {
echo '清理Maven工程'
sh 'cd spring-cloud-alibaba-2.1.1.RELEASE && mvn clean'
echo '清理完畢'
}
}
}
}
- 點選底部的"儲存"按鈕後,點選下圖紅框中的"立即構建"即可開始任務:
點選下圖紅框中的紅色圓球,即可跳轉到實時輸出任務資訊的頁面:
頁面實時輸出構建資訊:
主頁面可以看到是agent1在執行任務,如下圖紅框所示,可見pipeline指令碼中的標籤已經生效了,將任務排程到標籤為maven的節點去執行:
編譯構建spring-cloud-alibaba工程是個費時的操作,我們現在去建立另一個任務:編譯構建spring-framework編譯構建spring-framework的任務
spring-framework是個gradle工程,不需要準備gradle環境,在執行編譯命令時會自動下載gradle工具:- 建立名為spring-framework的pipeline任務:
- pipeline指令碼如下:
pipeline {
agent {
label 'gradle'
}
stages {
stage('Checkout') {
steps {
echo '從GitHub下載spring-framework工程的原始碼(master分支)'
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'https://github.com/spring-projects/spring-framework.git']]])
}
}
stage('Build') {
steps {
echo '開始編譯構建'
sh './gradlew build'
}
}
stage('傳送構建結果') {
steps {
echo '將構建結果傳送到儲存伺服器'
sh 'cd spring-core/build/libs && sshpass -p 888888 scp ./*.jar [email protected]:/usr/local/build_result && cd ../../..'
echo '傳送完畢'
}
}
stage('Clean') {
steps {
echo '清理gradle工程'
sh './gradlew clean'
echo '清理完畢'
}
}
}
}
立即執行此任務,可見任務已經被排程到agent2上去執行了,此時的agent1和agent2正在同時執行任務,如下圖:
檢視構建結果
上述兩個任務在構建成功後,都會通過scp命令將構建結果傳送到master的/usr/local/build_result目錄下:
[root@master build_result]# ls
agent.jar spring-cloud-alibaba-nacos-discovery-2.1.1.RELEASE.jar spring-cloud-alibaba-nacos-discovery-2.1.1.RELEASE-sources.jar spring-objenesis-repack-3.1.jar
spring-cglib-repack-3.3.0.jar spring-cloud-alibaba-nacos-discovery-2.1.1.RELEASE-javadoc.jar spring-core-5.2.2.BUILD-SNAPSHOT.jar
至此,Jenkins叢集下的pipeline實戰就完成了,藉助pipeline的標籤引數可以控制任務的排程節點,實現多工同時在多節點執行;