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を実現したい


  1. NodeAからMaster上のJOBを実行します。リモートAPIを想定しています。
  2. Hudson(Master)上でJOBが実行されます。このJOBはNodeB上で実行されるように設定します。
  3. 指定されたファイルをNodeAからhttpダウンロードします。
  4. ファイルを保存し、受信後起動JOBを実行します。
  5. 結果をHudsonに返します。(ここは意識しませんが)
  6. 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を使えば良さそうです。

今回はここまで。