マルチブランチプロジェクト用の宣言型パイプラインスクリプトがあり、テキストファイルを読み取り、その結果を文字列変数として保存して、パイプラインの後続のステップでアクセスできるようにします。スニペットジェネレーターを使用して、次のようなことを試みました。
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
ステップを使用する必要がありますか?もしそうなら、どのように?
ありがとう
このエラーは、steps
ディレクティブ内でのみパイプラインステップを使用できるためです。私が知っている回避策の1つは、script
ステップを使用し、その中に任意のパイプラインスクリプトをラップし、後で使用できるように環境変数に結果を保存することです。
あなたの場合:
pipeline {
agent any
stages {
stage("foo") {
steps {
script {
env.FILENAME = readFile 'output.txt'
}
echo "${env.FILENAME}"
}
}
}
}
ドキュメントによれば 、後でスクリプトの他の部分で変数の値を使用する場合、グローバル環境変数を設定することもできます。あなたの場合、それはルートパイプラインに設定することになります:
pipeline {
...
environment {
FILENAME = readFile ...
}
...
}
environment
ステップに関数を追加することでこれを回避しました、つまり:
environment {
ENVIRONMENT_NAME = defineEnvironment()
}
...
def defineEnvironment() {
def branchName = "${env.BRANCH_NAME}"
if (branchName == "master") {
return 'staging'
}
else {
return 'test'
}
}
まだコメントすることはできませんが、ヒント: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()のようにトリムしたい場合があります
スクリプト化されたパイプラインの完全な例:
stage('Build'){
withEnv(["GOPATH=/ws","PATH=/ws/bin:${env.PATH}"]) {
sh 'bash build.sh'
}
}