我有几个管道作业,配置非常相似。 它们都有相同的阶段(其中大约有10个阶段)。
我现在正在考虑转移到声明性管道(https://jenkins.io/blog/2016/09/19/blueocean-beta-declarative-pipeline-pipeline-editor/)。
但我不想在每个管道中定义~10个阶段。我想在一个地方定义它们,并以某种方式“导入”它们。
这是否可以使用声明性管道?我看到有库,但似乎我不能使用它们包含舞台定义。
答案 0 :(得分:1)
您将必须创建一个共享库来实现我将要建议的内容。对于共享库实施,您可以查看以下文章:
Using Building Blocks in Jenkins Declarative Pipeline
Upload file in Jenkins input step to workspace(主要用于图像,这样一来,人们就可以轻松找出问题所在)
现在,如果您想使用一个Jenkinsfile(一种 template ),可以在多个项目(工作)中重用实际上是 。
一旦您创建了一个带有vars
目录的共享库存储库,则只需在vars
目录内创建一个Groovy文件(例如commonPipeline.groovy)。
这是一个有效的示例,因为我早些时候在多个作业中使用了它。
$ cat shared-lib/vars/commonPipeline.groovy
// You can create function(s) as shown below, if required
def someFunctionA() {
// Your code
}
// This is where you will define all the stages that you want
// to run as a whole in multiple projects (jobs)
def call(Map config) {
pipeline {
agent {
node { label 'slaveA || slaveB' }
}
environment {
myvar_Y = 'apple'
myvar_Z = 'orange'
}
stages {
stage('Checkout') {
steps {
deleteDir()
checkout scm
}
}
stage ('Build') {
steps {
script {
check_something = someFunctionA()
if (check_something) {
echo "Build!"
# your_build_code
} else {
error "Something bad happened! Exiting..."
}
}
}
}
stage ('Test') {
steps {
echo "Running tests..."
// your_test_code
}
}
stage ('Deploy') {
steps {
script {
sh '''
# your_deploy_code
'''
}
}
}
}
post {
failure {
sh '''
# anything_you_need_to_perform_in_failure_step
'''
}
success {
sh '''
# anything_you_need_to_perform_in_success_step
'''
}
}
}
}
有了上述Groovy文件,您现在要做的就是在您的各个Jenkins项目中调用它。由于您的Jenkins项目中可能已经有一个现有的Jenkins文件(如果没有,请创建它),因此您只需用以下内容替换该文件的现有内容:
$ cat Jenkinsfile
// Assuming you have named your shared-library as `my-shared-lib` & `Default version` to `master` branch in
// `Manage Jenkins` » `Configure System` » `Global Pipeline Libraries` section
@Library('my-shared-lib@master')_
def params = [:]
params=[
jenkins_var: "${env.JOB_BASE_NAME}",
]
commonPipeline params
注意:如您在上面看到的,我正在调用commonPipeline.groovy
文件。因此,您所有庞大的Jenkinsfile文件都将减少为仅五或六行代码,而这几行代码在所有这些项目中也将是 common 。另请注意,我已经在上面使用过jenkins_var
。它可以是任何名称。它实际上并没有使用,但是 是管道运行所必需的。一些Groovy专家可以澄清这一部分。
参考:https://www.jenkins.io/blog/2017/10/02/pipeline-templates-with-shared-libraries/