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

Using the ez-template plugin for Jenkins through the Jenkins Job DSL doesn't apply the template after creation

我正在致力于使用 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 可用的方法,但没有成功。关于如何应用我的配置有什么想法吗?

完全披露:我是一名同事,能够帮助 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 class 触发实际保存事件,使用作业使用的模板。值得注意的是,如果作业 'foo' 没有实现模板,那么 'template' 变量将为空,从而导致此代码出错。 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)

仅供参考 ez-templates 1.3.0 现在会触发额外的保存事件,这样您就不需要上述技巧了。