web-dev-qa-db-ja.com

環境変数にアクセスするJenkins Pipeline

JenkinsでDSLパイプラインを使用しようとしています。プロジェクト名をスクリプトの一部として使用できたらいいと思いました。

git credentialsId: 'ffffffff-ffff-ffff-ffff-ffffffffffffff',\
url: "${repo_root}/${JOB_NAME}.git"

エラーが表示されます:

groovy.lang.MissingPropertyException: \
No such property: JOB_NAME for class: groovy.lang.Binding

これらの指示 に従い、変数の1つとしてJOB_NAMEに言及していると思いました。

私は試してみることにしました:

sh 'env'

私のDSLで、これは印刷されます:

JOB_NAME = foo-bar

それは私が期待していることです。

別の ブログの言及

環境変数の使用法
その価値を得るには2つの方法があります。起動時に-D=から渡されるプロパティは、GroovyのJavaとの強力な関係のおかげで、System.getProperty("key")と読むことができました。

Javaの方法で通常の環境変数を読み取ることは、System.getenv("VARIABLE")...です。

これを試してみましょう:

println "JOB_NAME = " + System.getenv('JOB_NAME'); 

今、私は得る:

Java.lang.NullPointerException: Cannot get property 'System' on null object

ヌルオブジェクト?しかし、JOB_NAMEは環境変数であることがわかります!

Pipelineジョブで$JOB_NAMEをDSLスクリプトに読み込むにはどうすればよいですか。私はパイプラインの仕事をしようとしていますが、それが機能するようになると、これがJenkinsfileを持つマルチブランチパイプラインになります。

26
David W.

すべての環境変数は、envを使用してアクセスできます。 ${env.JOB_NAME}

56

さて、これは今日、私を本当に困らせました。最終的に、私はいくつかのことでやられていました:

  • Groovyの単一引用符で囲まれた文字列は、bashの場合と同様に「変数を評価しない」ことを意味します
  • 変数を参照するだけの場合は、$補間を使用する必要はまったくないため、env.JOB_NAMEを実行するだけで済みます。

このSOの質問は、コードを解読するのに役立ちました: Jenkins Workflow Checkout Accessing BRANCH_NAME and GIT_COMMIT

13
Tim Keating

実際、${env.JOB_NAME}を使用して既知の変数にアクセスします。

ただし、名前が別の変数によって指定されている環境変数にアクセスする必要がある場合(動的アクセス)、env["your-env-variable"]を使用します。

3つの環境変数(Jenkins -> Administer -> Configure System -> Environment variables)を構成したときに問題が発生しました。それらにENV_VAR_1ENV_VAR_2ENV_VAR_3という名前を付けましょう。今、私はそれらに動的にアクセスしたい、私はそのようにすることができます:

def envVarName = "ENV_VAR_" + count  // Suppose count is initialized in a loop somewhere above...

def value = env[envVarName]  // Will be resolved to env["ENV_VAR_1"] depending on count value

Jenkins構成の私の環境変数は次のようになります:

enter image description here

2
Pom12

これが機能しないという問題がありました。グローバルに設定されたプロパティ/環境変数は、nodeステップ内でのみ使用できました。 Pipelineプラグインのバージョン2.4のバグです。この問題に直面した場合、2.5にアップグレードすると、スクリプト内のどこからでもグローバルプロパティを使用できます。私はこれをJenkins wikiに投稿しました here 私が使用したテストスクリプトと共に。

1
Mig82