DevOps課程-Jenkins 11

Jenkins Shared Library(有點難)

ZONGRU Li
13 min readJan 23, 2022

在當前這個微服務興起的年代

會有越來越多的微服務專案的建立

其所需要的CI/CD流程的Jenkins Pipeline極其相似

若是在各個微服務專案對應的Jenkins Pipeline都撰寫相似的groovy邏輯

並不是一個好選擇,所以需要將相同的邏輯撰寫成 — Shared Library

但是Shared Library則需要額外的版本控制,i.e.獨立的Repository

以下為了demo

我從前面課程建立的"my-multi-branch-pipeline"這個Job複製出新的

上圖Save後會立刻進行branch掃瞄確認是否有對應的JenkinsFile:

因為我還沒建,後面再建立

後面的目標就是將之前做好的Jenkinsfile-mbp裡面

可以共用的邏輯做成groovy專案Shared Library

然後改寫到後面一併要建立的Jenkinsfile-Use-SL裡面用呼叫的方式

建立groovy Shared Library專案:

在eclipse內已安裝groovy套件情況下:

開始建立groovy專案:

初始的結構如下:

groovy初始專案結構

主要groovy專案的使用結構是vars目錄(等下會建立)

vars目錄裡面放置各種.groovy檔案

這也是Jenkinsfile會引用共用函式(SL)的入口

而在後面還可以將vars目錄內建立的.groovy的函式內容共同放到src目錄內

(後面會演示)

目前先用簡單的vars目錄,先把它建立並開一個.groovy檔

i.e.最終順序是Jenkinsfile呼叫->vars下的.groovy或調用->src下的函式

1.這邊先把vars目錄建立出來:

2.在vars目錄內建立buildJar.groovy檔案:

然後就可以開始撰寫邏輯了:

其中要注意的是,上面的buildJar.groovy的名稱:buildJar

就將會是Jenkinsfile呼叫的函式名稱!

基本寫法如下:

但是有些開發工具會認不得.groovy檔,所以其實可以加入shebang宣告

看起來eclipse沒啥問題就是了

第一支完成的內容如下:

同理再做一支打包image的來取代以下:

目前就先做這兩支SL來用用

3.接著要把它掛上github使用:

先到github上建立新的jenkins-shared-library的Repo!!

跳出相關的git命令可以參考:

接著在本機專案目錄打開git bash,執行git init:

連結github Repo專案,執行上面有提示的指令:

git remote add origin https://github.com/JavaNoobPig/jenkins-shared-library.git

接著把目前的code add/commit:

接著推上github,但是本機用的branch名稱是master,我希望推成遠端main

先切換branch名稱:
git branch -M main
推上遠端main branch:
git push -u origin main

看到遠端github:

成功推上去了!!

Jenkins Server引入該Shared Library專案:

在組態設定裡面的Global Pipeline Libraries內新增(記得這是整個Jenkins Job可供使用)

填入以下資訊後建立:

上述儲存後

以下github上的groovy library就可供所有的Jenkins pipeline使用了

該專案透過Jenkins設置的Global Pipeline Library後,可供pipeline的Jenkinsfile調用

改寫Jenkinsfile,準備調用,先來看看原本有使用到script.groovybranch:

另外

而我前面複製出來的新的Jenkins Job使用的Jenkinsfile名稱是要:

所以我嘗試在jenkins-jobs-pipeline內建立新的叫Jenkinsfile-Use-SL:

內容先使用上面的Jenkinsfile拿來改:

當前內容先加入shebang後長以下這樣:

開始改造上述內容,另外我們可以注意到我目前只製作了兩個stage的函式

所以最後deploy還是會用到既有的肚子內的script.groovy內定義的

這非常合理,總有部分函式會根據專案或branch有各自的差異

沒辦法都用共用的函式

中間兩步驟要改使用共用的SL,要在開頭先import進去:

宣告@Library

另外講師特別提醒,如果這個過程我們並沒有使用def gv的宣告時候

宣告@Library那一行的結尾必須要加入一個下底線!

類似像下面這樣:

當Library下面跟著是pipeline{},則要加一個下底線

接著改寫要替換的兩個步驟:

當前完整如下:

將內容commit進去:

執行Job測試:

接著回頭前面建立的新的Job測試,執行:

buildJar()有正常呼叫!

另外console log裡面也是正常,太長了就不放上來了

dockerhub也可以看到結果:

三分鐘前有推上去!

這邊我做個短短的小結論:

我設定了全部Job都可以調用的groovy的shared library:

複製了一個multi-branch-pipeline:

使用全新的Jenkinsfile,名稱為:Jenkinsfile-Use-SL

也真的寫出來,並且裡面真的嘗試使用shared library的函式:

最終也真的成功!

進階改造,可以傳入參數的shared library:

當前我們有一個SL(共用)函式長以下這樣:

有一個明顯的缺點就是image名稱居然寫死的

還好改寫很簡單,如下(記得有變數的要改用雙引號):

因為現在是IDE內,所以直接改一改:

另外一個也可以改造,原本長這樣:

改一下帶個非傳入的變數:

然後用git工具推上去!

add,commit,推!

但是其實還可以更進一步改寫這個SL專案

在src目錄內,可以彙整整個vars目錄內的函式邏輯內容

所以還需要另外改寫為以下:

先建立package

在這個package內建立Docker.groovy來統整函式邏輯:

接著貼上vars目錄上的函式內容:

但是其實這邊會有一個問題

在以下目錄底下的groovy其實無法辨識指令或變數:

這時候就要透過剛剛建構子的script來使用這些指令或變數

因為script代表著vars裡面的groovy物件:

完整如下:

而真正呼叫的vars目錄下的groovy檔案則改寫為以下

為了更清楚的辨別,我額外加幾個字:

然後就是add commit 推:

此時github上面的shared library的就準備好了,但是呼叫方的還沒改好

commit

也有透過參數push上dockerhub:

小結一下:

目前就好像將vars目錄下的groovy檔案其名稱當作介面層

用以呼叫實際撰寫邏輯內容的src底下的groovy內容

同理可以在Docker.groovy內定義多個可以使用的函式:

完整如下:

改造vars目錄下的groovy檔案:

新增:

再建立新的dockerPush.groovy檔:

當然也再做一支打包的:

原本的大支的buildAndPushImage.groovy就放著不使用了

接著改寫Jenkinsfile-Use-SL內容,改呼叫剛剛上面新建立的,原本:

改為:

記得改到git上面:

剛剛改的SL專案也要推上去:

再次執行:

發現這個沒改到:

改成:

然後再跑一次就成功了:

<<<<心得:真的要很細心才有辦法這樣搞>>>>

是剛剛做成的函式

最後由前面的SL學習到如何製作出所有Job都可以取用的SL(shared library)

但是如果有人小心眼一點,做了SL只想給自己的Job使用的話呢?

其實也有辦法!

首先:

把可以共用的SL刪除

移除儲存後

接著就要改變引用github上的SL的方式

也就是要改寫Jenkinsfile →Jenkinsfile-Use-SL

為了保留一份,我另外複製一個新的Jenkins Job出來

當下儲存依樣會自動掃描有沒有對應的Jenkinsfile

如上當然沒有,所以這時候就去github建立

要改寫為自己引入SL,改造成:

完整如下:

一樣commit進git內:

執行Job:

上圖結果i.e.是pipeline Job本身自己去git上面取用SL專案

而不是統一透過Jenkins取得SL專案內容

這整篇有點難度,課程內容很長,反覆看了幾遍才一次寫完

但是可以清楚理解其概念

參考課程reference

--

--

ZONGRU Li
ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!

No responses yet