web-dev-qa-db-ja.com

ジェンキンスパイプラインsh bad substitution

私のパイプラインのステップは、.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}を使用していますが、他の場所では問題はありません。

28
Stephen Nichols

これは構文の問題であることが判明しました。コマンドを'でラップすると、値の代わりに${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\""
54
Stephen Nichols

実際、env変数を誤解しているようです。 shブロックで、${BUILD_NUMBER}に直接アクセスする必要があります。

理由/説明:envは、スクリプト内の環境を表します。この環境は、実行されるものすべてに直接使用/利用可能です。シェルスクリプト。

env.*には何も書き込まず、代わりにwithEnv{}ブロックを使用することにも注意してください。

20
patric.schenke

通常、次の最も一般的な問題:

悪い代用

エラーは、shの代わりにbashを使用することです。

特にJenkinsを使用する場合、シェルを実行する場合は、CommandShebangで始まる、例えば#!/bin/bash -xe または #!/usr/bin/env bash

17
kenorb

私は間違いなく言うことができます、それはshシェルとbashシェルについてのすべてです。次のように#!/bin/bash -xeを指定して、この問題を修正しました。

node {
    stage("Preparing"){
        sh'''#!/bin/bash -xe
            colls=( col1 col2 col3 )
            for eachCol in ${colls[@]}
            do
              echo $eachCol
            done
        '''
    }      
}
12
Gary Gan

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でより重要な役割を果たします。

1
Aamir M Meman