Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Bazaarの中央ブランチへのpushをHudsonのビルドトリガにしたい

タグ: Bazaar Hudson
# Subversionのpost-commitフック
REPOS="$1"
REV="$2"

SVNLOOK=/usr/bin/svnlook
CHANGED_DIRS=`$SVNLOOK dirs-changed -r $REV $REPOS`

# trunkにコミットされたらHudosnにビルド要求を出す
if echo $CHANGED_DIRS | grep "^trunk" > /dev/null
then
    wget -q -O /dev/null "http://localhost:8080/job/test/build"
fi

上記はSubversionのフックスクリプトだが、これをBazaarでやりたい。

リポジトリごとにフック置き場が用意されているSubversionとは違い、Bazaarのフックはプラグインの一種として「システム全体のプラグイン置き場」か「個人のプラグイン置き場」に置かなければならない。
それはつまりフックの中で「pushされたブランチの絶対パスを特定しなければならない」ということなので、まずは下記の様なフックを用い、ブランチの位置についてどのような情報を得られるのかを確認しておくことにする。

from bzrlib import branch

def print_branch(param):
    import os
    os.system('echo "%s" >> /var/tmp/branch.txt' % param.branch);

branch.Branch.hooks.install_named_hook('post_change_branch_tip', print_branch, 'print branch')

なお、このフックのトリガは「push」ではなく「tipの変更」である。よってcommitやuncommitでも動作する。
どちらかというとこちらの方が元々の用途にはあっているし、そもそもpushはクライアント側でしかフックできないため、pushされる側に置くことができない。

実行環境:

  • MacOS X 10.6.5
  • Python 2.6.1
  • Bazaar 2.2.0
$ mkdir -p /var/tmp/bzr/local
$ cd  /var/tmp/bzr/local
$ bzr init

まずはこうしてブランチを作って……

