ディレクトリの存在に応じてタスクを実行する

ディレクトリの存在に応じてタスクを実行する

特定のzipファイルが利用可能な場合は、次の手順に進むJenkinsパイプラインでシェルスクリプトを作成しています。 zipファイルが存在しない場合(zipファイルを含むディレクトリ構造が利用できない場合)、何もしません。

次のコードがあります。

sh'''
    cd ''' + WORKSPACE + '''/''' + BuildLocation + '''
    var=$(find Build/ReleaseKit/Installable/ -regex "$App.*.zip" 2>/dev/null)
    echo "$var"
    if ! [ -z "$var" ]
    then
        echo "App zip found"
        unzip -o Build/ReleaseKit/Installable/App-*.zip
    fi
'''

zipファイルが見つかると、このコードは正しく機能します。

ただし、zipファイルがない場合、対応する親ディレクトリ構造も存在しません。したがって、エラーfindが発生しましたNo such directory。エラーを抑制するために2>/dev/null

上記のコードを使用すると、zipファイルが存在しない場合は次のエラーが生成されます。

+ cd /home/oracle/jenkins/workspace/RedmineAndReviewboardProject/Deployment/Build
+ pwd
/home/oracle/jenkins/workspace/RedmineAndReviewboardProject/Deployment/Build
++ find Build/ReleaseKit/Installable/ -regex '.*.zip'
+ var=
.
.
ERROR: script returned exit code 1

この状況を処理する方法: ファイルが存在する場合は、その操作を実行します。存在しない場合は何も実行されません。

ノートzipファイルが存在する場合、パスもBuild/ReleaseKit/Installable/存在します。 zipファイルが存在しない場合、パスも存在しません。

答え1

2>/dev/nullただ砂に頭を埋めてください。危険をなくすのではなく、隠すだけです。findエラーを示すために、まだ状態1で終了します。 Jenkinsshスクリプトはset -eアクティブな状態で実行されているため、シェルスクリプトはすぐに停止します。

を実行する前に、ディレクトリが存在するかどうかをテストしてくださいfind

以下のコードスニペットでは、いくつかの追加の変更を適用しました。

  • dir代わりにJenkinsを使用してくださいcd
  • find -regexリテラルを見つけるために渡された正規表現を修正します.(一致を避けるためwibble.not-a-zip)。
  • 二重否定! [ -z "$var" ]をに簡素化します[ -n "$var" ]
dir(WORKSPACE + '/' + BuildLocation) {
    sh '''
        if [ -d Build/ReleaseKit/Installable ]; then
            var=$(find Build/ReleaseKit/Installable/ -regex "$App.*\\.zip" 2>/dev/null)
            echo "$var"
            if [ -n "$var" ]
            then
                echo "App zip found"
                unzip -o Build/ReleaseKit/Installable/App-*.zip
            fi
    '''
}

ファイルは明らかに、Installableサブ(*)ディレクトリのより深い場所ではなく、ディレクトリ内になければなりませんfind

dir(WORKSPACE + '/' + BuildLocation) {
    sh '''
        set Build/ReleaseKit/Installable/"$App"*.zip
        if [ -e "$1" ]; then
            echo "App zip found: $1"
            unzip -o "$1"
        fi
    '''
}

Groovyでは、次のコマンドを使用してshにファイルがあるかどうかをテストできます。パイプラインユーティリティステッププラグイン

dir(WORKSPACE + '/' + BuildLocation) {
    def zips = findFiles glob: "Build/ReleaseKit/Installable/${App}*.zip"
    if (findFiles.length > 0) {
        env.app_zip = zips[0]
        sh 'unzip ${app_zip}'
    }
}

(すべてのコードスニペットはテストされていません。)

関連情報