Jenkins-如何在Gerrit补丁集上显示下游作业构建结果?

Jenkins-如何在Gerrit补丁集上显示下游作业构建结果?,jenkins,gerrit,gerrit-trigger,Jenkins,Gerrit,Gerrit Trigger,下面是我的用例 我有工作A,B,C-A是上游工作,B和C是下游工作。当在Gerrit中创建修补程序集时,基于patchset created eventI触发Job a,并基于此作业的结果,我们触发B和C。执行B和C后,我希望在Gerrit修补程序集上显示所有三个作业的结果。像 Job A SUCCESS JOB B SUCCESS JOB C FAILED 现在我只在GERRIT补丁集上看到作业A构建结果显示为 JOB A SUCCESS 有什么方法可以做到这一点吗?请执行以下操作

下面是我的用例

我有工作A,B,C-A是上游工作,B和C是下游工作。当在Gerrit中创建修补程序集时,基于
patchset created event
I触发
Job a
,并基于此作业的结果,我们触发B和C。执行B和C后,我希望在Gerrit修补程序集上显示所有三个作业的结果。像

 Job A SUCCESS
 JOB B SUCCESS
 JOB C FAILED
现在我只在GERRIT补丁集上看到
作业A
构建结果显示为

 JOB A SUCCESS
有什么方法可以做到这一点吗?

请执行以下操作:

1) 将所有作业(A、B和C)配置为在创建修补程序集时触发

2) 将作业B和C配置为依赖于作业A

2.1)单击Gerrit触发器作业配置中的“高级…”

2.2)在“此作业所依赖的其他作业”字段中添加作业A

使用此配置,作业B和C将在开始之前等待作业A完成,您将获得所需的结果:


解决此问题的最佳方法是创建一个小型包装管道作业。让我们把它命名为ABC

将Build_ABC配置为在您希望的Gerrit事件上触发。该作业将负责运行其他3个构建,如果这些作业中出现任何故障,您的构建作业将失败,并向Gerrit报告。您将无法在Gerrit消息中立即看到哪个作业失败,但可以在Jenkins管道概述中看到

在下面的脚本化管道脚本中,您会看到一个调用Build_a并等待结果的管道。如果构建成功,它将继续并行执行构建B和C。在我的示例中,我使buildc失败,这导致整个管道作业失败


这是我第一个答案的修订版,剧本有点长了。由于需要在发送给Gerrit的消息中包含单独的构建结果,因此已更改管道以捕获单独的结果并记录它们。如果生成A失败,将跳过生成B+C,并跳过状态。 接下来,可以使用ssh命令行工具执行手动检查。通过这种方式,可以生成一条自定义消息,以包含各个构建结果。它看起来像下面的屏幕截图:

我还没有弄明白如何将它变成一个多行注释,但是在命令行中还有一个使用json的选项,请看一下

def build_a = "Skipped"
def build_b = "Skipped"
def build_c = "Skipped"
def build_result = "+1"

try {
  stage("A") {
    try {
      build( job: '/Peter/Build_A', wait: true)
      build_a = "Pass"
    } catch (e) {
        build_a = "Failed"
        // throw again or else the job to make the build fail
        // throwing here will prevent B+C from running
        throw e
    }
  }

  stage("After A") {
    parallel B: {
      try {
        build( job: '/Peter/Build_B', wait: true)
        build_b = "Pass"
      } catch (e) {
        build_b = "Failed"
        // throw again or else the job to make the build fail
        throw e
      }
    }, C: {
      try {
        build( job: '/Peter/Build_C', wait: true)
        build_c = "Pass"
      } catch (e) {
        build_c = "Failed"
        // throw again or else the job to make the build fail
        throw e
      }
    }
  }
} catch(e) {
  build_result = "-1"
  // throw again or else the job to make the build fail
  throw e
} finally {
  node('master') {
    // Perform a custom review using the environment vars
    sh "ssh -p ${env.GERRIT_PORT} ${env.GERRIT_HOST} gerrit review --verified ${build_result} -m '\"Build A:${build_a} Build B: ${build_a} Build C: ${build_c}\"' ${env.GERRIT_PATCHSET_REVISION}"
  }
}
接下来,您应该将Gerrit触发器配置为忽略Jenkins的结果,否则将进行双重投票。

另一个优点是,使用Ocean Blue插件,您可以获得构建的良好图形表示,如下图所示,并且您可以通过单击作业来检查出了什么问题


感谢您的快速回复。。当我对所有A、B和C作业使用触发器时,所有3个作业都会基于触发器同时执行,对吗?我正在使用JJB(jenkins job builder)创建作业配置。我看不到3中的这个选项将执行,但是B和C将保持“挂起”状态,等待A启动。选项就在那里:依赖项作业。放好它,玩得开心:-)谢谢你,马塞洛·维拉·德·奥利维拉。下面是对上述设置的观察:我创建了A(upstr)、B(Downstr)作业和B依赖(现在忽略作业C)A。在作业B中,我将作业A作为依赖项作业,在补丁上触发gerrit事件后,我看到作业A和作业B都被触发,但作业B一直等到作业A完成。。接下来,不管作业A的结果如何,作业B继续构建。我在这里期望的是,作业A应该基于事件触发,基于结果,它应该触发下游作业。在构建验证之后,开发人员应该在Gerrit补丁集上看到上游和下游作业的结果。我理解:-(现在看来Gerrit trigger插件功能不太好。您是如何在3个作业中设置Gerrit trigger的?您是否验证了Gerrit trigger注释(“作业A成功”、“作业B成功”和“作业C失败”,在您的示例中)在Gerrit?作业B:*-触发器:名称:Gerrit触发器修补程序已提交跳过触发器:-Gerrit:服务器名称:'xxx'触发器打开:-补丁集已创建事件:排除草稿:'false'排除不重要的重基:'false'排除无代码更改:'false'-draft published event-comment added contains event:comment contains value:'recheck'-comment added contains event:dependency jobs:Job A**是否可以基于构建结果触发作业?根据这一点,我看不到任何此类选项。我使用
comment contains value
选项n根据补丁集中提供的注释触发生成。很抱歉,我错过了您希望显示作业C失败的部分。您将看到的唯一消息是管道作业失败。我想您只对总结果感兴趣。一个作业失败仍然是全部失败。我已重新处理了答案,现在将报告给Gerrit t这比最初的答案要复杂一点,如果你认为复杂性值得的话,这取决于你。