web-dev-qa-db-ja.com

宣言パイプラインでグローバル変数をどのように処理しますか?

以前 質問をした 環境ディレクティブで定義された変数を上書きする方法について、それは不可能だと思われます。

1つのステージで変数を設定し、他のステージからアクセスできるようにします。宣言的なパイプラインでは、これを行う唯一の方法はscript {}ブロック内にあるようです。

たとえば、チェックアウト後にいくつかの変数を設定する必要があります。そのため、チェックアウト段階の最後に、これらの変数を設定するスクリプト{}ブロックがあり、他の段階でアクセスできます。

これは機能しますが、間違っているように感じます。また、読みやすくするために、これらの変数をパイプラインの先頭で宣言して上書きすることをお勧めします。つまり、変数を定義するだけのscript {}ブロックを最初に持つ「変数の設定」ステージを持つことを意味します。

ここには明らかな機能が欠けていると確信しています。宣言的パイプラインにグローバル変数機能があるか、スクリプトを使用する必要があるか{}

7
red888

@mkobitが言うように、パイプラインブロックからグローバルレベルに変数を定義できます。試しましたか?

def my_var
pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                my_var = 'value1'
            }
        }

        stage('Example2') {
            steps {
                printl(my_var)
            }
        }

    }
}
7
Daniel Majano

これはエラーなく動作していますが、

def my_var
 pipeline {
  agent any
   environment {
     REVISION = ""
   }
   stages {
    stage('Example') {
        steps {
            script{
                my_var = 'value1'
            }
        }
    }

    stage('Example2') {
        steps {
             script{
                echo "$my_var" 
             }

        }
    }

 }
}
12
Viraj

@Sameeraの答えは、ほとんどのユースケースに適しています。ただし、演​​算子+=の追加に問題がありました。それで[〜#〜] not [〜#〜] work(MissingPropertyException):

def globalvar = ""
pipeline {
  stages {
    stage("whatever) {
      steps {
        script {
          globalvar += "x"
        }
      }
    }
  }
}

しかし、これはdid work:

globalvar = ""
pipeline {
  stages {
    stage("whatever) {
      steps {
        script {
          globalvar += "x"
        }
      }
    }
  }
}
0
akostadinov

文字列の場合、「environment」ブロックに追加します。

pipeline {
  environment {
    myGlobalValue = 'foo'
  }
}

しかし、非文字列変数の場合、宣言型パイプラインの最も簡単な解決策は、値をメソッドにラップすることです。

例:

pipeline {
  // Now I can reference myGlobalValue() in my pipeline.
  ...
}

def myGlobalValue() {
    return ['A', 'list', 'of', 'values']

// I can also reference myGlobalValue() in other methods below
def myGlobalSet() {
    return myGlobalValue().toSet()
}
0
txace