我在gitlab上有10个存储库。通过电子书,我可以触发詹金斯的工作。现在我有一个Jenkins管道作业,它将使用存储库中的jenkinsfile。当另一个存储库将触发此作业时,将始终使用已配置的存储库。我如何以这种方式配置Jenkins,我只有一个或两个Jenkins作业,可以处理多个存储库,但只会构建触发Jenkins作业的存储库。
答案 0 :(得分:3)
您要求CI / CD反模式。在考虑在多个存储库之间共享相同的Jenkins作业时,您必须注意多个问题,例如。
相反,最好使用Jenkins' Pipeline as a Code方法,每个存储库都有自己的Jenkinsfile
,每个存储库都有一个指向存储库Jenkinsfile
的专用作业。您可以并行构建所有存储库,每个存储库都有一个干净的历史记录,如果需要,您可以为每个管道定义自定义步骤。
如果要为所有存储库指定公共基础,并且希望将其放在一个位置,请考虑extending your pipeline with shared libraries。这在实践中意味着什么?您可以按文档中的描述定义库脚本,例如
乏/ standardBuild.groovy
// See https://github.com/jenkinsci/workflow-cps-global-lib-plugin
// The call(body) method in any file in workflowLibs.git/vars is exposed as a
// method with the same name as the file.
def call(body) {
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
body()
node {
stage('checkout') {
checkout scm
}
stage('main') {
docker.image(config.environment).inside {
sh config.mainScript
}
}
stage('post') {
sh config.postScript
}
}
}
然后你的Jenkinsfile使用standardBuild
函数(它使用相同的名称作为脚本名称):
#!groovy
// Loads the standardBuild function/step from workflowLibs.git/vars/standardBuild.groovy
// and invokes it.
standardBuild {
environment = 'golang:1.5.0'
mainScript = '''
go version
go build -v hello-world.go
'''
postScript = '''
ls -l
./hello-world
'''
来源:https://github.com/jenkinsci/pipeline-examples/tree/master/global-library-examples/global-function
这种方法允许您在所有作业之间共享共同行为,并且在必须在单个管道中实现自定义特定内容时仍然可以自由地使用。
结论 - 不要遵循反模式。这可能听起来像是一个很好的解决方案(在多个存储库中单独工作在理论上需要较少的工作量),但事实并非如此。它会导致多个问题,阻止您进行扩展,并使CI / CD管道在从CI服务器接收快速反馈时无用。