Jenkins流水線即代碼之擴展共享庫初體驗

簡介

在這裏插入圖片描述
Jenkin的多分支流水線,允許Jenkinsfile與需要 Jenkins 構建的應用程序代碼放在一起,然後 Jenkins 從源代碼管理系統中檢出 Jenkinsfile 文件作爲流水線項目構建過程的一部分並接着執行你的流水線。

Jenkins這種構建方式正是“誰構建,誰運行”DevOps理念的一種體現。

由於流水線代碼(特別是腳本式流水線)是使用類似 Groovy 的語法編寫的,因此我們要想學習需要了解Groovy的語法。

目錄結構

共享庫的目錄結構如下:

(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
  1. src 目錄應該看起來像標準的 Java 源目錄結構。當執行流水線時,該目錄被添加到類路徑下。
  2. vars 目錄定義可從流水線訪問的全局變量的腳本。 每個 *.groovy 文件的基名應該是一個 Groovy (~ Java) 標識符, 通常是 camelCased。 匹配 *.txt, 如果存在, 可以包含文檔, 通過系統的配置標記格式化從處理 (所以可能是 HTML, Markdown 等,雖然 txt 擴展是必需的)。
  3. resources 目錄允許從外部庫中使用 libraryResource 步驟來加載有關的非 Groovy 文件。 目前,內部庫不支持該特性。

注意:初次使用src、resources目錄可以爲空,我們可以在vars中定義腳本,使用call方法實現功能。

全局共享庫

Manage Jenkins » Configure System » Global Pipeline Libraries 可以配置許多全局共享庫。

系統中的任何流水線都可以使用這些庫中實現的功能。
在這裏插入圖片描述

使用類庫

標記爲 Load implicitly 的共享庫允許流水線立即使用任何此庫定義的類或全局變量。爲了訪問其他共享庫, Jenkinsfile 需要使用 @Library 註解。
在這裏插入圖片描述在此我們將共享庫託管在git上,在jenkins中設置如下:

  • 使用“shared-library”命名
  • 默認使用master分支調用

Jenkinsfile 需要使用 @Library 註解, 指定庫的名字:

#調用共享庫的默認master分支
@Library('my-shared-library') _
#使用test分直的共享庫,也可使用tag等區分
@Library('my-shared-library@test') _

部署使用

1.定義pipeline共享庫

└── pipeline-shared-library
    ├── README.en.md
    ├── README.md
    ├── resources
    ├── src
    └── vars
        └── helloworld.groovy

由於初步使用,resources和src我們都只保留項目結構,但設置爲空;只在vars中設置腳本即可,並定義call方法,通過允許訪問全局變量實現相關功能。

#遵循groovy語法
cat vars/helloworld.groovy 
def call(String s = "groovy") {
    echo "Hello, $s."
}

2.流水線調用

在項目中定義Jenkinsfile文件,通過聲明式流水線調用共享庫。

其中需要使用“@Library(‘shared-library’) _”來引入共享庫。

#cat Jenkinsfile
@Library('shared-library') _

pipeline {
    options {
        ansiColor('xterm')
        timestamps()
    }
    agent {
        label 'docker-slave-java'
    }

    stages {
        stage('test測試') {
            when {}
            steps {
              
                script {
                    println "import shared-library"
                    result = helloworld 'test'
                    println result
                }
            }
        }
    post {
        unstable {
            emailext (
                body: """項目名稱:${JOB_NAME}\n構建編號:${BUILD_NUMBER}\n構建日誌:${BUILD_URL}console""",
                subject: '【Jenkins構建通知】:$JOB_NAME - Build # $BUILD_NUMBER - Unstable!',
                to: '[email protected]',
                from: '[email protected]'
            )   
        }   
        success {
            emailext (
                body: """項目名稱:${JOB_NAME}\n構建編號:${BUILD_NUMBER}\n構建日誌:${BUILD_URL}console""",
                subject: '【Jenkins構建通知】:$JOB_NAME - Build # $BUILD_NUMBER - Successful!',
                to: '[email protected]',
                from: '[email protected]'
            )   
        }   
        failure {
            emailext (
                body: """項目名稱:${JOB_NAME}\n構建編號:${BUILD_NUMBER}\n構建日誌:${BUILD_URL}console""",
                subject: '【Jenkins構建通知】:$JOB_NAME - Build # $BUILD_NUMBER - Failure!',
                to: '[email protected]',
                from: '[email protected]'
            )   
        }   
    }
  }

應用項目在jenkins上使用多分支流水線,通過when當test分支更新時,“測試環境部署”步驟才執行,最後將構建結果以郵件的形式通知。

注意:聲明式流水線不允許在script指令之外使用全局變量。

3.執行過程

通過多分支流水線,可以將項目的多個分支在同一個jenkins任務中管理,避免了一個分支對應一個任務。如下圖所示:docker-test-java3項目,分master/test/develop分支分別管理。
在這裏插入圖片描述如下圖所示,在流水線中“測試環境部署”中的操作已經調用共享庫方法,打印出對應消息。
在這裏插入圖片描述
注意:在流水線構建任務中,BlueOcean 可以引導用戶通過直觀的、可視化的過程來創建Pipeline,從而使Pipeline的創建更加簡單。而且Blue Ocean 與普通界面相比,屏蔽了部分輸出,只展示 Pipeline中需要關注的地方, 簡化異常處理。

總結

Jenkins擴展共享庫是真正意義上的流水線即代碼,通過共享庫可以實現多個項目之間共享流水線,有助於減少冗餘並保持代碼乾淨整潔。

在CI/CD過程中,引入擴展共享庫使管理過程更加靈活,重新定義了運維和開發之前的協作方式。但是groovy對於運維人員上手操作需要一定時間,而對於java開發人員卻是天作之合。也正是這個原因,我也是對擴展共享庫做了簡單的介紹,更高級的使用需深入研究。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章