Jenkins管道:模板化变量

时间:2016-08-25 14:26:11

标签: templates jenkins sed jenkins-pipeline

我有一个处理模板文件(例如XML文件)的管道作业,需要在使用渲染文件之前用作业参数替换文件中的一些变量,但我似乎找不到任何干净的东西来做,现在我只是使用shell脚本和sed逐个替换每个变量。

以下是一个示例XML模板文件:

<?xml version='1.0' encoding='UTF-8'?>
<rootNode>
    <properties>
        <property1>${property1}</property1>
        <property2>${property2}</property2>
        <property3>${property3}</property3>
    </properties>
</rootNode>

我希望模板文件中的“变量”替换为我的作业参数$property1$property2$property3。 这就是我今天要做的事情:

sh  "sed -i 's/@property1@/${property1}/' '${templateFile}'" +
    "sed -i 's/@property2@/${property2}/' '${templateFile}'" +
    "sed -i 's/@property3@/${property3}/' '${templateFile}'"

...但我发现它很难看...... Jenkins中是否存在用于模板文件的内容,例如Jinja2(或任何模板框架)会做什么?

2 个答案:

答案 0 :(得分:3)

以下是我找到的解决方案:我使用以下文件创建了一个全局共享库:

resources/report.txt.groovy(这是我的模板文件):

Hello from ${job}!

vars/helpers.groovy

import groovy.text.StreamingTemplateEngine

def renderTemplate(input, variables) {
  def engine = new StreamingTemplateEngine()
  return engine.createTemplate(input).make(variables).toString()
}

然后,在我的管道中,我添加了以下步骤:

variables = [ "job": currentBuild.rawBuild.getFullDisplayName() ]
template = libraryResource('report.txt.groovy')
output = helpers.renderTemplate(template, variables)

这会生成一个存储在output变量中的字符串,其中包含以下内容:

Hello from SIS Unix Automation Testing » myjob » master #29!

其中SIS Unix Automation Testing » myjob » master是我的Multibranch Pipeline作业的全名。

当然,您可以使用此变量的内容执行任何操作,例如将其写入文件或通过电子邮件发送,您可以使用xml文件模板或任何所需的文件类型,而不仅仅是txt。

请注意,您需要禁用沙箱或批准/白名单脚本才能使用此方法,否则StreamingTemplateEngine的某些内部内容将被阻止。

流式传输模板引擎的模板格式如下:${variable}$VARIABLE形式的任何内容都将被直接替换,并且可以使用<% %> / <%= %>语法嵌入scriptlet(例如循环或if语句)(类似于ERB模板)。 StreamingTemplateEngine的文档可用here

答案 1 :(得分:0)

如果您只需要XML文件的内容,那么Jenkins的config-file-provider插件可以正常工作,但对于我的用途,它是有限的。它为模板文件提供了一个集中位置(或者您可以指向文件系统中的文件)并可选择替换令牌。然而问题是令牌选项针对所有或没有令牌(并且硬编码以寻找$ {VAR}或$ VAR格式的令牌)。因此,如果您的所有令牌都在jenkins环境中可用,那么您会没事的,但如果您有自定义的东西,那么它将导致失败。例如:

This is my instruction file. This file is saved to ${BUILD_URL}/file.txt

如果我想生成一个bash脚本,上面的内容将会起作用....

VAR = ${BUILD_URL}
echo $VAR

这将失败,因为它无法找到$ VAR的值。逃避$并没有帮助,所以我不知道该怎么办。