Jenkins Pipeline 擴(kuò)展使用外部共享庫(kù)(Shared Libraries)

官方文檔 - Extending with Shared Libraries
CloudBees - getting-started-with-shared-libraries-in-jenkins
CloudBees - github - pipeline-library
CloudBees - github - global-library-課程范例
How To Use Shared Libraries In A Jenkins Pipeline?

一枪狂、Shared Libraries 簡(jiǎn)介

1细疚、Directory structure

Shared Library repository 的結(jié)構(gòu)

(root)
+- src                     # Groovy source files
|   +- org
|       +- foo
|           +- Bar.groovy  # for org.foo.Bar class
+- vars
|   +- foo.groovy          # for global 'foo' variable
|   +- foo.txt             # help for 'foo' variable
+- resources               # resource files (external libraries only)
|   +- org
|       +- foo
|           +- bar.json    # static helper data for org.foo.Bar
  • src 目錄類似標(biāo)準(zhǔn)的Java源目錄茄唐。在執(zhí)行Pipeline的時(shí)候會(huì)被添加到classpath芋肠。
  • vars 目錄存放腳本文件,這些文件在Pipelines中作為變量幽崩。文件的名稱就是Pipeline中變量的名稱苦始。比如存在文件vars/log.groovy,文件下存在函數(shù) def info(message)…慌申,那么在Pipeline以 log.info "hello world"的方式訪問(wèn)盈简。
  • resources 目錄允許擴(kuò)展庫(kù)使用 libraryResource step 加載非Groovy文件。目前內(nèi)部庫(kù)不支持此功能太示。參考Loading resources柠贤。

2、Global Shared Libraries

  • 推薦方式
  • 通過(guò) Manage Jenkins ? System ? Global Pipeline Libraries 進(jìn)行配置类缤,然后在pipeline調(diào)用臼勉。詳情參見下文 使用 libraries

3、Folder-level Shared Libraries

https://stackoverflow.com/questions/37800195/how-do-you-load-a-groovy-file-and-execute-it

或許有其他使用方法餐弱,如下范例是文件級(jí)別宴霸,并非目錄級(jí)別的共享庫(kù)囱晴。

范例

  • 創(chuàng)建測(cè)試groovy文件 /opt/jenkins_library_test/Tools.groovy
public class Demo {
    String message;
     
    Demo(String message) {
        this.message = message;
    }

    public void print(def script) {
        script.sh "echo " + message
    }
}

Demo createDemo(String message) {
    new Demo(message)
}

return this
  • 編輯pipeline script
    聲明式 pipeline 如下
pipeline {
    agent any

    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Demo stage') {
            steps {
                script {
                    Object lib = load '/opt/jenkins_library_test/Tools.groovy'
                    Object demo = lib.createDemo('a demo')
                    demo.print(this)
                }
            }
        }
    }
  }

腳本式pipeline 如下

node {
    stage('Hello') {
        echo 'Hello World'
    }
    stage('Demo stage') {
        script {
            Object lib = load '/opt/jenkins_library_test/Tools.groovy'
            Object demo = lib.createDemo('a demo')
            demo.print(this)
        }
    }
}
  • 執(zhí)行結(jié)果如下


    image.png

4、Automatic Shared Libraries

其他插件有更多動(dòng)態(tài)定義庫(kù)的方法瓢谢。如 Pipeline: GitHub Groovy Libraries 插件畸写,允許無(wú)需配置即可使用不可信任的庫(kù),比如github.com/someorg/somerepo氓扛。指定庫(kù)會(huì)以匿名 checkout 的方式 從 master 分支加載枯芬。

二、使用 libraries

1采郎、常規(guī)調(diào)用

Jenkinsfile 使用 @Library 標(biāo)識(shí)符千所,加 library 的名字,來(lái)進(jìn)行調(diào)用蒜埋。示例如下:

@Library('my-shared-library') _
/* Using a version specifier, such as branch, tag, etc */
@Library('my-shared-library@1.0') _
/* Accessing multiple libraries with one statement */
@Library(['my-shared-library', 'otherlib@abc1234']) _
@Library('somelib')
import com.mycorp.pipeline.somelib.UsefulClass

當(dāng)引用 class librarysrc/目錄)時(shí)淫痰,@注釋需要在 import語(yǔ)句上面
annotation 幫助文檔

對(duì)于只定義了全局變量 Global Variables (vars/) 的 Shared Libraries,或只需要全局變量的 Jenkinsfile整份, @Library('my-shared-library') _ 的注釋格式有助于保持代碼簡(jiǎn)潔待错。本質(zhì)上,是注釋 _烈评,而非不必要的 import 火俄。

不建議 import 全局變量/函數(shù),即便是實(shí)例础倍,這也會(huì)強(qiáng)迫編譯器將字段和方法解釋為 static ,這種情況下 Groovy compiler 會(huì)報(bào)錯(cuò)胎挎。

Libraries 在腳本執(zhí)行前的編譯過(guò)程被解析沟启、加載。這就允許 Groovy compiler 在靜態(tài)類型檢查時(shí)理解所使用符號(hào)的含義犹菇,并允許它們?cè)谀_本中的類型聲明中使用德迹,例如:

這允許Groovy編譯器理解靜態(tài)類型檢查中使用的符號(hào)的含義,并允許它們?cè)谀_本中的類型聲明中使用揭芍,例如:

@Library('somelib')
import com.mycorp.pipeline.somelib.Helper

int useSomeLib(Helper helper) {
    helper.prepare()
    return helper.count()
}

