1. 程式人生 > 實用技巧 >持續整合工具之Jenkins pipline簡單示例

持續整合工具之Jenkins pipline簡單示例

  前文我們主要聊了下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節點上對應目錄下生成了我們指定打包檔案;