新しい共有ライブラリを使用すると、Jenkinsfileによって直接実行されるか、var/*。groovyスクリプトを介して実行されるsrcクラスの環境変数にアクセスできません。この問題は、var/* groovyスクリプトにwithEnvを追加しても解決しません。
環境変数をjenkins共有ライブラリのsrcクラスの実行に伝播させるための秘訣は何ですか?
Jenkinsfile
withEnv(["FOO=BAR2"]) {
println "Jenkinsfile FOO=${FOO}"
library 'my-shared-jenkins-library'
lib.displayEnv()
共有ライブラリvar/lib.groovy
def displayEnv() {
println "Shared lib var/lib FOO=${FOO}"
MyClass c = new MyClass()
}
共有ライブラリsrc/MyClass.groovy
class MyClass() {
MyClass() {
throw new Exception("Shared lib src/MyClass FOO=${System.getenv('FOO')")
}
}
**実行結果**
Jenkinsfile FOO=BAR
Shared lib var/lib FOO=BAR
Java.lang.Exception: Shared lib src/MyClass FOO=null
...
これを処理する唯一の方法は、Jenkinsファイルからvar/lib.groovyにthisを渡して、そのオブジェクトからハーベストすることです。
Jenkinsfile
withEnv(["FOO=BAR2"]) {
library 'my-shared-jenkins-library'
lib.displayEnv(this)
var/lib.groovy
def displayEnv(script) {
println "Shared lib var/lib FOO=${FOO}"
MyClass c = new MyClass(script)
}
srcクラス
MyClass(def script) {
throw new Exception("FOO=${script.env.FOO}")
}
共有ライブラリがアクセスできる以下のように環境変数を設定できると思います。
Jenkisfile
env.FOO="BAR2"
library 'my-shared-jenkins-library'
lib()
vars/lib.groovy
def call(){
echo ("FOO: ${FOO}")
echo ("FOO:"+env.FOO)
}
別の方法は、「steps」変数を使用することです。
Jenkinsfile内
mypackages.myclass.mymethod(steps)
src内
class myclass implements Serializable {
void mymethod(steps) {
String myEnvVar = steps.sh(returnStdout: true, script: "env | grep 'myVar' | cut -f 2- -d '='")
}
}
専門家がソリューションについて何を言うかはわかりませんが、evaluateを使用して共有ライブラリからJenkinsfileで定義された変数にアクセスできました。
Jenkinsfile
myVar = "abc"
vars/test.groovy
String myVar = evaluate("myVar")
最近この問題に遭遇したので、$0.02
を追加します。
Var/*。groovyに使用する基本的なテンプレートは次のとおりです。
// var/myMethod.groovy
import cool.package.Clazz
def call(Map m) {
m.put('env', env)
m.put('steps', steps)
new Clazz(m).call()
}
そして、src/**/*。groovyのテンプレート
// src/cool/package/Clazz.groovy
class Clazz {
private String cool_field_1 = "default-value-1"
private int cool_value = 42
def env
def steps
def call() {
steps.echo("env.BUILD_TAG: ${env.BUILD_TAG}")
//...
}
}
Jenkinsfile
では、標準的な方法で使用されます。
@Library('mylib@mybranch')
pipeline {
stages {
stage('St 1') {
steps { myMethod('cool_value': 43) }
}
}
}
免責事項:Groovyは使用していませんが、Javaに似ているため、ほとんど使用できません。また、Map
を使用すると、非常に柔軟なインターフェイスの利点が得られるようです。
私にとって、これはうまくいきます。
Jenkinsfile:
@Library('jenkins-library') _
pipeline {
agent any
environment {
FOO = 'bar'
}
stages {
stage('Build') {
steps {
script {
buildImage()
...
ライブラリvars/buildImage.groovy:
def call() {
println(this.env.FOO)
println(env.FOO)
}
したがって、ライブラリ内のクラスに環境を渡すには、vars/yourfunc.groovy
でthis
を使用するだけです。