如何在Jenkins共享库中统一配置所有流水线的通用选项?
统一Jenkins流水线Options的共享库实现方案
方案1:封装全局流水线入口函数
这是最直接的解决方案——在共享库中定义一个包含所有通用options的流水线模板函数,各个仓库的Jenkinsfile只需调用该函数并传入自定义流水线逻辑即可。
共享库实现(vars/pipelineWithDefaults.groovy)
def call(Map config = [:], Closure body) { pipeline { agent any options { // 集中配置所有通用选项 disableConcurrentBuilds() parallelsAlwaysFailFast() buildDiscarder(logRotator(numToKeepStr: '10')) timestamps() timeout(time: 45, unit: 'MINUTES') } stages { // 执行用户自定义的流水线阶段 body() } // 统一添加全局后置步骤 post { always { echo "流水线执行完成,构建编号: ${currentBuild.number}" } } } }
业务仓库Jenkinsfile调用
@Library('your-shared-library-name') _ pipelineWithDefaults { stage('单元测试') { steps { sh './gradlew test' } } stage('Docker构建') { steps { sh 'docker build -t ${IMAGE_NAME}:${BUILD_TAG} .' } } }
优势:修改通用options时只需更新共享库中的模板,所有流水线自动同步;新增流水线无需复制粘贴配置,直接调用函数即可。
方案2:提取通用Options为独立函数(支持灵活扩展)
如果部分流水线需要在通用配置基础上添加自定义options,可以把通用选项封装成独立函数,在Jenkinsfile中按需引入。
共享库实现(vars/commonPipelineOptions.groovy)
def call() { return [ disableConcurrentBuilds(), parallelsAlwaysFailFast(), buildDiscarder(logRotator(numToKeepStr: '10')), timestamps() ] }
业务仓库Jenkinsfile调用
@Library('your-shared-library-name') _ pipeline { agent any options { // 引入通用选项 commonPipelineOptions() // 添加当前流水线特有的配置 timeout(time: 60, unit: 'MINUTES') quietPeriod(5) } stages { stage('集成测试') { steps { sh './run-integration-tests.sh' } } } }
优势:既保留了通用配置的统一性,又允许单个流水线灵活扩展特有选项,适合混合场景。
方案3:全局变量自动注入(进阶场景)
如果希望完全隐藏通用配置的实现细节,可以通过共享库的全局变量机制实现自动注入,但需要注意Jenkins的类路径配置,适合复杂的全局管控需求。
共享库实现(src/com/yourcompany/jenkins/DefaultOptions.groovy)
package com.yourcompany.jenkins import org.jenkinsci.plugins.workflow.cps.CpsScript class DefaultOptions implements Serializable { private final CpsScript script DefaultOptions(CpsScript script) { this.script = script } def apply() { script.options { disableConcurrentBuilds() parallelsAlwaysFailFast() buildDiscarder(logRotator(numToKeepStr: '10')) timestamps() } } }
配套入口函数(vars/initPipeline.groovy)
def call(Closure body) { def defaultOpts = new com.yourcompany.jenkins.DefaultOptions(this) pipeline { agent any options { defaultOpts.apply() } stages { body() } } }
业务仓库Jenkinsfile调用
@Library('your-shared-library-name') _ initPipeline { stage('代码扫描') { steps { sh 'sonar-scanner' } } }
优势:通用配置完全封装在共享库内部,业务侧无需关注实现细节;但实现复杂度较高,适合有统一管控需求的大型团队。
注意事项
- 修改共享库后,确保Jenkins加载最新版本(可在共享库配置中开启"Load implicitly"或手动刷新)。
- 后续新增流水线只需引入共享库并调用对应入口函数,无需重复编写
options配置。 - 修改通用配置时,仅需走共享库的内部评审流程,无需逐个修改业务仓库的Jenkinsfile,彻底消除重复维护成本。
内容的提问来源于stack exchange,提问作者cyau
相关产品推荐
相关产品推荐

