在Groovy脚本中访问当前的Jenkins构建

14

我创建了一个Groovy脚本,它用于Jenkins作业中的System Groovy Script步骤,需要访问当前作业的当前构建。

在使用Hudson.model Cause.UpstreamCause将当前作业的当前构建链接到我正在调度的依赖作业时,需要当前构建。

由于代码更加简洁:

my-job-step.groovy

def scheduleDependentJob(jobName) {
  def fooParam = new StringParameterValue('foo', 'bar');
  def paramsAction = new ParametersAction(fooParam)

  println "Scheduling dependent job"
  def currentJob = ???
  def cause = new Cause.UpstreamCause(currentBuild)
  def causeAction = new hudson.model.CauseAction(cause)
  instance.queue.schedule(job, 0, causeAction, paramsAction)
}

CauseAction 构造函数(在 http://javadoc.jenkins-ci.org/hudson/model/Cause.UpstreamCause.html 上看到)需要一个 Run 对象,当前的构建对象应该是其实例。我只是找不到在 Groovy 脚本中获取当前运行作业构建的好方法。

3个回答

12

如果您在Jenkins作业中使用Groovy插件,则在执行系统Groovy脚本步骤中,该插件已经为您提供了访问一些预定义变量的功能:

build
    The current AbstractBuild.
launcher
    A Launcher.
listener
    A BuildListener.
out
    A PrintStream (listener.logger).

例如:

println build.getClass()

输出:

class hudson.model.FreeStyleBuild

6

这是我一直在寻找的代码片段!

import hudson.model.*
def currentBuild = Thread.currentThread().executable

这与我之前的脚本很匹配,代码如下:
import hudson.model.*


def scheduleDependentJob(jobName) {
  def fooParam = new StringParameterValue('foo', 'bar');
  def paramsAction = new ParametersAction(fooParam)

  println "Scheduling dependent job"
  def currentBuild = Thread.currentThread().executable
  def cause = new Cause.UpstreamCause(currentBuild)
  def causeAction = new hudson.model.CauseAction(cause)
  instance.queue.schedule(job, 0, causeAction, paramsAction)
}

1
我发现YMMV有点取决于Groovy脚本调用的方式(例如email-ext-plugin、post-build actions)。对于正在运行的作业,“activeBuild = Thread.currentThread().executable”适用。但是对于旧作业,这种方法不起作用。如果已经存在预定义的变量build,则最好使用它。为了在两种情况下都获取构建对象,可以执行类似“try {c=build.getClass()}catch(Exception ex){try{build = Thread.currentThread().executable}catch(Exception ex2){println("oh dear, no build object.")}}”。 - gaoithe

0

这里是关于编程的内容,luka5z 的回答已经讲解了如何将监听器传递给 Groovy 脚本:

import jenkins.model.*;
import hudson.model.*;
import hudson.util.*;
import hudson.tasks.*;
import hudson.plugins.git.*;
import hudson.scm.*
import jenkins.scm.*

def build = Thread.currentThread()?.executable
//def svn_branch = build.buildVariableResolver.resolve("SVN_BRANCH")

if (build instanceof AbstractBuild){
    def workspace = build.workspace
    //def job = build.parent
    def scm = build.parent.scm;
    //println "scm: $scm"

    if (scm instanceof hudson.scm.SubversionSCM) {
        scm.checkout(build, null/*Launcher*/, workspace /*workspace*/, listener/*listener*/, null /*changelogfile*/,null/*baseline*/)
    }else if (scm instanceof hudson.plugins.git.GitSCM) {
        scm.checkout(build, null/*Launcher*/, workspace /*workspace*/, listener/*listener*/, null /*changelogfile*/,null/*baseline*/)
    }
}

Scriptler中的监听器


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接