【问题标题】:Jenkins - Change property if job is started by upstream jobJenkins - 如果作业由上游作业启动,则更改属性
【发布时间】:2020-05-09 09:09:45
【问题描述】:

我在 Jenkins 有 2 个工作:Parent 和 Child(成功构建 Parent 会触发构建 Child)。

两个项目中都有一个属性 VALUE:

  • 项目父项:VALUE=FIRST
  • 子项目:VALUE=NEXT

我想要的是,如果我直接构建作业 Child,VALUE=NEXT。但是如果作业 Child 由上游作业 Parent 启动,则该属性将被覆盖并且 VALUE=FIRST。

我尝试在 Parent 上设置构建后操作以在 Child 上触发参数化构建并定义参数 VALUE=FIRST。然而,在运行 Parent 并在 Child 上触发构建后,我查看了 Child 和 VALUE=NEXT 的控制台输出:它没有改变。

(如果在 Child 中未定义 VALUE 并且它起作用,我测试了将参数 VALUE 传递给 Child,VALUE 等于 FIRST。因此 Jenkins 能够传递参数,但如果它已经在下游作业中定义,则无法覆盖该参数.)

如何覆盖下游作业中的属性?

【问题讨论】:

  • 两个项目中的“VALUE”属性在哪里定义?
  • 抱歉回复晚了,但我已经解决了这个问题。 VALUE 在子作业中通过 EnvInject 定义为环境变量,而不是参数。因此,当尝试传递参数 VALUE 以覆盖环境变量 VALUE 时,它遇到了问题。通过修改子作业以使 VALUE 成为参数,我能够成功地将新参数从父作业传递给子作业。
  • 所以如何在两个项目中定义最终成为问题

标签: jenkins jenkins-plugins jenkins-pipeline


【解决方案1】:

请注意,如果您在沙盒中运行脚本,这需要一些批准。

isUpstreamTriggered = (currentBuild.rawBuild.getCause(hudson.model.Cause$UpstreamCause) != null)

更多信息the example I've based onthe actual Cause class

【讨论】:

    【解决方案2】:

    这是旧帖子,但我认为值得提供第二个选项来查找当前构建是否由上游项目引起。

       `def upstreamProjectCount = 0;
        currentBuild.upstreamBuilds?.each { b ->
            upstreamProjectCount++
        }
        if (upstreamProjectCount == 0) {
            echo "Not a upstream project"
        } else {
            echo "upstream project"
        }  
    

    【讨论】:

    • 干杯,这很好用!但它比需要的时间长一点,我把它减少到if (currentBuild.upstreamBuilds) { ... }。如果upstreamBuilds 不存在,或者存在但为空,Groovy 将其视为 falsey。如果它存在并且至少包含 1 个元素,那么它就是 truthy
    猜你喜欢
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2020-09-08
    • 1970-01-01
    • 2011-08-06
    • 2019-04-06
    相关资源
    最近更新 更多