通过Jenkins Job DSL使用Jenkins的ez-template插件在创建后不会应用模板

时间:2016-08-02 16:50:27

标签: jenkins groovy jenkins-job-dsl

我正在使用Jenkins Job DSL(Groovy)自动创建Jenkins作业。现在,我正在尝试自动创建一个使用ez-template插件的作业来使用现有模板并将其应用到我新创建的作业。但是,在我写完必要的配置之后:

job('foo') {
  properties {
    templateImplementationProperty {
      exclusions(['ez-templates', 'job-params', 'disabled', 'description'])
      syncAssignedLabel(true)
      syncBuildTriggers(true)
      syncDescription(false)
      syncDisabled(false)
      syncMatrixAxis(true)
      syncOwnership(true)
      syncScm(true)
      syncSecurity(true)
      templateJobName('template')
    }
  }
}

创建的作业正常...除非我在新创建的作业中手动点击UI上的保存按钮后才会应用模板。检查创建的作业的config.xml我可以看到xml包含我指定的配置,但它从未应用过。

查看ez-template代码,我可以看到这是由于该插件中实现的silentSave功能 - 它将配置写入磁盘而不会触发任何保存事件。

我已尝试过Jenkins API可用的方法但我在那里没有成功。关于如何应用我的配置的任何想法?

2 个答案:

答案 0 :(得分:1)

完全披露:我是一名同事,能够帮助shredmasteryjm解决这个问题。我认为最好把它放在网上为其他人。

触发要更新的模板实现内容所需的Groovy代码是:

import hudson.model.*;
import jenkins.model.*;
import com.joelj.jenkins.eztemplates.utils.TemplateUtils;
import com.joelj.jenkins.eztemplates.TemplateImplementationProperty;

Jenkins j = Jenkins.getInstance()
Item job = j.getItemByFullName('foo')
TemplateImplementationProperty template = TemplateUtils.getTemplateImplementationProperty(job)

TemplateUtils.handleTemplateImplementationSaved(job, template)

这利用EZ-Templates TemplateUtils类,使用作业使用的模板触发实际的保存事件。值得注意的是,如果作业'foo'没有实现模板,那么'template'变量将为null,导致此代码出错。 YMMV

在我们的案例中,我们还需要从其他问题中添加一些有用的信息:Access to build environment variables from a groovy script in a Jenkins build step ( Windows) 为了利用参数化的作业名称。因此,我们完成的脚本如下所示:

import hudson.model.*;
import jenkins.model.*;
import com.joelj.jenkins.eztemplates.utils.TemplateUtils;
import com.joelj.jenkins.eztemplates.TemplateImplementationProperty;

// get current thread / Executor
def thr = Thread.currentThread()

// get current build
def build = thr?.executable
def hardcoded_param = "parameter_job_name"
def resolver = build.buildVariableResolver
def hardcoded_param_value = resolver.resolve(hardcoded_param)

Jenkins j = Jenkins.getInstance()
Item job = j.getItemByFullName(hardcoded_param_value)
TemplateImplementationProperty template = TemplateUtils.getTemplateImplementationProperty(job)

TemplateUtils.handleTemplateImplementationSaved(job, template)

答案 1 :(得分:0)

FYI ez-templates 1.3.0现在触发其他保存事件,这样您就不需要上述技巧了。