Pom*_*m12 5 templates sed jenkins 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>
Run Code Online (Sandbox Code Playgroud)
我希望我的模板文件中的"变量"替换为我的作业参数$property1,$property2并且$property3.这就是我今天要做的事情:
sh "sed -i 's/@property1@/${property1}/' '${templateFile}'" +
"sed -i 's/@property2@/${property2}/' '${templateFile}'" +
"sed -i 's/@property3@/${property3}/' '${templateFile}'"
Run Code Online (Sandbox Code Playgroud)
...但我觉得它很难看......詹金斯有什么东西用来模板文件,例如Jinja2(或任何模板框架)会做什么吗?
这是我找到的解决方案:我使用以下文件创建了一个全局共享库:
resources/report.txt.groovy (这是我的模板文件):
Hello from ${job}!
Run Code Online (Sandbox Code Playgroud)
vars/helpers.groovy:
import groovy.text.StreamingTemplateEngine
def renderTemplate(input, variables) {
def engine = new StreamingTemplateEngine()
return engine.createTemplate(input).make(variables).toString()
}
Run Code Online (Sandbox Code Playgroud)
然后,在我的管道中,我添加了以下步骤:
variables = [ "job": currentBuild.rawBuild.getFullDisplayName() ]
template = libraryResource('report.txt.groovy')
output = helpers.renderTemplate(template, variables)
Run Code Online (Sandbox Code Playgroud)
这将生成一个存储在output变量中的字符串,其内容如下:
Hello from SIS Unix Automation Testing » myjob » master #29!
Run Code Online (Sandbox Code Playgroud)
这里SIS Unix Automation Testing » myjob » master是我的多枝流水线作业的全名。
当然,你可以对这个变量的内容做任何你想做的事情,比如把它写到一个文件中或通过电子邮件发送,你可以使用 xml 文件模板或任何你想要的文件类型,而不仅仅是 txt。
请注意,您需要禁用沙箱或批准/白名单脚本才能使用此方法,StreamingTemplateEngine否则某些内部结构将被阻止。
流模板引擎的模板格式如下:任何形式${variable}或$VARIABLE将被直接替换和<% %>/<%= %>语法也可用于嵌入 scriptlet(例如循环或 if 语句)(类似于 ERB 模板)。的文档StreamingTemplateEngine可在此处获得。
小智 0
如果您只需要 XML 文件,那么 Jenkins 的 config-file-provider 插件就可以正常工作,但对我来说它的使用是有限的。它为模板文件提供了一个集中位置(或者您可以指向文件系统中的文件)并可选择替换令牌。然而问题是令牌选项针对所有令牌或不针对任何令牌(并硬编码以查找 ${VAR} 或 $VAR 格式的令牌)。因此,如果您的所有令牌在 jenkins 环境中都可用,那么您会没事,但如果您有自定义的东西,那么它将导致失败。例如:
This is my instruction file. This file is saved to ${BUILD_URL}/file.txt
Run Code Online (Sandbox Code Playgroud)
但是如果我想生成 bash 脚本,上面的方法就可以工作......
VAR = ${BUILD_URL}
echo $VAR
Run Code Online (Sandbox Code Playgroud)
这将失败,因为它找不到 $VAR 的值。转义 $ 没有帮助,所以我不知道在我的情况下该怎么做。
| 归档时间: |
|
| 查看次数: |
5540 次 |
| 最近记录: |