Jenkins 自動上Tag

Jenkins 自動上Tag

在軟體開發過程中,版本控制是至關重要的。為了更有效地管理代碼版本並追蹤特定的發布點或重要更改,我們經常需要在特定的分支上自動添加標籤(tag)。這種做法不僅有助於追蹤代碼的演進,還便於在不同版本間進行比對和回溯。

自動化標籤過程可以大大提高開發團隊的效率,減少人為錯誤,並確保版本標記的一致性。通過在持續集成/持續部署(CI/CD)流程中集成自動標籤功能,我們可以:

  1. 快速識別特定版本的代碼狀態
  2. 簡化版本發布和部署流程
  3. 提供清晰的版本歷史,便於代碼審查和問題追蹤
  4. 在需要時輕鬆回滾到特定版本

本文將介紹如何在 Jenkins Pipeline 中實現自動標籤功能,特別針對不同的分支(如測試分支和主分支)應用不同的標籤策略。通過這種方法,我們可以為軟體開發流程增添一層精確的版本控制,從而提高整個開發過程的可追蹤性和可管理性。


請先準備以下事前準備

  1. Jenkins Plug Install

Plug Name : Pipeline Utility Steps (該插件能讓Jenkins 讀取json 文件 並解析取值)

2. 設定 Jenkins Credentials

3. 使用 Jenkins multibranch-pipeline


  1. Jenkins Plug Install

首頁-> 管理Jenkins -> Plugins

搜尋 Pipeline Utility Steps 並安裝 重啟Jenkins 。

2. 設定 Jenkins Credentials

首頁-> 管理Jenkins -> Credentials

設定 gitlab or github 帳號密碼,該範例使用 gitlab ,創建後會取得 ID 請記得該串ID 等下會用到,給予Jenkins 有權限拉取git。

3. 使用 Jenkins multibranch-pipeline

創建該模式的 pipeline 後 , 先在專案內新增一個檔案 jenkinsfilepackage.json ,這兩個檔案的用途分別會在以下進行說明。

// package.json  
// 用於記錄版本號碼,讓jekins 自動讀取 並打上tag  
 
{ 
  "version": "0.0.9", 
}
// jenkinsfile 
// 該腳本內容:會先判斷 當前目錄是否有package.json 並撈取裡面的version  
// 判斷分支 若是 test or master 時 將會自動帶入 版本號-分支 
 
 
// 將創建的 credentialsId全局參數 設定剛剛在Jenkins創建的ID 
def credentialsId = "08306b20-9025-449e-a5a0-0c7ec6f76005" 
 
pipeline { 
    agent any 
 
    stages{ 
        stage('auto tag'){ 
            steps{ 
                script{ 
                    // 定義函數 
                    def createAndPushTag = { version, branch -> 
                        withCredentials([usernamePassword(credentialsId: "${credentialsId}", passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) { 
                            sh """ 
                                git config user.email '[email protected]' 
                                git config user.name 'Jenkins' 
                                git tag -a v${version}-${branch} -m 'Version ${version}-${branch}' 
                                git push https://${GIT_USERNAME}:${GIT_PASSWORD}@\${GIT_URL#https://} v${version}-${branch} 
                            """ 
                        } 
                    } 
 
                    if (fileExists('package.json')) { 
                        def packageJson = readJSON file: 'package.json' 
                        def version = packageJson.version 
 
                        // 判斷分支,如果是以下分支 就讀取package.json 並打上tag  
                       switch(env.BRANCH_NAME) { 
                            case 'test': 
                                createAndPushTag(version, 'test') 
                                break 
                            case 'master': 
                                createAndPushTag(version, 'master') 
                                break 
                            default: 
                                echo "No tagging for branch ${env.BRANCH_NAME}" 
                        } 
                    } 
                } 
            } 
        } 
    } 
}