Trigger Jenkins job on same node than parent with Groovy
在 Jenkins 作业中,我想从 Groovy 脚本触发另一个 Jenkins 作业:
1 | other_job.scheduleBuild(); |
但是 other_job 不是在与父作业相同的节点上启动的。如何修改我的脚本以在与父作业相同的节点上启动 other_job ?
我曾经使用"Trigger/call builds on other project"和"NodeLabel Parameter"插件来做到这一点,但我现在想在脚本中做到这一点。
根据 biruk1230 的回答,这里有一个完整的解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import hudson.model.*; import jenkins.model.Jenkins import java.util.concurrent.* import hudson.AbortException import org.jvnet.jenkins.plugins.nodelabelparameter.* def currentBuild = Thread.currentThread().executable current_node = currentBuild.getBuiltOn().getNodeName() def j = Hudson.instance.getJob('MyJobName') try { def params = [ new NodeParameterValue('node', current_node, current_node), ] def future = j.scheduleBuild2(0, new Cause.UpstreamCause(build), new ParametersAction(params)) println"Waiting for the completion of" + j.getName() anotherBuild = future.get() } catch (CancellationException x) { throw new AbortException("aborted.") } |
首先,检查 \\'other_job\\' 配置中的
然后,这应该工作:
如果您不想在您的\\'other_job\\' 中使用此选项,那么您可以使用NodeLabel 参数插件(您已经使用过)并将NodeLabel 参数传递给下游作业。
在这种情况下,请参阅 Groovy 插件页面中的示例如何使用参数启动另一个作业(您需要使用
1 2 3 4 5 6 7 8 9 10 11 12 13 | def job = Hudson.instance.getJob('MyJobName') def anotherBuild try { def params = [ new StringParameterValue('FOO', foo), ] def future = job.scheduleBuild2(0, new Cause.UpstreamCause(build), new ParametersAction(params)) println"Waiting for the completion of" + HyperlinkNote.encodeTo('/' + job.url, job.fullDisplayName) anotherBuild = future.get() } catch (CancellationException x) { throw new AbortException("${job.fullDisplayName} aborted.") } println HyperlinkNote.encodeTo('/' + anotherBuild.url, anotherBuild.fullDisplayName) +" completed. Result was" + anotherBuild.result |
如果它不起作用,可能是节点限制的问题(例如,节点只有一个执行器)。
注意:我更喜欢使用 Jenkins 管道进行作业配置。它允许您将构建配置存储在 Jenkinsfiles 中,这些文件可以从存储库(例如,从 GitLab)加载。请参阅使用
触发作业的示例