Jenkins Declarative Pipeline で複数行の Windows コマンド or シェルスクリプトを実行する

Declarative Pipeline v1.2 以降で検証。最近 Jenkins づいている。

Declarative Pipeline の shbat コマンドは、シングルクォートを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 サーバが 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 コマンド実行後に止まり続けるので止めよう。