前文我們主要聊了下jenkins的插件安裝、用戶及權限管理、郵件發送、配置憑證到gitlab上拉取項目和創建普通job;回顧請參考https://www.cnblogs.com/qiuhom-1874/p/13810648.html;今天我們來了解下jenkins的一個核心功能pipline以及jenkins的分布式slave節點的部署;
pipline介紹
pipline 是幫助 Jenkins 實現 CI 到 CD 轉變的重要角色,是運行在 jenkins 2.X 版本的核心插件,簡單來說 Pipline 就是一套運行於 Jenkins 上的工作流框架,將原本獨立運行於單個或者多個節點的任務連接起來,實現單個任務難以完成的復雜發布流程,從而實現單個任務很難實現的復雜流程編排和任務可視化,Pipeline 的實現方式是一套 Groovy DSL,任何發布流程都可以表述為一段 Groovy 腳本。
pipline優勢
可持續性:jenkins 的重啟或者中斷后不影響已經執行的 Pipline Job;
支持暫停:pipline 可以選擇停止並等待人工輸入或批准后再繼續執行。
可擴展:通過 groovy 的編程更容易的擴展插件。
並行執行:通過 groovy 腳本可以實現 step,stage 間的並行執行,和更復雜的相互依賴關系。
pipline語法
Stage:階段,一個 pipline 可以划分為若干個 stage,每個 stage 都是一個操作,比如 clone 代碼、代碼編譯、代碼測試和代碼部署,階段是一個邏輯分組,可以跨多個 node 執行。
Node:節點,每個 node 都是一個 jenkins 節點,可以是 jenkins master 也可以是 jenkins agent,node 是執行 step 的具體服務器。
Step:步驟,step 是 jenkins pipline 最基本的操作單元,從在服務器創建目錄到構建容器鏡像,由各類Jenkins 插件提供實現,例如: sh “make”;
示例
node { stage("clone 代碼"){ echo "代碼 clone" } stage("代碼構建"){ echo "代碼構建" } stage("代碼測試"){ echo "代碼測試" } stage("代碼部署"){ echo "代碼部署" } }
提示:上面是pipline腳本示例,node用於指定節點,stage用於指定階段名稱;而下面的echo就是在每個階段需要做的事;基本語法就是這樣;從上面的示例不難反應一個job的工作流程;我們寫pipline 構建pipline job就是根據項目構建流程來把要做的事用上述語法的形式表示出來,然后jenkins就可以根據我們定義的pipline任務,依次去各節點執行定義在自身的階段任務;
創建pipline job
提示:新建任務要首先給任務寫一個名稱,然后選擇流水線,點確定;
提示:我們在general寫上任務描述,然后就可以直接到流水線把我們上面的pipline 示例貼在此處;
提示:選擇立即構建;
提示:最后執行成功就會顯示淺綠色的方格,每個方格代表一個階段;我們可以點擊方格查看對應階段執行的操作日志;如下
當然我們也可以查看整個構建過程的日志,如下
提示:找到左下方的構建時間,點擊時間后端小三角,選擇console output就可以查看整個構建的日志中了;
當然,我上面只是一個很簡單的測試,主要是讓我們去理解pipline執行的流程和效果;
生成Groovy代碼
示例:把拉取代碼生成Groovy腳本
提示:點擊配置,進入到配置任務的界面;
提示:找到流水線語法,然后點擊跳轉到另外一個頁面;
提示:這里我們可以選擇很多類型,比如我們要拉去代碼,可以選擇git:Git ;
提示:選擇git:Git后,它會讓我們輸入倉庫地址和憑證,如果這里沒有憑證我們也可以選擇添加憑證;選擇好以后點擊下面的生成流水線腳本;然后我們就可以把生成后的腳本,拷貝到我們需要執行的步驟里;
提示:編輯好pipline腳本后,點擊應用,我們又可以去執行我們現在的任務;
提示:可以看到我們第二次構構建任務也是執行成功的;在克隆代碼階段,我們也可以看到jenkins到我們指定的倉庫中拉去代碼;
驗證:在服務器上對任務目錄中看看是否將gitlab上的代碼拉去下來了?
提示:可以看到對應的任務目錄下的確有從gitlab上拉去的文件;
pipline 中執行 shell 命令
提示:執行shell命令我用sh去執行,把要執行的shell命令用引號引起來;上面在代碼構建這個階段,用shell命令做了一件事,到test-pipline-job目錄打包了所有文件,生成了一個test.tar.gz的壓縮文件;
驗證:執行test-pipline-job,看看服務器對應的目錄下是否有test.tar.gz文件生成?
提示:從構建日志和視圖上看是執行成功了;我們在去服務器上確認下
提示:在test-pipline-job目錄下的確有test.tar.gz文件生成;說明我們在代碼構建階段執行的shell命令成功了;
配置jenkins的slave節點
在要成為slave節點上安裝java環境
[root@node05 ~]# yum install -y java-1.8.0-openjdk-devel
驗證:java環境
[root@node05 ~]# java -version openjdk version "1.8.0_262" OpenJDK Runtime Environment (build 1.8.0_262-b10) OpenJDK 64-Bit Server VM (build 25.262-b10, mixed mode) [root@node05 ~]#
創建存放slave數據的目錄
[root@node05 ~]# mkdir /data/jenkins/slave01 -p [root@node05 ~]# tree /data /data └── jenkins └── slave01 2 directories, 0 files [root@node05 ~]#
在jenkinsweb圖形界面找到節點管理,選擇新建節點
提示:填寫slave節點名稱或者IP地址,然后選擇固定節點,然后點擊確定;
提示:填寫對應的信息,在啟動方式里選擇SSH,然后主機就寫slave主機的ip地址,然后選擇憑證,如果沒有就選擇添加;
提示:這里把連接slave節點的用戶和密碼填寫上;也可以選擇公鑰私鑰,然后把私鑰放上去也行;填寫好,點添加;然后在憑證里再選我們添加的憑證;
提示:這里如果是第一次連接slave我們要選擇為驗證那個選項,這樣jenkins去用ssh連接slave出現輸入yes,它會幫我們輸入,否則jenkins會連接上不是;如果之前用ssh連接過slave,host key驗證我們可以選擇第一個know那個;選擇好以后點擊保存就好;
提示:以上就是成功將192.168.0.45配置成jenkins的slave節點的狀態,如果我們添加到對應節點上有小紅叉,說明我們添加slave節點有問題;我們可以查看日志,來排查對應的錯誤;
查看slave構建日志
提示:從上面日志上,我們可以看到jenkins啟動slave時,首先會去我們指定的數據目錄找java命令,然后返回java的版本,然后啟動一個sftp線程,拷貝remoting.jar到我們指定的數據目錄,然后在slave節點上執行 java -jar 把對應的jar包運行起來;
驗證:在192.168.0.45上查看是否運行了remoting.jar的進程
提示:可以看到在192.168.0.45上,運行了一個remoting.jar的jave進程;
配置 slave 執行 job
執行job
提示:這里提示我們執行job失敗,說沒有git;我們在slave節點上安裝git命令
[root@node05 ~]# yum install git -y
再次構建job,看看是否能夠夠構建成功?
提示:這里這個錯誤嚴格上不應該出現,我們在pipline中寫的構建代碼,cd的目錄在slave上是不存在的,所以構建代碼這一步就失敗了;
修改pipline腳本,然后重新構建job
再次構建
查看執行job日志
提示:在日志中的確可以看到,執行過程是在我們指定的slave節點上執行的;
驗證:去slave節點上對應目錄下看看是否有test.tar.gz生成?
提示:可以看到slave節點上對應目錄下生成了我們指定打包文件;