私のパイプラインのステップは、.tarをアーティファクトサーバーにアップロードします。 env.BUILD_NUMBERを渡すと、不正な置換エラーが発生しますが、番号をハードコードすると同じコマンドが機能します。スクリプトはjenkinsを介してgroovyで記述され、jenkinsワークスペースで実行されています。
sh 'curl -v --user user:password --data-binary ${buildDir}package${env.BUILD_NUMBER}.tar -X PUT "http://artifactory.mydomain.com/artifactory/release-packages/package${env.BUILD_NUMBER}.tar"'
エラーを返します。
[Pipeline] sh
[Package_Deploy_Pipeline] Running Shell script
/var/lib/jenkins/workspace/Package_Deploy_Pipeline@tmp/durable-4c8b7958/script.sh: 2:
/var/lib/jenkins/workspace/Package_Deploy_Pipeline@tmp/durable-4c8b7958/script.sh: Bad substitution
[Pipeline] } //node
[Pipeline] Allocate node : End
[Pipeline] End of Pipeline
ERROR: script returned exit code 2
ビルド番号をハードコードしてスワップアウトする場合${env.BUILD_NUMBER}
エラーが発生せず、コードが正常に実行されます。
sh 'curl -v --user user:password --data-binary ${buildDir}package113.tar -X PUT "http://artifactory.mydomain.com/artifactory/release-packages/package113.tar"'
同じスクリプト内の他のshコマンド内で$ {env.BUILD_NUMBER}を使用していますが、他の場所では問題はありません。
これは構文の問題であることが判明しました。コマンドを'
でラップすると、値の代わりに${env.BUILD_NUMBER
が渡されます。コマンド全体を"
sでラップし、ネストをエスケープしました。現在は正常に動作します。
sh "curl -v --user user:password --data-binary ${buildDir}package${env.BUILD_NUMBER}.tar -X PUT \"http://artifactory.mydomain.com/artifactory/release-packages/package${env.BUILD_NUMBER}.tar\""
実際、env
変数を誤解しているようです。 sh
ブロックで、${BUILD_NUMBER}
に直接アクセスする必要があります。
理由/説明:env
は、スクリプト内の環境を表します。この環境は、実行されるものすべてに直接使用/利用可能です。シェルスクリプト。
env.*
には何も書き込まず、代わりにwithEnv{}
ブロックを使用することにも注意してください。
通常、次の最も一般的な問題:
悪い代用
エラーは、sh
の代わりにbash
を使用することです。
特にJenkinsを使用する場合、シェルを実行する場合は、CommandShebangで始まる、例えば#!/bin/bash -xe
または #!/usr/bin/env bash
。
私は間違いなく言うことができます、それはshシェルとbashシェルについてのすべてです。次のように#!/bin/bash -xe
を指定して、この問題を修正しました。
node {
stage("Preparing"){
sh'''#!/bin/bash -xe
colls=( col1 col2 col3 )
for eachCol in ${colls[@]}
do
echo $eachCol
done
'''
}
}
Jarファイルのアーティファクトで{env.MAJOR_VERSION}
を表示する際に問題が発生していました。 Jenkinsfileで環境ステップを維持することでアプローチすることを示します。
pipeline {
agent any
environment {
MAJOR_VERSION = 1
}
stages {
stage('build') {
steps {
sh 'ant -f build.xml -v'
}
}
}
post {
always{
archiveArtifacts artifacts: 'dist/*.jar', fingerprint: true
}
}
}
私はこの問題を解決しましたが、Jenkinsビルドの出力に不適切な代替が表示されませんでした。そのため、環境ステップはJenkinsfileでより重要な役割を果たします。