Jenkins多环境流水线封装为共享库传参报错:仅允许一个pipeline块
问题:如何将多环境Jenkins流水线封装为共享库并传入参数?
我有两个分别用于生产环境和开发环境的代码仓库,二者的Jenkins流水线代码仅开头四个变量的值不同。我希望将流水线编写为共享库,从仓库中调用并传入变量作为参数,请问是否可行?
我的尝试代码
共享库文件 pipelineDeployBq2bq.groovy
def call(Map variable1, Map variable2, Map variable3, Map variable4){ … pipeline{ ... } }
仓库中的 Jenkinsfile
pipeline { agent { kubernetes { label "xxxxxx" yamlFile 'xxxxxx' } } environment { PROJECT_TYPE = xxxxxxx } stages { stage('Stage 1') { steps { pipelineDeployBq2bq(prfBuckets, environmentProjects, pubSubByEnvironment, composerTags) } } }//End stages }//End pipelines
遇到的错误
Only one pipeline { ... } block can be executed in a single run.
解决方案
你遇到的错误是因为在一个Jenkins运行实例中只能存在一个pipeline{}块——你的Jenkinsfile里已经定义了顶层的pipeline{},而共享库的函数内部又嵌套了另一个pipeline{},这就触发了冲突。
要实现多环境流水线复用,有两种可行的调整方案:
方案1:共享库作为完整流水线入口
把整个流水线逻辑(包括代理、环境、阶段)都封装到共享库中,通过参数传递不同环境的变量:
修改共享库文件 pipelineDeployBq2bq.groovy:
def call(Map config) { pipeline { agent { kubernetes { label "xxxxxx" yamlFile 'xxxxxx' } } environment { PROJECT_TYPE = config.projectType PRF_BUCKETS = config.prfBuckets ENV_PROJECTS = config.environmentProjects PUB_SUB = config.pubSubByEnvironment COMPOSER_TAGS = config.composerTags } stages { // 这里编写原本的流水线阶段逻辑,直接使用上述环境变量 stage('Deploy') { steps { echo "开始部署,使用存储桶:${PRF_BUCKETS}" // 执行具体的部署操作 } } } } }
然后在仓库的Jenkinsfile中直接调用共享库函数,无需自己定义pipeline{}:
pipelineDeployBq2bq([ projectType: "xxxxxx", prfBuckets: prfBuckets, environmentProjects: environmentProjects, pubSubByEnvironment: pubSubByEnvironment, composerTags: composerTags ])
方案2:共享库封装复用的阶段逻辑
如果希望保留仓库Jenkinsfile中的代理、环境配置,只复用核心阶段逻辑,可以把共享库设计为阶段级别的函数:
修改共享库文件 pipelineDeployBq2bq.groovy:
def call(Map config) { // 封装原本流水线中的阶段逻辑 stage('部署BQ2BQ') { steps { echo "部署参数:${config}" // 执行具体的部署命令 } } }
然后在仓库的Jenkinsfile中,在stages内通过script块调用该共享库函数:
pipeline { agent { kubernetes { label "xxxxxx" yamlFile 'xxxxxx' } } environment { PROJECT_TYPE = xxxxxxx } stages { stage('Stage 1') { steps { script { pipelineDeployBq2bq([ prfBuckets: prfBuckets, environmentProjects: environmentProjects, pubSubByEnvironment: pubSubByEnvironment, composerTags: composerTags ]) } } } } }
这两种方案都能避免多个pipeline{}块的冲突,同时实现多环境流水线的代码复用。
内容的提问来源于stack exchange,提问作者Luis Fernando Alzate Urrea
相关产品推荐
相关产品推荐

