Jenkins 將交付工作協調為工作與 Pipeline。請將 Pipeline 儲存在具版本控制的 Jenkinsfile 中,因為建置邏輯、應用程式程式碼與工具版本必須遵循同一套檢閱流程變更。
控制器、代理程式與工作區 #
控制器儲存設定與建置記錄、評估排程決策、提供使用者介面並協調代理程式。建置不應在控制器上執行。代理程式提供一個或多個執行器;每個執行器一次只能佔用一項 Pipeline 工作。標籤描述 linux、arm64 或 docker 等能力,而 Pipeline 的 agent 選取會限制其工作區配置位置。
工作區是可變的簽出與建置狀態,不是成品儲存庫。並行建置可以收到不同的工作區路徑,而短暫代理程式可能在階段結束後消失。使用 archiveArtifacts 發佈輸出,使用 stash 與 unstash 在階段間傳輸小檔案,或將發行成品上傳至專用儲存庫。不要依賴先前建置留下的檔案。
代理程式只應具備其標籤所需的工具、網路路徑與認證資訊。短暫代理程式可以降低不同建置間的污染,但可重現的建置仍需要固定容器映像檔、工具鏈、外掛程式與相依性輸入。
宣告式與腳本式 Pipeline #
宣告式 Pipeline 在 pipeline、agent、stages、steps、environment、options 與 post 周圍提供經驗證的結構。腳本式 Pipeline 在 node 與其他 Pipeline 步驟中使用 Groovy 控制流程。宣告式的 script { ... } 可以包含命令式區段,但大型腳本區域會捨棄宣告式驗證與階段語意。請將可重用政策放在具版本控制的共用函式庫,而不是在儲存庫間複製 Groovy。
pipeline {
agent { label 'linux && container' }
options {
timeout(time: 20, unit: 'MINUTES')
disableConcurrentBuilds()
}
stages {
stage('Test') {
steps {
retry(2) {
sh './mvnw --batch-mode verify'
}
}
post {
always { junit 'target/surefire-reports/*.xml' }
}
}
stage('Package') {
steps {
sh './mvnw --batch-mode package -DskipTests'
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
}
}
}
post {
always { deleteDir() }
}
}Pipeline 步驟會持久化執行狀態,使持久工作能在控制器重新啟動後繼續,但外部命令必須能安全地重新啟動。使用 timeout 限制卡住的工作,並只對已知具有冪等性的操作使用 retry。部署重試可能重複副作用。當分支不會修改同一工作區或外部資源時,parallel 可降低延遲;需要隔離時,請使用獨立工作區或代理程式。
認證資訊與最低權限 #
將祕密儲存在 Jenkins 認證中,並在最小可能範圍內繫結它們:
withCredentials([file(credentialsId: 'registry-token-file',
variable: 'REGISTRY_TOKEN_FILE')]) {
sh 'registry-client --token-file "$REGISTRY_TOKEN_FILE"'
}遮罩可降低記錄意外揭露的機率;它無法保護祕密免於同一範圍內執行的不受信任建置程式碼。避免對字串祕密使用 Groovy 插值,因為遮罩前該值可能進入程序引數或 Jenkins 產生的腳本。檔案認證提供暫時受保護的檔案,但同一建置情境中的不受信任程式碼仍可讀取它。依資料夾限制認證 ID,將不受信任的提取請求與部署工作隔離,並為代理程式授予單一環境的短期認證。
操作 Pipeline #
使用多分支工作或受信任的 webhook,將執行關聯至精確提交。依保留政策保存測試報告與不可變成品。即使階段失敗,也要設定 post 動作以進行清理與通知。使用驗證與授權保護控制器,將外掛程式更新視為控制器程式碼進行檢閱,備份 JENKINS_HOME,並讓建置代理程式位於控制器信任邊界之外。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)