自動化整合:Pipeline流水語法詳解

知了一笑發表於2021-12-21

前言:該系列文章,圍繞持續整合:Jenkins+Docker+K8S相關元件,實現自動化管理原始碼編譯、打包、映象構建、部署等操作;本篇文章主要描述Pipeline流水線用法

一、Webhook原理

Pipeline流水線任務通常情況下都是自動觸發的,在Git倉庫中配置原始碼改動後通知的地址即可。

例如在Gitee倉庫中,基於WebHook的配置,可以在向倉庫push程式碼後,自動回撥預先設定的請求地址,從而觸發程式碼更新後的打包動作,基本流程如下:

這裡涉及到兩個核心配置:

  • Gitee回撥:即倉庫接收到push請求後的通知地址;在倉庫管理的WebHooks選項中;
  • Jenkins流程:編寫流水線任務,處理程式碼提交後的自動化流程;這裡需要Jenkins地址可以在外網訪問,網上的元件很多,自行選擇搭建即可;

注意:可以先隨意設定回撥地址,在請求日誌中直接拷貝請求引數,在postman中去觸發Jenkins任務,這樣在測試時會方便很多。

這裡結合Gitee的幫助文件,去分析不同push動作的引數標識,可以判斷分支的建立、推送、刪除等操作,例如:

"after": "1c50471k92owjuh37dsadfs76ae06b79b6b66c57",
"before": "0000000000000000000000000000000000000000",

建立分支:before字元都是0;刪除分支:after字元都是0;

二、流水線配置

1、外掛安裝

在Jenkins外掛管理中,安裝Generic-Webhook-Trigger外掛,流水線pipeline相關元件在Jenkins初始化的時候已經安裝了。

2、建立流水線

新建Item,輸入任務名稱,選擇pipeline選項即可:

選擇Webhook選項,頁面提示了觸發的方式。

3、觸發流水線

http://使用者名稱:密碼@JENKINS_URL/generic-webhook-trigger/invoke

基於如上方式通過認證,觸發流水線執行,會生成任務日誌,即流程是通順的。

三、Pipeline語法

1、結構語法

  • triggers:基於hook模式觸發流水線任務;
  • environment:宣告全域性通用的環境變數;
  • stages:定義任務步驟,即流程分段處理;
  • post.always:最終執行的動作;

常規流程中的整體結構如下:

pipeline {
    agent any
    triggers {}
    environment {}
    stages {}
    post { always {}}
}

把各個節點下的指令碼配置進去,就會生成一個自動化的流水線任務。注意這裡不勾選使用Groovy沙盒選項。

2、引數解析

這裡說的引數解析是指,Gitee通過hook機制請求Jenkins服務攜帶的引數,這裡主要解析post引數即可,解析方式看說明:

這裡從hook回撥的引數中選了幾個流程中使用的引數,下面看具體解析方式,在上圖中點選新增:

{
    "ref":"refs/heads/master",
    "repository":{
        "name":"butte-auto-parent",
        "git_http_url":"倉庫地址-URL"
    },
    "head_commit":{
        "committer":{
            "user_name":"提交人名稱",
        }
    },
    "before":"277bf91ba85996da6c",
    "after":"178d56ae06b79b6b66c"
}

把上述引數依次做好配置即可,這樣在工作流中就可以使用這些引數。

3、觸發器節點

這裡即triggers模組配置,核心作用是載入觸發流程的一些引數,後續在指令碼中使用,其他相關配置按需選擇即可,注意這裡的引數需要在上個步驟中配置:

triggers {
    GenericTrigger(
        genericVariables: [
            [key: 'ref', value: '$.ref'],
            [key: 'repository_name', value: '$.repository.name'],
            [key: 'repository_git_url', value: '$.repository.git_http_url'],
            [key: 'committer_name', value: '$.head_commit.committer.user_name'],
            [key: 'before', value: '$.before'],
            [key: 'after', value: '$.after']
        ],
        // causeString: ' Triggered on $ref' ,
        // printContributedVariables: true,
        // 列印請求引數
        // printPostContent: true
    )
}

