Jenkins管道:用变量模板化一个文件



我有一个处理模板文件(例如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的值。转义$没有帮助,所以我不确定在我的情况下该怎么做。

相关内容

  • 没有找到相关文章

最新更新