$ bzr commit --unchanged
BzrBranch7(file:///private/var/tmp/bzr/local/)

パスを省略したcommitの場合、パスはrealpathになる。

$ bzr commit --unchanged /var/tmp/bzr/local
BzrBranch7(file:///var/tmp/bzr/local/)

絶対パスを指定したcommitの場合、パスは指定した絶対パスになる。

$ bzr push bzr+ssh://idlysphere@localhost/var/tmp/bzr/remote
BzrBranch7(filtered-4319272656:///var/tmp/bzr/remote/)
RemoteBranch(bzr+ssh://idlysphere@localhost/var/tmp/bzr/remote/)

bzr+sshの場合、サーバ側のフック(前者)はプロトコル部がフィルタされた絶対パスになる。

以上のことから考えると、たとえば /var/bzr/central のブランチを監視したい場合は

from bzrlib import branch

def auto_build(param):
    import os
    from urlparse import urlparse
    if os.path.samefile(urlparse(param.branch.base).path, '/var/bzr/central'):
        import urllib
        urllib.urlopen('http://localhost:8080/job/test/build')

branch.Branch.hooks.install_named_hook('post_change_branch_tip', auto_build, 'auto build')

こんな風に書いておけば良さそう?

HudsonとWindowsバッチコマンドの実行

タグ: Hudson

Hudson 1.351のビルド手順の1種「Windowsバッチコマンドの実行」はテキストをバッチファイルとして実行するが、そのバッチファイルの最後には「exit 0」という行が追加される。
そうとは知らずにこのようなテキストを書いてビルドすると、

CALL :COPY "foo\foo.dll"
CALL :COPY "bar\bar.dll"
CALL :COPY "baz\baz.exe"
GOTO :EOF

:COPY
COPY %1 artifacts
IF EXIST "%~dpn1.pdb" COPY "%~dpn1.pdb" artifacts

CALL :COPY してからEOFに辿り着くまでの間に exit 0 が実行されることになるため、 CALL から戻ることなくバッチ処理が終了してしまう。

ユーザーanonymousが実行
マスターでビルドします。
[workspace] $ cmd /c call C:\DOCUME~1\IDLYSP~1\LOCALS~1\Temp\hudson2823170059005737540.bat

C:\hudson\jobs\test\workspace>CALL :COPY "foo\foo.dll" 

C:\hudson\jobs\test\workspace>COPY "foo\foo.dll" artifacts 
        1 個のファイルをコピーしました。

C:\hudson\jobs\test\workspace>IF EXIST "C:\hudson\jobs\test\workspace\foo\foo.pdb" COPY "C:\hudson\jobs\test\workspace\foo\foo.pdb" artifacts 

C:\hudson\jobs\test\workspace>exit 0 
Finished: SUCCESS

よって末尾で不要に思えても GOTO :EOF を欠かしてはならない。

CALL :COPY "foo\foo.dll"
CALL :COPY "bar\bar.dll"
CALL :COPY "baz\baz.exe"
GOTO :EXIT

:COPY
COPY %1 artifacts
IF EXIST "%~dpn1.pdb" COPY "%~dpn1.pdb" artifacts
GOTO :EOF

:EXIT

また、「Windowsバッチコマンドの実行」が生成するバッチファイルは改行コードが「CRLF」ではなく「LF」になっている。
2バイト文字を使っていると実行時に一部の文字が消失してしまうことになるのでその点も注意が必要。

Hudsonプラグイン使用感その2

タグ: Hudson

Warnings Plugin 3.2
http://wiki.hudson-ci.org/display/HUDSON/Warnings+Plugin

Static Analysis Utilitiesを使ったStatic Code Analysis Plug-insの1つ。
プロジェクトの「設定」で「コンパイラの警告の集計」にチェックを入れておくと、ビルドごとにコンソールログ等を解析し、警告(エラー含む)の集計を行う。
コンソールログだけの状態より警告の概観がずっと楽になる。

以下、使っていて気付いたあれこれ。


Subversion Plugin 1.11
http://wiki.hudson-ci.org/display/HUDSON/Subversion+Plugin

Subversionのリポジトリからファイルをチェックアウトしたり、ビルドに使用したリビジョンに「タグを設定」するプラグイン。
「タグを設定」したビルドは「ビルド履歴」で一望できる。
便利な機能だが、

  • 「タグを設定」時に平常時と異なる認証情報を使うことができるが、この認証が成功した試しがない
  • 「タグを設定」のコメントに日本語を含めると文字化けする

といった問題がある。


Promoted Builds Simple Plugin 1.11
http://wiki.hudson-ci.org/display/HUDSON/Promoted+Builds+Simple+Plugin

Promoted Builds Pluginの簡易版。

  • 成功ビルドを手動で「昇進」させる
    simple_promote.png
  • 昇進にはレベルがあり、レベルごとに任意のアイコンを表示できる(ただしこの設定は全プロジェクト共用)
    qa_build.png
  • 昇進させたものを後から降格できる
  • マルチ構成プロジェクトではマスタービルドだけでなくサブビルドも昇進できる
  • 昇進させたビルドは自動的に「保存」される(サブビルド含め)
  • プラグインを有効にしていなかった時期のビルドは昇進の対象外
  • Promoted Builds Pluginとは違い、失敗ビルドは昇進させられない
  • Promoted Builds Pluginと併用可能

昇進とか考えず、単に「成功ビルドを保存しつつアイコンを付けるプラグイン」と考えると良い。

Hudson Warnings PluginとVCBuild /M2

タグ: Hudson VS2005

VCBuild.exeは/Mオプションを使うことでソリューション内の複数のプロジェクトを並行ビルドできる。

C:\temp>VCBuild.exe /M2 test.sln

並行ビルドでは複数のビルドプロセスの診断メッセージが入り交じることになるので、そのメッセージがどのプロセスに属するものかを識別するために、診断メッセージの先頭にはビルドプロセス番号が記される。

1>ビルド 開始: プロジェクト: Hoge、構成: Debug|Win32
2>ビルド 開始: プロジェクト: Fuga、構成: Debug|Win32
1>コンパイルしています...
2>コンパイルしています...
1>hoge.cpp
2>fuga.cpp
1>c:\temp\hoge\hoge.cpp(15) : warning C6386: バッファ オーバーランです:
1>c:\temp\hoge\hoge.cpp(24) : warning C6386: バッファ オーバーランです:
1>c:\temp\hoge\hoge.cpp(34) : warning C6386: バッファ オーバーランです:
1>c:\temp\hoge\hoge.cpp(35) : warning C6386: バッファ オーバーランです:
2>c:\temp\fuga\fuga.cpp(13) : warning C6386: バッファ オーバーランです:
2>c:\temp\fuga\fuga.cpp(36) : warning C6385: 無効なデータです:

しかるにHudson Warnings Plugin 3.2のMSBuildパーサはこのビルドプロセス番号を含む表記に正しく対応しておらず、コンパイラの警告ビューの詳細タブからソースコードを表示させようとしても

Caused by: java.io.FileNotFoundException: 1>c:\temp\hoge\hoge.cpp (No such file or directory)

とエラーになってしまう。
原因はMSBuildパーサがビルドプロセス番号までファイルパスの一部と認識しているからなので、MsBuildParser.javaの正規表現の先頭部分

private static final String MS_BUILD_WARNING_PATTERN = "(?:(?:

にビルドプロセス番号を無視する記述を加えて

private static final String MS_BUILD_WARNING_PATTERN = "(?:\\d+>)?(?:(?:

こうすれば表示できるようになる。

Hudson MSBuild Plugin使用感

タグ: Hudson

Hudson MSBuild Plugin 1.3
http://wiki.hudson-ci.org/display/HUDSON/MSBuild+Plugin

Visual Studioのソリューションをビルドするプラグイン。
このプラグインには「システムの設定」でMSBuild.exeのパスを複数設定しておき、「プロジェクトの設定」で任意のパスを選択するという使い方が用意されている。

  • システムの設定
    システムの設定
  • プロジェクトの設定
    プロジェクトの設定

しかしこの機能はスレーブ(というか「Visual StudioがインストールされているWindows」以外のマスター)の存在を考慮にいれていないらしく、マスターにMSBuild.exeがないとビルドに失敗する。

FATAL: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe doesn't exist
Finished: FAILURE

また、このプラグインはビルドに渡したパラメータを勝手にMSBuildのコマンドライン引数に付け加えるため、このようなパラメータを渡すとエラーになる。

target=Clean;Build
[workspace] $ cmd.exe /C MSBuild.exe /p:Configuration=Release /t:%target% -P:target=Clean;Build hoge.sln && exit %%ERRORLEVEL%%
Microsoft(R) Build Engine Version 2.0.50727.3053
[Microsoft .NET Framework, Version 2.0.50727.3603]
Copyright (C) Microsoft Corporation 2005. All rights reserved.

MSBUILD : エラー MSB1006: プロパティが無効です。
スイッチ: Build

結局、単にビルドしたいだけならこのプラグインは使わず、ノードごとに環境変数でパスを通して「Windowsバッチコマンドの実行」で

MSBuild.exe /p:Configuration=Release /t:%target% hoge.sln

こう書いた方が扱いやすい。

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。