【问题标题】:Jenkins pipeline pass all parameters down to downstream jobsJenkins 管道将所有参数传递给下游作业
【发布时间】:2017-06-06 19:03:22
【问题描述】:

我有一个名为 buildall 的管道作业,如下所示:

pipeline {
    stages {
        stage("job1") {
            build job: "job1"
        }
    }
}

buildall 作业有 25 个参数。我想将 buildall 的所有参数传递给 job1。有没有一种简单的方法可以做到这一点,而不是手动指定每个参数?

在这个问题中:Pipeline pass parameters to downstream jobs 有人问了一个子问题但从未回答:或者更好的是,有没有一种不那么繁琐的方法,我可以将所有管道参数传递给下游作业。

这和我的问题一样。

【问题讨论】:

    标签: jenkins jenkins-pipeline


    【解决方案1】:

    以下方法似乎有效(虽然我还没有进行过广泛的测试):

    pipeline {
        agent any
        parameters {
            string(name: 'PARAM1', description: 'Param 1?')
            string(name: 'PARAM2', description: 'Param 2?')
        }
        stages {
            stage('Example') {
                steps {
                    echo "${params}"
                    script {
                        def myparams = currentBuild.rawBuild.getAction(ParametersAction).getParameters()
                        build job: 'downstream-pipeline-with-params', parameters: myparams
                    }    
                }
            }
        }
    }
    

    缺点:要访问 rawBuild 和 getAction,您必须禁用 Groove 沙箱或在 Jenkins 中在 Manage Jenkins > In-process Script Approval 下批准这些签名。此对话框将显示您可能引入了安全漏洞。因此,您是否愿意承担此风险取决于您的环境。

    【讨论】:

    • 谢谢@Philip!有用。如果没有你的帮助,我不会弄明白的。
    • 他们为什么要那样做?他们有一组奇怪的 *ParameterValue 类,用于调用构建,但没有将整个集合暴露给当前构建?我从这个 Jenkins Pipelines 开始,但我想推迟它,特别是当有一个特定的用例来传递管道中不支持的“当前构建参数”时
    • 您能否解释一下如何将“选择参数”发送到下游管道作业?
    【解决方案2】:

    如果您不关心参数类型,这种方法不需要禁用 Groovy Sandbox - 它只是假设所有参数都可以被视为字符串 (例如,不适用于“文件”):

    def myparams = params.collect{
        string(name: it.key, value: it.value)
    }
    build job: 'downstream-job', parameters: myparams
    

    扩展逻辑以处理预定义的非字符串参数类型并不难,但我同意这不是必需的。更好的方法是以 build() DSL 闭包所需的格式公开参数,包括当前通过“params”全局变量不可见的类型细节,或者添加一个布尔值,例如:

    // I wish:
    build job: 'downstream-job', includeMyParameters: true, parameters: anyExtras
    

    【讨论】:

      【解决方案3】:

      您可以通过以下方式传递所有管道参数:

      def params=[]
      env.getEnvironment().each{ k, v ->
              params.add(string(name:"${k}", value:"${v}"))
         }
      
      def slaveJob = build job: 'BuildJob', parameters:params
      

      【讨论】:

      • 对于任何回答这个问题的人来说,它都不是沙盒安全的。很好的答案,但就我而言,Jenkinsfiles 应该保持沙盒安全。但是用“params”替换“env.getEnvironment()”然后它会保持沙盒状态。 (请参阅 Akom 的答案以供参考)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多