echo useSomeLib(new Helper('some text'))

Global Variables 在 runtime 中被解析胳搞。

2、動(dòng)態(tài)加載 Loading libraries dynamically

自插件 Pipeline: Shared Groovy Libraries 2.7 版本后称杨,有一種動(dòng)態(tài)加載library的方法(library step )肌毅。

官方描述不嚴(yán)謹(jǐn)。Pipeline: Shared Groovy Libraries 已退役姑原,代替以 Pipeline: Groovy Libraries悬而。
參見說(shuō)明文檔:https://plugins.jenkins.io/workflow-cps-global-lib/

library 'my-shared-library'

然后,腳本就可以訪問(wèn)該 library 中的任何全局變量了锭汛。

訪問(wèn) src/ 目錄下的 class 也可以笨奠,略麻煩袭蝗。@Library 在編譯前已經(jīng)設(shè)定好了 classpath,到library step的時(shí)候腳本已經(jīng)編譯完畢了般婆。因此到腥,不能importstatic類型引用。

但是蔚袍,您可以動(dòng)態(tài)地使用 library classes(不進(jìn)行類型檢查)乡范,通過(guò) library step 返回值中的完全限定名稱來(lái)訪問(wèn)。靜態(tài)方法可以通過(guò)類似Java的語(yǔ)法調(diào)用:

library('my-shared-library').com.mycorp.pipeline.Utils.someStaticMethod()

當(dāng)使用 new 的靜態(tài)方法時(shí)页响,也是可以訪問(wèn)靜態(tài)字段篓足,并調(diào)用構(gòu)造函數(shù)的:

def useSomeLib(helper) { // dynamic: cannot declare as Helper
    helper.prepare()
    return helper.count()
}

def lib = library('my-shared-library').com.mycorp.pipeline // preselect the package

echo useSomeLib(lib.Helper.new(lib.Constants.SOME_TEXT))

3、版本設(shè)定 Library versions

@Library('my-shared-library') _
@Library('my-shared-library@master') _
library 'my-shared-library@master'
library "my-shared-library@$BRANCH_NAME"

# 根據(jù)傳遞的參數(shù)設(shè)定版本
properties([parameters([string(name: 'LIB_VERSION', defaultValue: 'master')])])
library "my-shared-library@${params.LIB_VERSION}"

4闰蚕、獲取庫(kù)的方法 Retrieval Method

  • 使用 Modern SCM 栈拖,僅當(dāng)老版本不支持Shared Libraries的新特性時(shí)使用 Legacy SCM

Jenkins -- 系統(tǒng)管理 -- 系統(tǒng)配置 -- Global Pipeline Libraries

Sharable libraries available to any Pipeline jobs running on this system. These libraries will be trusted, meaning they run without “sandbox” restrictions and may use @Grab.

范例:
Name: cloudbee-sample-library
項(xiàng)目倉(cāng)庫(kù): https://github.com/darinpope/github-api-global-lib

如果library step指定了library名稱没陡,Jenkins將查找該名稱的預(yù)配置庫(kù)涩哟。
也可以指定動(dòng)態(tài)檢索方法,無(wú)需在Jenkins中預(yù)先配置盼玄。
如下范例:

library identifier: 'custom-lib@master', retriever: modernSCM(
  [$class: 'GitSCMSource',
   remote: 'git@git.mycorp.com:my-jenkins-utils.git',
   credentialsId: 'my-private-key'])

該方式必須指定版本
更多關(guān)于SCM的語(yǔ)法贴彼,參考 Pipeline Syntax

5、范例

配置 Global Share Libraries 如下:

Name: cloudbee-sample-library
項(xiàng)目倉(cāng)庫(kù): https://github.com/darinpope/github-api-global-lib

pipeline script

library 'cloudbee-sample-library'
node {
    stage('test') {
        helloWorld(name:"Darin", dayOfWeek:"Tuesday")
    }
}
image.png

修改如下

library 'cloudbee-sample-library@main'

這邊的分支是 main 埃儿, 不是 master器仗。繼續(xù)執(zhí)行,如圖童番。


image.png

三精钮、編寫 libraries

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市剃斧,隨后出現(xiàn)的幾起案子轨香,更是在濱河造成了極大的恐慌,老刑警劉巖幼东,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臂容,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡根蟹,警方通過(guò)查閱死者的電腦和手機(jī)脓杉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)简逮,“玉大人丽已,你說(shuō)我怎么就攤上這事÷蚓觯” “怎么了沛婴?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵吼畏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嘁灯,道長(zhǎng)泻蚊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任丑婿,我火速辦了婚禮性雄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羹奉。我一直安慰自己秒旋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布诀拭。 她就那樣靜靜地躺著迁筛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耕挨。 梳的紋絲不亂的頭發(fā)上细卧,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音筒占,去河邊找鬼贪庙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛翰苫,可吹牛的內(nèi)容都是我干的止邮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奏窑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼导披!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起良哲,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盛卡,失蹤者是張志新(化名)和其女友劉穎助隧,沒想到半個(gè)月后筑凫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡并村,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年巍实,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哩牍。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棚潦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膝昆,到底是詐尸還是另有隱情丸边,我是刑警寧澤叠必,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站妹窖,受9級(jí)特大地震影響纬朝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骄呼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一共苛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜓萄,春花似錦隅茎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至耻蛇,卻和暖如春踪蹬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背臣咖。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工跃捣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夺蛇。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓疚漆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親刁赦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子娶聘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容