secretbase.log

.NET/C#/Pythonなど

Jenkins の Mercurial プラグイン を rollback した状態でも ポーリングができるように改良しました

概要

JenkinsとMercurialを組み合わせ、公開リポジトリにpushするコードはクリーンなコード(ビルドとテスト済み)としたい。その前に行ういわゆるプライベートビルドとテスト(以降、検証ビルドを呼びます)を Jenkins で行い、検証ビルドに合格したものを 公開リポジトリに push するという WEB+DB PRESSのVol.67 の記事にあるような環境を構築しました。
検証ビルドに失敗した場合に、そのpushは無かったことにするために hg rollback をします。しかし、次の Jenkins のポーリングでエラーとなってしまい、それ以降検証ビルドができなくなります(ビルドボタンを手で押せば回復しますがせっかくの自動化システムで面倒ですよね)

動作環境

まず動作環境について図で説明します。公開リポジトリにpushする前に、検証ビルドを行なっています。
f:id:cointoss1973:20120505010058p:image:w640

エラーになる状況の例

エラーになる状況をhgのchangesetとrollbackした場合のエラーメッセージについて説明します。
下記リポジトリで、 hg rollback した場合、 4:cf99ef461cd7 が rollback されるケースです。

@  チェンジセット:   4:cf99ef461cd7
|  タグ:             tip
|  ユーザ:           Takayuki KONDO <tkondou@gmail.com>
|  日付:             Sat May 05 00:09:40 2012 +0900
|  要約:             44
|
o  チェンジセット:   3:4ba5c267c1ce
|  ユーザ:           Takayuki KONDO <tkondou@gmail.com>
|  日付:             Fri May 04 17:28:34 2012 +0900
|  要約:             333
|
o  チェンジセット:   2:9d33783e9a81
|  ユーザ:           Takayuki KONDO <tkondou@gmail.com>
|  日付:             Fri May 04 15:53:41 2012 +0900
|  要約:             change 22222
|
o  チェンジセット:   1:7db2e5c5774c
|  ユーザ:           Takayuki KONDO <tkondou@gmail.com>
|  日付:             Fri May 04 15:52:50 2012 +0900
|  要約:             change 11111
|
o  チェンジセット:   0:123a1e077203
   ユーザ:           Takayuki KONDO <tkondou@gmail.com>
   日付:             Fri May 04 15:52:26 2012 +0900
   要約:             README added

問題

Jenkinsのポーリング時、hg status がエラー(未知のリビジョン)となってしまい、それ以降ポーリングによるビルドが走ることがなくなってしまいます。

f:id:cointoss1973:20120505010417p:image:w640

....
[workspace] $ hg status --rev cf99ef461cd787fcef9d32b4018f141634e2dfa0 --rev 4ba5c267c1ce68ef73c0ae4d2bae1ad8713d96b0
ERROR: Failed to run hg status --rev cf99ef461cd787fcef9d32b4018f141634e2dfa0 --rev 4ba5c267c1ce68ef73c0ae4d2bae1ad8713d96b0
中断: 'cf99ef461cd787fcef9d32b4018f141634e2dfa0' は未知のリビジョンです!
FATAL: Failed to compare with remote repository
...

原因

Jenkins の workspace 内のリポジトリを rollback する運用を想定していないためと思われます。

対応

rollback した場合、 Jenkins内で認識している pull した 最新Revを、現在のRevに合わせることでエラーを発生しないようにしました。

Jenkins + Mercurial でプライベートビルドをJenkinsで自動化しているような環境を構している方(日本でやっている方はどれだけいるだろう)にオススメする改良だとは思います。


WEB+DB PRESS Vol.67

WEB+DB PRESS Vol.67


入門Mercurial Linux/Windows対応

入門Mercurial Linux/Windows対応


Jenkins

Jenkins