我有一个处理模板文件(例如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(或任何模板框架)会做什么?
这是我找到的解决方案:我用以下文件创建了一个全局共享库:
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()
}
然后,在我的Pipeline中,我添加了以下步骤:
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
的文档在这里。
如果你只是需要XML文件的东西,那么config-file-provider插件的Jenkins将工作得很好,但对于我的使用是有限的。它为模板文件提供了一个集中的位置(或者您可以指向文件系统中的一个文件),并可选择替换令牌。然而,问题是令牌选项针对所有或没有令牌(并且硬编码以查找${VAR}或$VAR格式的令牌)。所以如果你所有的令牌在jenkins环境中都可用,那就没问题了,但如果你有一些自定义的东西,那就会导致失败。例如:
This is my instruction file. This file is saved to ${BUILD_URL}/file.txt
如果我想生成一个bash脚本,上面将工作....
VAR = ${BUILD_URL}
echo $VAR
这将失败,因为它找不到$VAR的值。转义$没有帮助,所以我不确定在我的情况下该怎么做。