【问题标题】:Jenkins/Gerrit: Multiple builds with different labels from one gerrit eventJenkins/Gerrit:来自一个 gerrit 事件的具有不同标签的多个构建
【发布时间】:2015-01-16 10:34:59
【问题描述】:

我在一个需要在 Windows 和 Linux 上构建的项目中创建了两个标签,因此该项目的 project.config 现在如下所示

[label "Verified"]
    function = NoBlock

[label "Verified-Windows"]
    function = MaxWithBlock
    value = -1 Fails
    value =  0 No score
    value = +1 Verified

[label "Verified-Unix"]
    function = MaxWithBlock
    value = -1 Fails
    value =  0 No score
    value = +1 Verified

这按预期工作。提交要求一个成功的构建报告验证窗口和另一个验证的 linux [1]。

但是,这两个构建现在由相同的 gerrit 事件触发(来自“不同”服务器,请参阅注释),但是当它们报告两个标签中的一个时,只有一个“幸存”。

似乎,插件将到达的两条消息整理成一个评论,并且只接受第一个设置的标签。

这是设计使然还是错误?我可以解决这个问题吗? 这是使用旧版本的触发器:2.11.1

[1] 我通过添加多个服务器然后重新配置通过 SSH 发送回 gerrit 的消息来实现此功能。这很麻烦,而且非常重要。我认为作业应该能够覆盖成功构建将在 gerrit 上设置的标签。

【问题讨论】:

  • 我知道有新版本的插件,但是我现在无法重启jenkins。我不知道新版本是否解决了这个问题。

标签: jenkins build gerrit


【解决方案1】:

这可以通过使用多个用户名来解决,因此标签上的判断不会混淆。然而,这只是部分令人满意,因为同一服务器的多个服务器连接也会复制事件流中的事件。

我目前正在为 jenkins 的 gerrit 触发器插件开发补丁,以解决此问题并提高使用不同标签的效率。

【讨论】:

  • 嗨@kungfoo 你的补丁有什么进展吗?
  • 我目前被卡住了,因为它有相当大的变化,其中一位作者指出这需要一段时间才能完成。我还是会继续努力。
【解决方案2】:

也许您可以通过使用后期构建 groovy 脚本来解决这个挑战。 我在另一个主题中提供了一个示例:https://stackoverflow.com/a/32825278

如arman1991所述更具体

安装 Groovy Postbuild 插件: https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin

在您的每个作业中使用以下示例脚本作为 PostBuild 操作。根据 Linux 验证的需要进行修改。

它会为你做的:

  • 收集必要的环境变量和作业状态
  • 建立反馈消息
  • 构建 ssh 命令
  • 执行 ssh 命令 -> 向 gerrit 发送反馈

    //Collect all environment variables of the current build job
    def env = manager.build.getEnvironment(manager.listener)
    
    //Get Gerrit Change Number
    def change = env['GERRIT_CHANGE_NUMBER']
    
    //Get Gerrit Patch Number
    def patch = env['GERRIT_PATCHSET_NUMBER']
    
    //Get Url to current job
    def buildUrl = env['BUILD_URL']
    
    //Build Url to console output
    def buildConsoleUrl = buildUrl + "/console"
    
    //Verification will set to succeded (+1) and feedback message will be generated...
    def result = +1
    def message = "\\\"Verification for Windows succeeded - ${buildUrl}\\\""
    
    //...except job failed (-1)...
    if (manager.build.result.isWorseThan(hudson.model.Result.SUCCESS)){
       result = -1
       message = "\\\"Verification for Windows failed - ${buildUrl}\\\""
    }
    
    //...or job is aborted
    if (manager.build.result == hudson.model.Result.ABORTED){
       result = 0
       message = "\\\"Verification for Windows aborted - ${buildConsoleUrl}\\\""
    }
    //Send Feedback to Gerrit via ssh
    //-i - Path to private ssh key
    def ssh_message = "ssh -i /path/to/jenkins/.ssh/key -p 29418 user@gerrit-host gerrit review ${change},${patch} --label=verified-Windows=${result} --message=${message}"
    
    manager.listener.logger.println(new ProcessBuilder('bash','-c',"${ssh_message}").redirectErrorStream(true).start().text)
    

我希望这将帮助您在不使用 Gerrit 触发器插件报告结果的情况下解决您的挑战。

【讨论】:

  • 您的建议可以作为评论,但不能作为答案。请更具体并描述一些细节。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-10-31
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多