使用 Groovy 在与父节点相同的节点上触发 Jenkins 作业

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"插件来做到这一点,但我现在想在脚本中做到这一点。

enter


根据 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\\' 配置中的 Restrict where this project can be run 选项 - 您必须在此处指定相同的节点名称。
然后,这应该工作:

1
2
3
import hudson.model.*
def job = Hudson.instance.getJob('other_job')
job.scheduleBuild();

如果您不想在您的\\'other_job\\' 中使用此选项,那么您可以使用NodeLabel 参数插件(您已经使用过)并将NodeLabel 参数传递给下游作业。
在这种情况下,请参阅 Groovy 插件页面中的示例如何使用参数启动另一个作业(您需要使用 NodeParameterValue 而不是 StringParameterValue):

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)加载。请参阅使用 NodeParameterValue.

触发作业的示例