如何在声明性管道中获取下游作业的build_number?

时间:2017-07-28 20:58:46

标签: jenkins jenkins-pipeline

在一个声明性的Jenkins管道中,我需要启动作业B,获取它的build_number,这样我以后可以调用另一个作业来引用该特定构建的工件。

Return parameters/results from a job(triggered by pipeline) back to the same pipeline看起来它可以在较旧的groovy Jenkinsfiles中工作,但新的声明性语法不允许我根据“构建作业”步骤定义变量。

    stage ('Provision system testbed') {
        steps {
            build job: 'Build_Testbed', parameters: [
                string(name: 'TOPOLOGY', value: 'flat')
            ]
            **// How to we get the build_number from above?**
        }
    }

    stage ('System tests') {
        steps {
            sh """
                bundle exec rake spec:system || true
            """

            step([$class: 'JUnitResultArchiver', testResults: 'results/*.xml'])
        }
    }

    stage ('Destroy system testbed') {
        steps {
             build job: 'Destroy_Testbed', parameters: [
                string(name: 'BUILD_SELECTOR', value: '<SpecificBuildSelector plugin="copyartifact@1.38.1">  <buildNumber>**714**</buildNumber></SpecificBuildSelector>')
            ]
        }
    }

当然,我也愿意接受完全替代的解决方案

解决方案:

    stage ('Provision system testbed') {
        steps {
            script {
                def setupResult = build job: 'Build_Testbed', parameters: [
                    string(name: 'TOPOLOGY', value: 'flat')
                ]
                def systest_build_number = setupResult.getNumber()
                // Navigate to jenkins > Manage jenkins > In-process Script Approval
                // staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods putAt java.lang.Object java.lang.String java.lang.Object
                env['setup_build_number'] = setupResult.getNumber()
            }
        }
    }

    stage ('System tests') {
        steps {
            sh """
                bundle exec rake spec:system || true
            """

            step([$class: 'JUnitResultArchiver', testResults: 'results/*.xml'])
        }
    }

    stage ('Destroy system testbed') {
        steps {
             build job: 'Destroy_Testbed', parameters: [
                string(name: 'BUILD_SELECTOR', value: '<SpecificBuildSelector plugin="copyartifact@1.38.1">  <buildNumber>${env.setup_build_number}</buildNumber></SpecificBuildSelector>')
            ]
        }
    }

注意:需要在Jenkins的Jenkins服务器中批准脚本&gt;管理詹金斯&gt;进程内脚本批准

staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods putAt java.lang.Object java.lang.String java.lang.Object

2 个答案:

答案 0 :(得分:2)

  

看起来它适用于较旧的groovy Jenkinsfiles

你可以使用nonsense步骤来包含一个代码块,并且在这个块中,声明性管道基本上就像脚本一样,所以你仍然可以使用你引用的答案中描述的技术。

欢迎来到stackoverflow。我希望你在这里过得愉快。

答案 1 :(得分:0)

我遇到了同样的问题,发现不使用以下内容可以避免“需要在 Jenkins > 管理 jenkins > 进程内脚本批准”的 Jenkins 服务器中批准脚本。

代替: env['setup_build_number'] = setupResult.getNumber()(来自上面解决方案中提到的代码)

使用这个: env.setup_build_number = setupResult.getNumber()