繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM