通过 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 现在会触发额外的保存事件,这样您就不需要上述技巧了。
我正在致力于使用 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 现在会触发额外的保存事件,这样您就不需要上述技巧了。