我在不同的存储库中有很多项目,它们共享相同的基本CI工作流程,我可以轻松地将其表达为声明性管道:
pipeline {
agent any
options {
buildDiscarder(logRotator(numToKeepStr: '20'))
}
stages {
stage('CI') {
steps {
echo 'Do CI'
}
}
stage('QA') {
steps {
echo 'Do QA'
}
}
}
post {
always {
junit allowEmptyResults: true, testResults: '**/target/surefire-reports/TEST-*.xml'
// etc...
}
failure {
echo 'Failure mail'
// etc
}
}
}
我想在我的所有项目中使用相同的声明管道,并且能够在一个地方更改管道的定义,并自动在所有项目中使用更改。
基本上我在项目中会做什么; Jenkins文件是这样的:
loadPipelineFromScm 'repository', 'pipeline.groovy'
我已经可以使用共享库执行此操作,但之后我无法再使用Declarative Pipeline功能。
有没有办法在多个存储库之间共享声明性管道?
答案 0 :(得分:1)
虽然使用noober01的建议保持视图完整,但声明性管道将无法正常运行。例如。 when子句将被忽略,因为管道元素应该是顶级的,这意味着它被解析为脚本管道。
请参阅Jenkins背后的团队拒绝的以下问题:loading external declarative pipelines issue
答案 1 :(得分:0)
我一直在为自己的工作处理同样的问题。我能提出的最佳解决方案是在我的组织的每个项目/仓库中包含泛型 Jenkins文件:
node
{
checkout([$class: 'GitSCM', branches: [[name: env.DELIVERY_PIPELINE_BRANCH]], userRemoteConfigs: [[credentialsId: env.DELIVERY_PIPELINE_CREDENTIALS, url: env.DELIVERY_PIPELINE_URL]]])
stash includes: '*.groovy', name: 'assets', useDefaultExcludes: false
load './Jenkinsfile.groovy'
}
我使用环境变量以防万一需要改变,可能比我的示例当前更加动态(这仍然在开发中)。
然后stash用于保存稍后使用的其余groovy脚本,并在声明性管道中取消它们。
最后加载声明性管道。不搞乱意见,基本上一切都表现正常。
所以这并不是你想要的,我宁愿有能力从SCM开始。但是,嘿,它暂时对我来说运作得很好。
答案 2 :(得分:0)
我能够使用共享库定义可通过YAML文件配置的声明性管道。
在我的repo/project
中,我定义了一个Jenkinsfile
来调用共享库:
@Library('my-shared-library')_
pipelineDefault(); // cannot be named 'pipeline'
和Jenkinsfile.yaml
来配置构建参数:
project_name: my_project
debug: true
# you get the idea
然后在我的vars/pipelineDefault.groovy
文件中,一个非常简单的共享库可能看起来像这样:
def call() {
Map pipelineConfig = readYaml(file: "${WORKSPACE}/Jenkinsfile.yaml }")
node {
stage('Build'){
println "Building: ${pipelineConfig.project_name}"
}
}
}
这当然是一个非常简化的示例,但是动态配置确实有效。
注意:这需要pipeline-utility-steps插件才能读取YAML文件