URL Change Triggerの改造
shin1ogawaさんとaqubiさんの家に遊びに行ったときに、Hudsonをプロジェクトで使っている話をお聞きしました。
そこで、Hudsonをビルドサーバとテストサーバの二つに分けて運用していて、ビルドサーバがビルド終了後ファイルサーバにアップロードし、その後テストサーバがテストを実施したい、という要望を聞きました。
ただし、テストサーバのテストは丸一日にかかってしまうそうで、できれば定期的にファイルサーバの更新をチェックしたい、とのことでした。
そのときは自分でプラグインを書けばなんとかなります、という返事をしたのですが、その後URL Change Triggerというプラグインがあったことに気づき、これを使ってみてはどうかということを提案してみました。
しかし、そのプラグインはほぼ毎分更新チェックをしているらしく、ソースコードを見ていると確かに毎分チェックしにいくようにハードコーディングされていました。
しかも、URLクラスを使ってファイルを書き出しMD5の値をチェックしています。
大容量ファイルをチェックする場合は時間がかかりすぎるため、この実装は自分の中ではないなー、というところです。
これだと流石に要望には答えられないので、とりあえず「定期的に実行」と同じようにcronライクなスケジュール設定ができるようにしました。
ビューは以下のようになります。
以下、パッチを載せます。
Index: src/main/resources/com/redfin/hudson/UrlChangeTrigger/config.jelly =================================================================== --- src/main/resources/com/redfin/hudson/UrlChangeTrigger/config.jelly (revision 12056) +++ src/main/resources/com/redfin/hudson/UrlChangeTrigger/config.jelly (working copy) @@ -12,5 +12,9 @@ evaluates to null, and you'll get an empty text box, which is just what we want. --> <f:textbox name="urlChangeTrigger.url" value="${instance.url}" /> - </f:entry> + + </f:entry> + <f:entry title="${%Schedule}" help="/help/project-config/timer-format.html"> + <f:textarea name="urlchange_spec" checkUrl="'${rootURL}/trigger/TimerTrigger/check?value='+escape(this.value)" value="${instance.spec}"/> + </f:entry> </j:jelly> \ No newline at end of file Index: src/main/java/com/redfin/hudson/UrlChangeTrigger.java =================================================================== --- src/main/java/com/redfin/hudson/UrlChangeTrigger.java (revision 12056) +++ src/main/java/com/redfin/hudson/UrlChangeTrigger.java (working copy) @@ -26,6 +26,7 @@ import antlr.ANTLRException; /** Triggers a build when the data at a particular URL has changed. */ + public class UrlChangeTrigger extends Trigger<BuildableItem> { URL url; @@ -67,17 +68,9 @@ return checksumSb.toString(); } - public UrlChangeTrigger(String url) throws MalformedURLException { - this(new URL(url)); - } - - public UrlChangeTrigger(URL url) { - this.url = url; - try { - this.tabs = CronTabList.create("* * * * *"); - } catch (ANTLRException e) { - throw new RuntimeException("Bug! couldn't schedule poll"); - } + public UrlChangeTrigger(String spec, String url) throws MalformedURLException, ANTLRException { + super(spec); + this.url = new URL(url); } @Override @@ -148,11 +141,14 @@ @Override public UrlChangeTrigger newInstance(StaplerRequest req, JSONObject formData) throws FormException { String url = formData.getString("url"); + String spec = formData.getString("urlchange_spec"); try { - return new UrlChangeTrigger(url); + return new UrlChangeTrigger(spec, url); } catch (MalformedURLException e) { throw new FormException("Invalid URL: " + url, e, ""); - } + } catch (ANTLRException e) { + throw new FormException("Invalid URL: " + url, e, ""); + } } }
テスト環境が無く全然試せてないので、ひょっとするとバグっているかもしれません。
また、この改造はSCMへはコミットしていません。
あしからず。