當團隊內的專案數量從 5 個增長到 50 個甚至更多時,如果每個專案都維護一份獨立且重複的 Jenkinsfile,將會演變成一場Operation 災難。
任何掃描規則的微調或通知地址的變更,都需要修改幾十個儲存庫。本篇將介紹如何透過 Jenkins Shared Library 實現「Don't Repeat Yourself (DRY)」原則。
Shared Library 就像是 CI/CD 流程的「軟體 SDK」。我們將通用的邏輯(如 SonarQube 掃描、通知發送、Vault 密鑰調度)封裝在一個獨立的 Git 儲存庫中。專案方的 Jenkinsfile 只需要簡單地「調用」這些標準化的函數,無需關心具體的實作細節。
建立一個名為 my-shared-library 的專案,其結構遵循 Jenkins 的官方規範:
my-shared-library/
├── vars/ # 存放全域變數與自定義 DSL (Domain Specific Language)
│ ├── project.groovy # 管理專案元數據
│ └── sonarScan.groovy # 封裝掃描指令
├── src/ # 存放複雜的 Groovy 類別與邏輯 (物件導向)
│ └── com/example/Utils.groovy
└── resources/ # 存放非 Groovy 檔案(如 SQL, JSON 模板)
在 vars/ 目錄下的每個 .groovy 檔案都會變成一個全域指令。
例如 vars/sonarScan.groovy:
def call(Map config) {
def sqScanner = tool 'SonarQube MSBuild Scanner'
withSonarQubeEnv('SonarQube') {
sh "${sqScanner}/SonarScanner.MSBuild.exe begin /k:\"${config.key}\""
sh "dotnet build ${config.solution}"
sh "${sqScanner}/SonarScanner.MSBuild.exe end"
}
}
Manage Jenkins -> System。common-pipeline-library (供 Pipeline 引用)。main。Modern SCM -> Git (指向您的 GitLab 儲存庫)。在專案的 Jenkinsfile 最上方引入:
// '@Library' 後方的 '_' 是一個特殊的語法,代表立即載入該庫的所有全域變數
@Library('common-pipeline-library') _
pipeline {
agent { label 'dotnet' }
stages {
stage('Quality Analysis') {
steps {
script {
// 直接調用 Shared Library 中的指令,不需在地端重複寫邏輯
sonarScan(key: 'project-portal-app', solution: 'ProjectPortal.sln')
}
}
}
}
}
在 AI 生成程式碼的趨勢下,專案的產出速度極快。透過 Shared Library,架構師可以快速定義一套「標準 SOP」。無論 AI 生成了多少個微服務,只要它們引用了這套 Library,就自動具備了符合公司規範的安全性檢查與部署邏輯,從源頭解決了碎片化的問題。
Shared Library 是規模化 CI/CD 的基本架構。它減少了冗餘,同時也提供了一個「集中化管理」的窗口。下一步,我們將討論如何在這些共用函式中,安全地整合 HashiCorp Vault 來管理跨專案的敏感資訊。