「Workflow」Jenkinsジョブの「This build is parameterized」セクションで設定されたparameters
にどのようにアクセスしますか?
テストケース
bar text
のSTRINGパラメーターfoo
を追加します。以下のコードをWorkflow Script
に追加します。
node()
{
print "DEBUG: parameter foo = ${env.foo}"
}
結果
DEBUG: parameter foo = null
Workflowプラグインを使用する場合、変数はenv経由ではなく直接利用できると思います。試してください:
node()
{
print "DEBUG: parameter foo = ${foo}"
}
このスレッドからいくつかのソリューションを試しました。それはうまくいくように見えましたが、私の値は常に真であり、次の問題も発生しました: JENKINS-40235
次の構文を使用して、groovy jenkinsfile
でパラメーターを使用することができました:params.myVariable
これが実際の例です:
print 'DEBUG: parameter isFoo = ' + params.isFoo
print "DEBUG: parameter isFoo = ${params.isFoo}"
node() {
// adds job parameters within jenkinsfile
properties([
parameters([
booleanParam(
defaultValue: false,
description: 'isFoo should be false',
name: 'isFoo'
),
booleanParam(
defaultValue: true,
description: 'isBar should be true',
name: 'isBar'
),
])
])
// test the false value
print 'DEBUG: parameter isFoo = ' + params.isFoo
print "DEBUG: parameter isFoo = ${params.isFoo}"
sh "echo sh isFoo is ${params.isFoo}"
if (params.isFoo) { print "THIS SHOULD NOT DISPLAY" }
// test the true value
print 'DEBUG: parameter isBar = ' + params.isBar
print "DEBUG: parameter isBar = ${params.isBar}"
sh "echo sh isBar is ${params.isBar}"
if (params.isBar) { print "this should display" }
}
[Pipeline] {
[Pipeline] properties
WARNING: The properties step will remove all JobPropertys currently configured in this job, either from the UI or from an earlier properties step.
This includes configuration for discarding old builds, parameters, concurrent builds and build triggers.
WARNING: Removing existing job property 'This project is parameterized'
WARNING: Removing existing job property 'Build triggers'
[Pipeline] echo
DEBUG: parameter isFoo = false
[Pipeline] echo
DEBUG: parameter isFoo = false
[Pipeline] sh
[wegotrade-test-job] Running Shell script
+ echo sh isFoo is false
sh isFoo is false
[Pipeline] echo
DEBUG: parameter isBar = true
[Pipeline] echo
DEBUG: parameter isBar = true
[Pipeline] sh
[wegotrade-test-job] Running Shell script
+ echo sh isBar is true
sh isBar is true
[Pipeline] echo
this should display
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
誤解を招く pipeline tutorial#build-parameters を更新するために Pull Request を送信し、「Groovy変数としてアクセス可能同じ名前。」。 ;)
編集:Jesse Glickが指摘したように: リリースノート 詳細を見る
また、パイプラインジョブプラグインを2.7以降に更新して、ビルドパラメーターが環境変数として定義され、グローバルGroovy変数であるかのようにアクセスできるようにする必要があります。
ビルドパラメータfooを追加すると、「裸の変数」のように動作するものに変換されるため、スクリプトで次のようにします。
node {
echo foo
}
ワークフロースクリプトの実装を見ると、スクリプトが実行されると、WorkflowScriptというクラスが動的に生成されることがわかります。スクリプト内のすべてのステートメントは、このクラスのコンテキストで実行されます。このスクリプトに渡されるすべてのビルドパラメーターは、このクラスからアクセス可能なプロパティに変換されます。
たとえば、次のことができます。
node {
getProperty("foo")
}
好奇心が強い方は、WorkflowScriptクラスのビルドパラメーター、環境変数、およびメソッドを出力しようとするワークフロースクリプトを以下に示します。
node {
echo "I am a "+getClass().getName()
echo "PARAMETERS"
echo "=========="
echo getBinding().getVariables().getClass().getName()
def myvariables = getBinding().getVariables()
for (v in myvariables) {
echo "${v} " + myvariables.get(v)
}
echo STRING_PARAM1.getClass().getName()
echo "METHODS"
echo "======="
def methods = getMetaClass().getMethods()
for (method in methods) {
echo method.getName()
}
echo "PROPERTIES"
echo "=========="
properties.each{ k, v ->
println "${k} ${v}"
}
echo properties
echo properties["class"].getName()
echo "ENVIRONMENT VARIABLES"
echo "======================"
echo "env is " + env.getClass().getName()
def envvars = env.getEnvironment()
envvars.each{ k, v ->
println "${k} ${v}"
}
}
ビルドパラメータが設定されているかどうかを確認するためにテストしたい別のコード例を次に示します。
node {
groovy.lang.Binding myBinding = getBinding()
boolean mybool = myBinding.hasVariable("STRING_PARAM1")
echo mybool.toString()
if (mybool) {
echo STRING_PARAM1
echo getProperty("STRING_PARAM1")
} else {
echo "STRING_PARAM1 is not defined"
}
mybool = myBinding.hasVariable("DID_NOT_DEFINE_THIS")
if (mybool) {
echo DID_NOT_DEFINE_THIS
echo getProperty("DID_NOT_DEFINE_THIS")
} else {
echo "DID_NOT_DEFINE_THIS is not defined"
}
}
パラメータ変数にプレフィックス「params」を追加します。例えば:
params.myParam
忘れないでください:myParamのメソッドを使用する場合は、「スクリプトの承認」で承認する必要があります。
一重引用符の代わりに二重引用符を使用する
例えばecho "$foo"
ではなくecho '$foo'
[パラメーター付きビルド]オプションを使用してパラメーターを受け入れるようにパイプラインを構成した場合、これらのパラメーターには同じ名前のGroovy変数としてアクセスできます。 Here を参照してください。
変数の置換を実行する必要がない場合は、セミコロン(;
)をドロップし、括弧(( and )
)をドロップし、二重('
)の代わりに単一引用符("
)を使用できます。 Here を参照してください。これは私の問題に私を当てはめましたが、それを機能させるために必要なのはダブル("
)だけであることがわかりました。
次のスニペットにより、すべてのジョブパラメータにアクセスできます。
def myparams = currentBuild.rawBuild.getAction(ParametersAction)
for( p in myparams ) {
pMap[p.name.toString()] = p.value.toString()
}
パイプラインスクリプト(パイプラインプラグイン)内でビルドパラメーターにアクセスする方法が変更されていることに注意してください。このアプローチ:
getBinding().hasVariable("MY_PARAM")
もう動作していません。代わりにこれを試してください:
def myBool = env.getEnvironment().containsKey("MY_BOOL") ? Boolean.parseBoolean("$env.MY_BOOL") : false
次のコードが役に立つことを願っています。
def item = hudson.model.Hudson.instance.getItem('MyJob')
def value = item.lastBuild.getEnvironment(null).get('foo')
parametersディレクティブを使用して、ビルドをパラメーター化してパラメーターにアクセスすることもできます。
Doc: パイプライン構文:パラメーター
例:
pipeline{
agent { node { label 'test' } }
options { skipDefaultCheckout() }
parameters {
string(name: 'suiteFile', defaultValue: '', description: 'Suite File')
}
stages{
stage('Initialize'){
steps{
echo "${params.suiteFile}"
}
}
}
ビルド時にパラメーターを受け入れるようにパイプラインを構成している場合—パラメーター付きビルド—同じ名前のGroovy変数としてアクセスできます。
したがって、変数に直接アクセスしてみてください、例:
node()
{
print "DEBUG: parameter foo = " + foo
print "DEBUG: parameter bar = ${bar}"
}