Windows で which コマンドを使えるようにする
Linux や Unix でおなじみの which コマンドが Windows にはない。よく準備するのでメモ。
準備手順
この内容を which.bat として、 パスの通っているところ(例えば C:\Windows\System32 )におけばOK。
gist においていますので、 view raw をクリックすると、ダウンロードできます。
実行結果
which コマンド名で、そのコマンドがどこに存在するのかわかります。
C:\Users\tkondou>which hg C:\Program Files\TortoiseHg\hg.exe C:\Users\tkondou>which java C:\Windows\System32\java.exe C:\Users\tkondou>which which C:\Windows\System32\which.bat
便利です。標準で欲しいですね。
Windows 7 で wget および unzip を導入 (Jenkinsのビルド成果物を取得する)
例えば Jenkins さんでビルドした成果物(archive.zip)は、Webサーバ上で公開されています。
Windows上で取得、展開したい場合、どうすればいいのでしょうか。
そこで、Windows上で使える GNU 系のツール(ここでは wget と unzip) を導入してみました。
wget
- ダウンロード
http://gnuwin32.sourceforge.net/packages/wget.htm
- インストールする
wget-1.11.4-1-setup.exe
- 環境変数PATHに追加する
C:\Program Files\GnuWin32\bin
C:\Users\tkondou>wget
SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = C:\Program Files\GnuWin32/etc/wgetrc
wgetrc_file_name = C:\cygwin\home\tkondou/.wgetrc
wget: URLがありません
使い方: wget [オプション]... [URL]...
詳しいオプションは `wget --help' を実行してください。
unzip
- ダウンロード
http://gnuwin32.sourceforge.net/packages/unzip.htm
- インストールする
unzip-5.51-1.exe
- 環境変数PATHに追加する ※既にしているのでここはパスしてください。
C:\Program Files\GnuWin32\bin
- unzip の動作確認
C:\Users\tkondou>unzip UnZip 5.51 of 22 May 2004, by Info-ZIP. Maintained by C. Spieler. Send bug reports using http://www.info-zip.org/zip-bug.html; see README for details. Usage: unzip [-Z] [-opts[modifiers]] file[.zip] [list] [-x xlist] [-d exdir] Default action is to extract files in list, except those in xlist, to exdir; file[.zip] may be a wildcard. -Z => ZipInfo mode ("unzip -Z" for usage). -p extract files to pipe, no messages -l list files (short format) -f freshen existing files, create none -t test compressed archive data -u update files, create if necessary -z display archive comment -x exclude files that follow (in xlist) -d extract files into exdir modifiers: -q quiet mode (-qq => quieter) -n never overwrite existing files -a auto-convert any text files -o overwrite files WITHOUT prompting -aa treat ALL files as text -j junk paths (do not make directories) -v be verbose/print version info -C match filenames case-insensitively -L make (some) names lowercase -$ label removables (-$$ => fixed disks) -V retain VMS version numbers -X restore ACLs (-XX => use privileges) -s spaces in filenames => '_' -M pipe through "more" pager Examples (see unzip.txt for more info): unzip data1 -x joe => extract all files except joe from zipfile data1.zip unzip -fo foo ReadMe => quietly replace existing ReadMe if archive file newer
Jenkinsさんの成果物から取得および展開
以下のようなバッチファイルを用意しました。
@echo off REM ------------------------------------------------------------------- REM brief : jenkins archive get REM Usage REM > deploy.bat http://host/job/build_job_name/lastSuccessfulBuild/artifact/ REM ------------------------------------------------------------------- REM wget : http://gnuwin32.sourceforge.net/packages/wget.htm REM unzip : http://gnuwin32.sourceforge.net/packages/unzip.htm REM ------------------------------------------------------------------- setlocal set name=archive set destination=. wget %1 unzip %name%.zip xcopy /S /E /F /G /H /R /K /Y %name%\*.* %destination% del /q %name%.zip rmdir /s /q %name%
引数に、Jenkinsの成果物のURLを渡してください。
> deploy.bat http://host/job/build_job_name/lastSuccessfulBuild/artifact/
Web経由で archive.zip を取得して、中身をカレントディレクトリに展開します。
xcopy を使ったりなんだか複雑です><
もっとスマートな方法がありそうな気はしています。
追記: xcopyじゃなくて move archive\*.* だとなぜかエラーがでます
- 作者: 山近慶一
- 出版社/メーカー: 技術評論社
- 発売日: 2011/12/09
- メディア: 単行本(ソフトカバー)
- 購入: 14人 クリック: 228回
- この商品を含むブログ (16件) を見る
コマンドプロンプトで現在時刻を表示する方法
環境変数 date と time にそれぞれ日時、時刻が格納されている。また date コマンドのオプション /t でも取得できる。
c:\>echo %date% %time% 2012/09/19 15:21:16.48 c:\>date /t 2012/09/19 c:\>time /t 15:25
[改訂新版]Windowsコマンドプロンプトポケットリファレンス
- 作者: 山近慶一
- 出版社/メーカー: 技術評論社
- 発売日: 2016/03/04
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
- 作者: 山近慶一
- 出版社/メーカー: 技術評論社
- 発売日: 2011/12/09
- メディア: 単行本(ソフトカバー)
- 購入: 16人 クリック: 246回
- この商品を含むブログ (18件) を見る
JenkinsユーザのためのWindowsバッチコマンド入門
- 作者: 山近慶一
- 出版社/メーカー: 技術評論社
- 発売日: 2011/12/09
- メディア: 単行本(ソフトカバー)
- 購入: 14人 クリック: 228回
- この商品を含むブログ (16件) を見る
Jenkins Advent Calendar jp 2011の13日目の記事になります。Windowsバッチファイルについてtipsをご紹介します。
Windowsマシンでサーバってどうなんだろうって思いつつ、転がってた少し古い Windows XP マシンに Jenkins を入れたら簡単に動作しました。その流れで実運用で使っています。Unix系のシェルスクリプトは書いたことがあったのですが、Windowsのバッチファイルは書いたことがなく、手頃な資料もなく困りました。調べたものをまとめたものです。
Windowsコマンドプロンプト基礎文法最速マスター が非常に参考になりましたので、リファレンスとしてはこちらが良いと思います。
変数の参照
%変数名% のように%で囲ってください。存在しない変数の場合はそのまま返ってきます。
引数
%数字で取得できます。%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はコンソールの出力を判定することもでき、ビルド結果を制御することもできるようになっていますので柔軟にビルド処理が組めるようになっています。
次は、@suzukima さんです。よろしくお願いします。
実験環境
- 作者: John Ferguson Smart,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/02/22
- メディア: 大型本
- 購入: 12人 クリック: 336回
- この商品を含むブログ (33件) を見る
- 作者: 末広尚義,竹内一成,太田健一郎,西川茂伸
- 出版社/メーカー: 秀和システム
- 発売日: 2012/09
- メディア: 単行本
- 購入: 5人 クリック: 121回
- この商品を含むブログ (8件) を見る