secretbase.log

.NET/C#/Pythonなど

JenkinsユーザのためのWindowsバッチコマンド入門

Windows コマンドプロンプト ポケットリファレンス

Windows コマンドプロンプト ポケットリファレンス


Jenkins Advent Calendar jp 2011の13日目の記事になります。Windowsバッチファイルについてtipsをご紹介します。
Windowsマシンでサーバってどうなんだろうって思いつつ、転がってた少し古い Windows XP マシンに Jenkins を入れたら簡単に動作しました。その流れで実運用で使っています。Unix系のシェルスクリプトは書いたことがあったのですが、Windowsのバッチファイルは書いたことがなく、手頃な資料もなく困りました。調べたものをまとめたものです。

Windowsコマンドプロンプト基礎文法最速マスター が非常に参考になりましたので、リファレンスとしてはこちらが良いと思います。


基本

echo でメッセージが出力できます。環境変数の値を見たい場合は、%で囲んでください。echo は ECHOでも同じ意味です。大文字小文字の区別はありません。

echo %PATH%

変数の参照

%変数名% のように%で囲ってください。存在しない変数の場合はそのまま返ってきます。

引数

%数字で取得できます。%0はプログラム名で %1から引数になります。

echo %1 %2

終了コードの返却

exit /b [終了コード] を指定することで ERRORLEVEL として返却することができます。

exit /b 0

戻り値の判定と設定方法 (ERRORLEVEL)

Jenkinsでバッチコマンドを実行する場合、戻り値が重要です。
ビルドステップでのシェルやバッチでは、戻り値が0の場合、成功、それ以外は失敗と判断されます。
呼び出したバッチファイルやコマンドの戻り値は、環境変数のERRORLEVELに入りますのでそれで判定します。

if not %ERRORLEVEL% == 0 (
	exit /b %ERRORLEVEL%
)

環境変数の一時使用(setlocal/endlocal)

setlocal
endlocal

で囲んでおくと、setlocal以降に設定した環境変数は、そのバッチファイル中のみで有効なため一時使用ができます。バッチファイルを抜けると元に戻るため、環境変数を汚さず済みます。
endlocal は明示的に呼ばなくても良いです。(バッチファイルの終了時にも暗黙に実行される)

バッチファイル実行(call)

call で呼ぶことが大事です。callで呼ばないとJenkins側から呼び出した最初のバッチコマンドが終了するとそのまま終了してしまいます。

call build.bat

Windowdバッチコマンドの設定例 (JOBのサンプル)

実際のクロスコンパイラのJOBの設定です。
JenkinsのJOBには、下記の設定をしておきます。

SETUP.batはチェックアウトしたprojectファイルをJenkinsのworkspaceのパスに調整するものですが本題と離れるので割愛します。

build.batは、こんな感じで、ビルド用のバッチファイル書きました。

  • build.bat
@echo off
setlocal
rem BUILD script of WindRiver Workbench project

rem *** Customize PROJECT variable to your project name ***
SET PROJECT=SAMPLE_DKM

SET CUR_DIR=%~dp0
rem SET BUILD_SPEC=build
SET BUILD_SPEC=rebuild

echo **********************************************
echo *** %BUILD_SPEC% DKM module                ***
echo **********************************************
CALL C:\WindRiver\wrenv.exe -p vxworks-6.8 wr_update.bat %CUR_DIR% %PROJECT% %BUILD_SPEC%
echo ERRORLEVEL = %ERRORLEVEL%
if not %ERRORLEVEL% == 0 (
	endlocal
	echo *** %BUILD_SPEC% failed. %ERRORLEVEL% ***
	exit /b %ERRORLEVEL%
)

endlocal
echo %BUILD_SPEC% completed.
exit /b
  • wr_update.bat
@echo off
CALL wrws_update.bat -data %1 -l %2 -b %3
if not %ERRORLEVEL% == 0 (
	echo *** wrws_update failed. %ERRORLEVEL% ***
	exit /b %ERRORLEVEL%
)


wrenv で、ビルドコマンドを指定するバッチファイルを指定する仕様ですが、wrenvは指定したバッチファイルが実行さえできれば正常なため、ビルドエラーになって戻り値は0(正常)です。Jenkinsでビルド失敗を戻り値で判断できないのです。困った。

%ERRORLEVEL% にて判定できない場合の対処 (Log Parser Pluginを使う)

ビルドした出力はコンソールに出ています。戻り値の判定で、Jenkinsのビルドを失敗にすることはできませんが、  Log Parser Plugin を使って Console を解析することで、エラーにできます。

まず、Log Parser Plugin を追加してください。
本サンプルJOBでは、ビルドエラー時に以下のようなエラーがコンソールに出力されます。

************************************************************
Build Started in Project 'SAMPLE_DKM':   2011-12-12 20:37:50
Generation of makefiles started.
Generation of makefiles finished (Elapsed Time: 00:01).
Platform: Wind River VxWorks 6.8
Command: make --no-print-directory BUILD_SPEC=PPC32e500v2diab_SMP DEBUG_MODE=1
Working Directory: C:/Jenkins/workspace/SAMPLE_build_fail/VxWorks6.8/SAMPLE_DKM/PPC32e500v2diab_SMP
building SAMPLE_DKM_partialImage/Debug/Objects/SAMPLE_DKM/sample.o
"C:/Jenkins/workspace/SAMPLE_build_fail/VxWorks6.8/SAMPLE_DKM/conf.h", line 4: catastrophic error (etoa:4005): could not open source file "conf_env.h"
  #include "conf_env.h"
                                             ^
1 catastrophic error detected in the compilation of "C:/Jenkins/workspace/SAMPLE_build_fail/sample.cpp".
Compilation terminated.
C:\WindRiver\utilities-1.0\x86-win32\bin\make.exe: *** [SAMPLE_DKM_partialImage/Debug/Objects/SAMPLE_DKM/sample.o] Error 1
Build Failed in Project 'SAMPLE_DKM' (Process Exit Value was '2'):   2011-12-12 20:37:53   (Elapsed Time: 00:03)
************************************************************
Finished Workspace Update Application.
ERRORLEVEL = 0
 completed.
Build step 'Console output (build log) parsing' changed build result to FAILURE
Finished: FAILURE

Compilation terminated. がコンパイルを中止時に出ていますので、これをエラーと判断することにします。

error /Compilation terminated./

と書いて、適当なテキストファイルで保存します。たとえば、
C:\jenkins\rules\dcc_rules.txt

"システムの設定"で、Console Output Parsingを設定しておきます。


これで、ビルドエラー時に失敗となります。

Parsed Console Outputで詳細を見られます。

コンソールの解析した箇所も色がつきます。

最後に

いかがでしたでしょうか。

Windowsバッチファイルのはっきりしたリファレンスが見つからず、心残りではありますが書けるようになったかと思います。
またJenkinsはコンソールの出力を判定することもでき、ビルド結果を制御することもできるようになっていますので柔軟にビルド処理が組めるようになっています。

次は、@ さんです。よろしくお願いします。

実験環境

Jenkins

Jenkins


入門Jenkins―実践「継続的インテグレーション」

入門Jenkins―実践「継続的インテグレーション」