Jenkins Declarative Pipeline で複数行の Windows コマンド or シェルスクリプトを実行する
Declarative Pipeline v1.2 以降で検証。最近 Jenkins づいている。
Declarative Pipeline の sh
や bat
コマンドは、シングルクォートを3つ '''
ずつ使って行を囲むことで、複数行の Windows コマンドやシェルスクリプトを実行できる。
pipeline {
agent any
stages {
stage('複数行の Windows コマンド') {
steps {
// シングルクォート3つで囲む
bat '''
Setlocal EnableDelayedExpansion
some_cmd.bat
If Not !ERRORLEVEL! == 0 (
Echo 失敗 !ERRORLEVEL!
) Else (
Echo 成功: !ERRORLEVEL!
)
'''
}
}
stage('複数行のシェルスクリプト') {
steps {
sh '''
sh ./some_shell.sh
echo HogeFuga
'''
}
}
}
}
Windows コマンドで %ERRORLEVEL%
などの変数を参照する際は、Setlocal EnableDelayedExpansion
で遅延展開を有効にし、!ERRORLEVEL!
を使うようにする。パイプラインに記述したコマンドは複数行全てを展開してから実行されるので、遅延展開させる必要がある。
組み合わせるコマンドによっては、複数行で書くと後続のコマンドがうまく実行されないことがあった。そういう時は
bat 'echo ほげ'
bat 'echo ふが'
というように、1行ごとに bat
コマンドを分けて書いてやるしかない。
- 参考 : Jenkinsビルドの「シェルで実行」の失敗/成功を操作する - Qiita
- 参考 : Jenkins pipeline - try catch for particular stage and subsequent conditional step - Stack Overflow
- 参考 : Jenkins and return code from windows batch - Stack Overflow
実行する Jenkins サーバが Windows Server なのか Linux サーバなのか、つまり実行環境の OS が Unix 系なのかどうかは、isUnix()
という関数で判定できる。これを利用する際は script
ブロックを使うことになるようだ。
pipeline {
agent any
stages {
stage('Unix 系 OS 判定') {
steps {
script {
if(isUnix()) {
sh 'ls'
}
else {
bat 'dir'
}
}
}
}
}
}
ブレースとインデントがエグくなりがち…。
ちなみに、以前も書いたが、Windows 環境で日本語を含むジョブ名 = ワークスペースディレクトリ名にすると、bat
コマンド実行後に止まり続けるので止めよう。