web-dev-qa-db-ja.com

Jenkinsfileで変数を設定および参照する方法

マルチブランチプロジェクト用の宣言型パイプラインスクリプトがあり、テキストファイルを読み取り、その結果を文字列変数として保存して、パイプラインの後続のステップでアクセスできるようにします。スニペットジェネレーターを使用して、次のようなことを試みました。

filename = readFile 'output.txt'

filenameは私の文字列です。

Jenkinsコンソールの出力にエラーが表示されます。

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 30: Expected a step @ line 30, column 5.
            filename = readFile 'output.txt'

withEnvの出力をJenkins環境変数に設定するには、readFileステップを使用する必要がありますか?もしそうなら、どのように?

ありがとう

25
Dalton Sweeney

このエラーは、stepsディレクティブ内でのみパイプラインステップを使用できるためです。私が知っている回避策の1つは、scriptステップを使用し、その中に任意のパイプラインスクリプトをラップし、後で使用できるように環境変数に結果を保存することです。

あなたの場合:

pipeline {
    agent any
    stages {
        stage("foo") {
            steps {
                script {
                    env.FILENAME = readFile 'output.txt'
                }
                echo "${env.FILENAME}"
            }
        }
    }
}
41
Jon S

ドキュメントによれば 、後でスクリプトの他の部分で変数の値を使用する場合、グローバル環境変数を設定することもできます。あなたの場合、それはルートパイプラインに設定することになります:

pipeline {
  ...
  environment {
    FILENAME = readFile ...
  }
  ...
}
18
Adam Link

environmentステップに関数を追加することでこれを回避しました、つまり:

environment {
    ENVIRONMENT_NAME = defineEnvironment() 
}
...
def defineEnvironment() {
    def branchName = "${env.BRANCH_NAME}"
    if (branchName == "master") {
        return 'staging'
    }
    else {
        return 'test'
    }
}
2
Jansky

まだコメントすることはできませんが、ヒント:try/catch句を使用してパイプラインの破損を防ぎます(ファイルが存在することが確実な場合は無視してください)

    pipeline {
        agent any
            stages {
                stage("foo") {
                    steps {
                        script {
                            try {                    
                                env.FILENAME = readFile 'output.txt'
                                echo "${env.FILENAME}"
                            }
                            catch(Exception e) {
                                //do something i.e echo 'File not found'
                            }
                        }
                   }
    }

別のヒント(これは@haoによってコメントされ、共有する価値があると思います):このreadFile( 'output.txt')。trim()のようにトリムしたい場合があります

1
Paulo Vinícius

スクリプト化されたパイプラインの完全な例:

       stage('Build'){
            withEnv(["GOPATH=/ws","PATH=/ws/bin:${env.PATH}"]) {
                sh 'bash build.sh'
            }
        }
0
Qiang Li