Jenkins/Gerrit:来自一个 gerrit 事件的具有不同标签的多个构建
Jenkins/Gerrit: Multiple builds with different labels from one gerrit event
我在我们的一个项目中创建了两个标签,这些标签需要在 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
这按预期工作。提交要求一份成功的构建报告已验证 -windows,另一份已验证 -linux [1].
然而,这两个构建现在由同一个 gerrit 事件触发(来自 'different' 服务器,见注释),但是当它们仅报告两个标签之一时 'survives'.
似乎插件将到达的两条消息整理成一条评论,并且只接受第一个设置的标签。
这是设计使然还是错误?我可以解决这个问题吗?
这是使用旧版本的触发器:2.11.1
[1] 我通过添加多个服务器然后重新配置通过 SSH 发送回 gerrit 的消息来实现这一点。这很麻烦而且非常重要。我认为作业应该能够覆盖成功构建将在 gerrit 上设置的标签。
这可以通过使用多个用户名来解决,这样标签上的判断就不会混淆。然而,这只是部分令人满意,因为同一服务器的多个服务器连接也会从事件流中复制事件。
我目前正在为 jenkins 的 gerrit 触发器插件开发一个补丁来解决这个问题,并使使用不同的标签更有效率。
也许您可以使用 post 构建 groovy 脚本来解决这个难题。
我在另一个主题中提供了一个示例:
更具体如 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 触发器插件报告结果的情况下解决您的挑战。
我在我们的一个项目中创建了两个标签,这些标签需要在 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
这按预期工作。提交要求一份成功的构建报告已验证 -windows,另一份已验证 -linux [1].
然而,这两个构建现在由同一个 gerrit 事件触发(来自 'different' 服务器,见注释),但是当它们仅报告两个标签之一时 'survives'.
似乎插件将到达的两条消息整理成一条评论,并且只接受第一个设置的标签。
这是设计使然还是错误?我可以解决这个问题吗? 这是使用旧版本的触发器:2.11.1
[1] 我通过添加多个服务器然后重新配置通过 SSH 发送回 gerrit 的消息来实现这一点。这很麻烦而且非常重要。我认为作业应该能够覆盖成功构建将在 gerrit 上设置的标签。
这可以通过使用多个用户名来解决,这样标签上的判断就不会混淆。然而,这只是部分令人满意,因为同一服务器的多个服务器连接也会从事件流中复制事件。
我目前正在为 jenkins 的 gerrit 触发器插件开发一个补丁来解决这个问题,并使使用不同的标签更有效率。
也许您可以使用 post 构建 groovy 脚本来解决这个难题。
我在另一个主题中提供了一个示例:
更具体如 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 触发器插件报告结果的情况下解决您的挑战。