持續集成工具篇:Jenkins 與流水線管理【轉】

該文章,圍繞持續集成:Jenkins+Docker+K8S 相關組件,實現自動化管理源碼編譯、打包、鏡像構建、部署等操作;

一、Jenkins 安裝

1、環境部署

下載 Jenkins 包

java -jar jenkins.war --httpPort=8090

注意這裏直接下載 war 文件,以 Java 服務的形式啓動。

  • 環境:war 運行
  • 版本:2.289.3
  • 類型:Generic Java package (.war)

啓動命令

java -jar jenkins.war --httpPort=8090

啓動日誌

Jenkins is fully up and running

訪問本地端口:8090

該頁面會提示初始登錄密碼的位置,查看該文件中初始密碼,並完成登錄。

/.jenkins/secrets/initialAdminPassword

安裝推薦插件

登錄之後先把推薦的插件裝上。

創建用戶

插件安裝完成之後會提示創建用戶。

賬號:admin 密碼:admin

這樣初始化完成。

重新啓動:restart

Jenkins_url/restart

2、配置與插件

基礎配置

打開: Manage-Jenkins 選項,配置 Global-Tool-Configuration 選項:

  • 查看JDK安裝目錄
    /usr/libexec/java_home -V
  • 查看Git安裝目錄
    which git
  • 查看Maven安裝目錄
    mvn -v

配置組件:JDK、Git、Maven,採用開發環境的組件版本;

插件安裝

安裝如下插件:

1、Maven插件 Maven Integration plugin

2、Pipeline插件 Pipeline Utility Steps

二、本地 Git 打包

簡介:基於 Jenkins 完成本地的 Git 倉庫項目打包;

1、新建 Item

  • 任務名稱:MavLoc,處理本地 maven 工程;
  • 任務類型:選擇構建 maven 項目;

2、構建記錄管理

保持構建的天數:3 天,保持構建的最大個數:10 個;

3、構建過程

前置 Pre-Steps 步驟,這裏執行一次 maven 版本查看:

構建 Build 步驟,這裏直接寫項目的 pom 路徑,注意執行的 maven 命令:

clean package -Dmaven.test.skip=true

後置 Post Steps 步驟,注意選擇構建成功後才執行,自行忽略這裏 shell 語法的不入流組合:

4、執行構建

上述配置完成後,打開任務頁面,執行如下操作:

  • Build Now:執行上面的構建任務;
  • 構建 #ID:查看控制檯輸出的日誌;

這樣就可以通過 jenkins 完成本地項目的打包和啓動了。

三、API 觸發任務

1、用戶令牌

簡介:通過配置用戶 API 訪問的 token 令牌,脫離 jenkins 控制檯,直接觸發構建任務;

進入用戶面板的設置選項,配置 API Token :

注意這裏生成令牌後要立刻複製下來,頁面會提示 token 無法復現。

2、任務令牌

任務配置的構建觸發器模塊,設置遠程構建的令牌:

上面已經給到 token 的使用方式。

3、腳本觸發

通過如下方式,直接觸發上述構建任務的流程:

curl http://用戶:令牌@Jenkins_Url/job / MavLoc / build?token=任務令牌

這裏通過腳本直接請求 URL 的方式觸發流程。

四、打包 Git 項目

1、配置倉庫

創建 MavGit 任務,這裏不做過多的配置,與本地倉庫相比,只是把倉庫地址換成 Gitee 地址,只配置倉庫 url 和分支即可,其他採用默認:

因爲是開放的倉庫地址,所以不用配置賬號密碼,默認指定 master 分支,然後執行 build 構建。

2、查看空間

上面流程執行完後,查看 MavGit 的工作空間: /.jenkins/workspace/MavGit :

這裏可以明顯發現,倉庫的代碼已經被 pull 下來,並且完成了自動打包流程,後續結合 shell 腳本完成 jar 啓動管理即可。

五、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

原文鏈接:

http://www.uml.org.cn/jchgj/202203221.asp

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