[英]Jenkins pipeline : templating a file with variables
我有一个处理模板文件(例如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}'"
...但我觉得它很难看......詹金斯有什么东西用来模板文件,例如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()
}
然后,在我的管道中,我添加了以下步骤:
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文件的东西,那么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的值。 逃避$并没有帮助所以我不知道该怎么做我的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.