そのため、Jenkins Pipelineが提供するreadFileメソッドを使用してテキストファイル(JSON)を読み取るJenkinsPipelineがあります。テキストファイルapp.JSONには、Jenkinsパイプラインですでに定義されている複数の変数があります。
readFileはファイルを読み取り、文字列に変換しますが、これらの変数を補間しません。単純な文字列置換以外にこれらの変数を補間するための私のオプションは何ですか(これは避けたいです)
readJSONまたはJSONパーサーを使用できることはわかっていますが、出力を文字列で表示したいので、文字列として読み取って渡すだけで簡単にできます。
Gstrings、$ {-> variable}、および.toString()メソッドを使用してみました。何もうまくいきませんでした。
Jenkinsパイプラインコード
appServerName = 'gaga'
def appMachine = readFile file: 'util-silo-create-v2/app.json'
println appMachine
app.json
{
"name":"${appServerName}",
"fqdn":"${appServerName}"
}
パイプラインとapp.jsonの両方に、置換したい変数が複数あります
問題は、JenkinsPipelineが提供するreadFileメソッドにあります。非常にすっきりと使いやすいですが、文字列を補間しません。
私は以下の出力を期待しています
println appMachine
{
"name":"gaga",
"fqdn":"gaga"
}
私が得ている出力
{
"name":"${appServerName}",
"fqdn":"${appServerName}"
}
readFile
ステップ(またはテキストファイルからコンテンツを読み取る他のメソッド)が現在のスコープから変数をバインドし、生のテキストの変数プレースホルダーを補間する必要があるというあなたの仮定は間違っています。ただし、Groovyテンプレートエンジンを使用して、GString変数の補間に似たものを呼び出すことができます。次の例を考えてみましょう。
import groovy.text.SimpleTemplateEngine
def jsonText = '''{
"name":"${appServerName}",
"fqdn":"${appServerName}"
}'''
@NonCPS
def parseJsonWithVariables(String json, Map variables) {
def template = new SimpleTemplateEngine()
return template.createTemplate(json).make(variables.withDefault { it -> "\${$it}" }).toString()
}
node {
stage("Test") {
def parsed = parseJsonWithVariables(jsonText, [
appServerName: "gaga"
])
echo parsed
}
}
このメソッドparseJsonWithVariables
は、期待どおりの動作をします。を使用して作成されたマップだけでなく、もシリアル化できない@NonCPS
ため、このメソッドを作成することが重要です。以前にファイルから読み取ったJSON(この例では、簡単にするために代わりに変数を使用します)とパラメーターのマップを取ります。このマップをデフォルト値のマップに変換するため(パーツがその責任を負います)、テンプレートエンジンは、指定された名前のプロパティがないと文句を言いません。この場合、デフォルトのメソッドは変数を「現状のまま」返しますが、代わりに空の文字列または値を返すことができます。あなたのためにうまくいくものは何でも。SimpleTemplateEngine
withDefault()
variables.withDefault { ... }
null
それを実行すると、次のようになります。
[Pipeline] Start of Pipeline (hide)
[Pipeline] node
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] echo
{
"name":"gaga",
"fqdn":"gaga"
}
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加