簡體   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