4、環境變數

宣告一些全域性的環境變數,也可以直接定義,在流程中用${變數}的方式引用:

environment {
    branch = env.ref.split("/")[2].trim()
    is_master_branch = "master".equals(branch)
    is_create_branch = env.before.replace('0','').trim().equals("")
    is_delete_branch = env.after.replace('0','').trim().equals("")
    is_success = false
}

這裡根據hook請求引數,解析出分支的操作型別:是否建立、是否刪除、是否主幹分支,以及定義一個is_success流程是否成功的標識。

5、分段流程

這裡主要分為五個步驟:解析資料、拉取分支、處理Pom檔案、分支推送、專案打包;

stages {
    // 解析倉庫資訊
    stage('Parse') {
        
        steps {
            echo "倉庫分支 : ${branch} \n倉庫名稱 : ${repository_name} \n倉庫地址 : ${repository_git_url} \n提交使用者 : ${committer_name}"
            script {
                if ("true".equals(is_master_branch)) {
                    echo "保護分支 : ${branch}"
                }
                if ("true".equals(is_create_branch)) {
                    echo "建立分支 : ${branch}"
                }
                if ("true".equals(is_delete_branch)) {
                    echo "刪除分支 : ${branch}"
                }
            }
        }
    }
        
    // 拉取倉庫分支
    stage('GitPull') {
        steps {
            script {
                if ("false".equals(is_delete_branch)) {
                    echo "拉取分支 : ${branch}"
                    git branch: "${branch}",url: "${repository_git_url}"
                }
            }
        }
    }
        
    // 解析倉庫Pom檔案
    stage('MvnPom') {
        steps {
            script {
                // 解析Pom檔案內容
                def pom = readMavenPom file: 'pom.xml'
                def version = "${pom.version}"
                def encode = pom.getProperties().get("project.build.sourceEncoding")
                echo "Pom版本 : "+ version
                echo "Pom編碼 : "+ encode
                def devVersion = "${branch}-"+version
                def jarName = "${branch}-"+version+".jar"
                echo "Now版本 : "+ devVersion
                echo "Jar名稱 : "+ jarName
                
                // 修改Pom檔案內容
                // pom.getProperties().put("dev.version","${devVersion}".trim().toString())
                // writeMavenPom file: 'pom.xml', model: pom
                
                echo "update pom success"
            }
        }
    }
        
    // 推送倉庫分支
    stage('GitPush') {
        steps {
            script {
                echo "git push success"
            }
        }
    }
        
    // 本地打包流程
    stage('Package') {
        steps {
            script {
                sh 'mvn clean package -Dmaven.test.skip=true'
                is_success = true
            }
        }
    }
}
  • 解析資料:解析並輸出部分引數資訊;
  • 拉取分支:結合Git命令,拉取分支程式碼;
  • 處理Pom檔案:對pom檔案的讀取和修改;
  • 分支推送:結合Git命令,推送分支程式碼;
  • 專案打包:結合Mvn命令,完成專案打包;

注意:這裡在本地測試流程時,並沒有推送程式碼;在專案打包完成後,結合shell指令碼完成服務的啟動釋出。

6、訊息通知

在流程的最後,識別任務的執行標識is_success,通知相關人員是否打包成功,這裡的通知方式可以選擇郵件或者其他API推送的通知型別,不過多描述:

post {
    always {
        script {
            echo "notify : ${committer_name} , pipeline is success : ${is_success}"
        }
    }
}

7、執行日誌

完成上面pipeline流水線指令碼開發後,通過postman工具不斷髮送請求,完成指令碼除錯:

這裡也可以點選流程裡的不同模組,檢視該模組下的日誌資訊:

說明:完整的pipeline指令碼內容放在末尾的Gitee開源倉庫中,有需要的自行獲取。


同系列推薦


四、原始碼地址

GitEE·地址
https://gitee.com/cicadasmile/butte-auto-parent
Wiki·地址
https://gitee.com/cicadasmile/butte-java-note

相關文章