快轉到主要內容

使用 Jenkinsfile 管理 Jenkins Pipeline

·2 分鐘
Ben Lai
作者
Ben Lai
畢業後,進入 devops 領域。目前擔任 SRE 工程師,專注於系統可靠性和自動化。喜歡探索新技術,並致力於提升系統性能和穩定性。
目錄

前言🔖
#

最近換到了新的工作環境,重回了 Jenkins 的懷抱。之前在舊公司使用 Jenkins 時,體驗很差,因為 Jenkins 要裝一堆插件,還要在 UI 上配置各種參數,讓人頭痛不已。在新公司中使用 Jenkinsfile 來管理 Jenkins Pipeline,這種方式讓我感覺非常棒,因為它讓我可以把 Jenkins 的配置寫成代碼,放在版本控制系統中,這樣就可以更好地管理和追蹤變更了。

這篇文章會著重在 Jenkinsfile 的各類常用語法使用,並且會提供一些實際的範例來說明如何使用 Jenkinsfile 來管理 Jenkins Pipeline。

Jenkinsfile 基礎語法📜
#

1️⃣變數
#

在 Jenkinsfile 中,可以使用 def 關鍵字來定義變數,例如:

def myVar = "Hello, Jenkins!"
def updateList = ["item1", "item2", "item3"]
def desc = new StringBuilder("This is a description.")

第一個變數 myVar 是一個字符串,第二個變數 updateList 是一個陣列,第三個變數 desc 是一個 StringBuilder 對象。StringBuilder 是 Java 中的一個類,可以用來創建可變的字符串。

2️⃣函數
#

在 Jenkinsfile 中,可以定義函數來封裝一些重複使用的邏輯,例如:

def deployToHost(String hostAddr, String sshUsername, List<String> sourceItems) {
    // 函數體
}

這個函數 deployToHost 接受三個參數:hostAddr 是主機地址,sshUsername 是 SSH 用戶名,sourceItems 是一個字符串列表,表示要部署的項目。

3️⃣pipeline 定義
#

接下來是整個自動化流程的定義,會使用 pipeline 關鍵字來定義整個 Jenkins Pipeline,例如:

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo 'Building...'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying...'
            }
        }
    }
}

這個範例定義了一個包含三個階段(Build、Test、Deploy)的 Jenkins Pipeline。在每個階段中,可以使用 steps 來定義具體的操作,例如使用 echo 來輸出信息。

agent any 表示這個 Pipeline 可以在任何可用的 Jenkins 節點上運行。

ℹ️補充說明:script 區塊必須要放在 steps 裡面,否則會報錯。

進階語法🛠
#

1️⃣結構化參數
#

在 Jenkins UI 中,可以配置參數化的構建選項,這些參數可以在 Jenkinsfile 中使用。但是如果同一個 Jenkinsfile 提供很多 Pipeline 引用,每個 Pipeline 都需要配置一大堆參數,會讓人覺得很麻煩。參考圖片(一):

“jenkinsfile 參數化構建選項”
jenkinsfile 參數化構建選項

為了解決這個問題,可以使用 parameters 區塊來定義結構化參數,例如:

pipeline {
    parameters {
        text(
          name: 'versions',
          defaultValue: 'S02:v0.0.1\nS03:v0.0.1',
          description: '遊戲版本列表,格式:遊戲代碼:版本號,每行一個'
        )
        choice(
          name: 'types',
          choices: ['gameservers', 'logics'],
          description: '單款遊戲或 gameServer 選擇'
        )
    }
}

2️⃣使用變數儲存 sh 執行結果
#

在 Jenkinsfile 中,可以使用 sh 步驟來執行 shell 命令,但有時候希望能將命令的輸出結果存儲到變數中,以便後續使用。可以使用 returnStdout: true 來實現這一點,例如:

def gitCommitHash = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()
echo "Current Git Commit Hash: ${gitCommitHash}"

相關文章