web-dev-qa-db-ja.com

jenkins共有ライブラリコードの環境変数にアクセスする

新しい共有ライブラリを使用すると、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
...
5
Peter Kahn

これを処理する唯一の方法は、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}")
}
4
Peter Kahn

共有ライブラリがアクセスできる以下のように環境変数を設定できると思います。

Jenkisfile

env.FOO="BAR2"
library 'my-shared-jenkins-library'
lib()

vars/lib.groovy

def call(){
    echo ("FOO: ${FOO}")
    echo ("FOO:"+env.FOO)
}
2

別の方法は、「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 '='")
  }
}
2
Arnau Oncins

専門家がソリューションについて何を言うかはわかりませんが、evaluateを使用して共有ライブラリからJenkinsfileで定義された変数にアクセスできました。

Jenkinsfile

myVar = "abc"

vars/test.groovy

String myVar = evaluate("myVar")
1
Chris H

最近この問題に遭遇したので、$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を使用すると、非常に柔軟なインターフェイスの利点が得られるようです。

1
shycha

私にとって、これはうまくいきます。

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.groovythisを使用するだけです。

0
kivagant