Hudsonを利用してファイルI/Fを実現したい(1)
それなりの規模の案件だと、ファイルI/FやJOBの管理はJP1+Hulftの黄金コンビで提案、設計することが多く、
この組み合わせだと開発者もやり慣れているので、特にリスク等ありません。
案件規模の低下や、いままで提案してこなかったような小さな会社向けだと、JP1やHulft前提のシステムは
厳しいものがあります。JP1やHulftを購入してもらえません。こういった状況にあっては、
「ファイルI/FなんかFTPでやればいいじゃん」
の一言で済ませられ、いざ受注後、想定工数をオーバーしまうというのは目に見えています。
FTPで行うといっても、送信先にデータが届いたかどうかや、受信後に何かの処理を動かしたいとか、
さまざまな考慮を入れていくとそれなりに工数かかります。
設計者がHulftしか使用したことないような方だと、さらに難しいわけで。。。
そんな訳で、以前の日記(id:sikakura:20100730)で、Hudsonのスレーブ機能を利用してファイルをインターフェースしたいという
ものを書いたのですが、もう少し深く検討したいと思います。FTP使用するくらいならHudsonを導入して少しでも工数削減できないかなと。
できればサンプルコード作成して、動作検証できればいいなと思います。
基本機能としてやりたいことは、以下の3つくらいです。
- サーバ(NodeA)からサーバ(NodeB)へファイルを転送したい
- コマンドラインから送信を起動し、相手が受け取るまで待ちたい(JOBの蹴りっぱなしはNG)
- Hulftで云うところの受信後起動JOBを実現したい
- NodeAからMaster上のJOBを実行します。リモートAPIを想定しています。
- Hudson(Master)上でJOBが実行されます。このJOBはNodeB上で実行されるように設定します。
- 指定されたファイルをNodeAからhttpダウンロードします。
- ファイルを保存し、受信後起動JOBを実行します。
- 結果をHudsonに返します。(ここは意識しませんが)
- NodeAからはリモートAPIを利用して、1.で実行したJOBの終了を待っていますので、この時点で終了を検知します。
リモートAPIについては、ここhttp://wiki.hudson-ci.org/display/JA/Remote+access+APIに書かれています。
サンプルコードhttp://download.java.net/maven/2/org/jvnet/hudson/client-demo/を辿っていくと
川口さんの書かれたコードがアップされていました。
package org.jvnet.hudson.client_demo; import org.dom4j.io.SAXReader; import org.dom4j.Document; import org.dom4j.Element; import java.net.URL; import java.net.Authenticator; import java.net.PasswordAuthentication; import java.util.List; /** * Java client program to demonstrate how to access Hudson remote API. * * @author Kohsuke Kawaguchi * @see http://hudson.gotdns.com/wiki/display/HUDSON/Remote+access+API */ public class Main { public static void main(String[] args) throws Exception { // every Hudson model object exposes the .../api/xml, but in this example // we'll just take the root object as an example URL url = new URL("http://deadlock.netbeans.org/hudson/api/xml"); // if you are calling security-enabled Hudson and // need to invoke operations and APIs that are protected, // consult the 'SecuredMain" class // in this package for an example using HttpClient. // read it into DOM. Document dom = new SAXReader().read(url); // scan through the job list and print its status for( Element job : (List<Element>)dom.getRootElement().elements("job")) { System.out.println(String.format("Name:%s\tStatus:%s", job.elementText("name"), job.elementText("color"))); } } }
認証がない場合は、上のようにとても簡単そうですね。
でも、今回は認証がある想定で行きたいですね。業務で使う想定ですので。
認証のある場合は、apache.commonsのHttpclientを使えば良さそうです。
今回はここまで。