web-dev-qa-db-ja.com

パラメーター化ビルドのパラメーターにアクセスする方法は?

「Workflow」Jenkinsジョブの「This build is parameterized」セクションで設定されたparametersにどのようにアクセスしますか?

テストケース

  1. ワークフロージョブを作成します。
  2. 「このビルドはパラメータ化されています」を有効にします。
  3. デフォルト値bar textのSTRINGパラメーターfooを追加します。
  4. 以下のコードをWorkflow Scriptに追加します。

    node()
    {
         print "DEBUG: parameter foo = ${env.foo}"
    }
    
  5. ジョブを実行します。

結果

DEBUG: parameter foo = null

54
Vizionz

Workflowプラグインを使用する場合、変数はenv経由ではなく直接利用できると思います。試してください:

node()
{
    print "DEBUG: parameter foo = ${foo}"
}
71
Nick

このスレッドからいくつかのソリューションを試しました。それはうまくいくように見えましたが、私の値は常に真であり、次の問題も発生しました: 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変数であるかのようにアクセスできるようにする必要があります。

51
GabLeRoux

ビルドパラメータ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"
   }
}
11
Craig Rodrigues

パラメータ変数にプレフィックス「params」を追加します。例えば:

params.myParam

忘れないでください:myParamのメソッドを使用する場合は、「スクリプトの承認」で承認する必要があります。

6
burtsevyg

一重引用符の代わりに二重引用符を使用する

例えばecho "$foo"ではなくecho '$foo'

[パラメーター付きビルド]オプションを使用してパラメーターを受け入れるようにパイプラインを構成した場合、これらのパラメーターには同じ名前のGroovy変数としてアクセスできます。 Here を参照してください。

変数の置換を実行する必要がない場合は、セミコロン(;)をドロップし、括弧(( and ))をドロップし、二重('の代わりに単一引用符(")を使用できますHere を参照してください。これは私の問題に私を当てはめましたが、それを機能させるために必要なのはダブル(")だけであることがわかりました。

6
Ken Goodridge

次のスニペットにより、すべてのジョブパラメータにアクセスできます。

    def myparams = currentBuild.rawBuild.getAction(ParametersAction)
    for( p in myparams ) {
        pMap[p.name.toString()] = p.value.toString()
    }
2
ScaryGhast

パイプラインスクリプト(パイプラインプラグイン)内でビルドパラメーターにアクセスする方法が変更されていることに注意してください。このアプローチ:

getBinding().hasVariable("MY_PARAM")

もう動作していません。代わりにこれを試してください:

def myBool = env.getEnvironment().containsKey("MY_BOOL") ? Boolean.parseBoolean("$env.MY_BOOL") : false
2
Maksim

次のコードが役に立つことを願っています。

def item = hudson.model.Hudson.instance.getItem('MyJob')

def value = item.lastBuild.getEnvironment(null).get('foo')
1
DevD

parametersディレクティブを使用して、ビルドをパラメーター化してパラメーターにアクセスすることもできます。

Doc: パイプライン構文:パラメーター

例:

pipeline{

agent { node { label 'test' } }
options { skipDefaultCheckout() }

parameters {
    string(name: 'suiteFile', defaultValue: '', description: 'Suite File')
}
stages{

    stage('Initialize'){

        steps{

          echo "${params.suiteFile}"

        }
    }
 }
0
Shivankur Pal

パイプラインプラグインチュートリアル

ビルド時にパラメーターを受け入れるようにパイプラインを構成している場合—パラメーター付きビルド—同じ名前のGroovy変数としてアクセスできます

したがって、変数に直接アクセスしてみてください、例:

node()
{
     print "DEBUG: parameter foo = " + foo
     print "DEBUG: parameter bar = ${bar}"
}
0
kenorb