Jenkinsを拡張してファイルI/Fを実現したい

id:kkawaさんからのアドバイスの通りに、ファイルI/FのプログラムをJenkinsのCLIコマンドとして実装
してみようと思い立ちました。
Jenkinsの内部構造などほとんど知らないので、結構時間が掛かるだろうと思いましたが、
結果的に「え、これだけ?」という感じでなんとか動くところまで実装できました。
※まだまだ改善すべき点はありますが。。。。


ファイルI/Fの日記では、送信側用のプログラムと受信側用のプログラムの2つを実装しましたが、
送信用のプログラムは、標準で実装されているBuildCommandで事足りることが分かったので、実装しませんでした。

以前実装してみた送信用プログラム

java -jar hutil.jar -r IFJOB -s SourceJOB -f zzz.csv

は、以下のように実行することで同じ機能になります。
ビルドパラメータにも対応していますし、-sオプションでビルドが終わるまで待ちます。

java -jar jenkins-cli.jar -s http://192.168.0.1:8080/ build IFJOB -s -p HU_JOB=SourceJOB -p HU_FILE=zzz.csv


従って受信用プログラム(ダウンロード用プログラム)だけJenkinsを拡張して作成することにしました。
上で言ったようにとても簡単なプログラムなので、ここに全部載せることにします。

import hudson.Extension;
import hudson.FilePath;
import hudson.cli.CLICommand;
import hudson.model.AbstractProject;
import hudson.model.Hudson;
import hudson.model.Item;
import org.kohsuke.args4j.Argument;

@Extension
public class DownloadCommand extends CLICommand {

    @Override
    public String getShortDescription() {
        return "Download a file.";
    }

    @Argument(metaVar = "JOB", usage = "Name of the job that contain of download file.", index = 0, required = true)
    public AbstractProject<?, ?> job;

    @Argument(metaVar = "FILE", usage = "Name of a file.", index = 1, required = true)
    public String filename;

    @Override
    protected int run() throws Exception {
        Hudson h = Hudson.getInstance();
        h.checkPermission(Item.BUILD);
        FilePath src = null;
        try {
            src = new FilePath(job.getSomeWorkspace(), filename);
            if (!src.exists()) {
                stderr.println("filename : " + filename + " is not exist.");
                return -1;
            }
            new FilePath(channel, filename).copyFrom(src);
        } catch (Exception e) {
            stderr.println(e.getMessage());
            return -1;
        }
        return 0;
    }
}


使い方は以下のようになります。
引数を2つ取ります。
1つ目は、受信したいファイルが含まれるジョブ名(ジョブ配下のworkspaceにファイルがおかれている前提)
2つ目は、受信したいファイル名

java -jar jenkins-cli.jar -s http://192.168.0.1:8080/ download SourceJOB zzz.csv


ファイルは、「java -jar jenkins-cli.jar 〜」を実行した場所に落ちてきます。


Jenkinsのジョブとして定義するときは、以下のようにパラメータ化された引数を渡してやります。

java -jar jenkins-cli.jar -s http://192.168.0.1:8080/ download %HU_JOB% %HU_FILE%


自前で実装した時には、
コマンドラインパラメータを解析するために、getoptライブラリ
・HTTPでダウンロードするために、Apache Http Commonsライブラリ
XMLレスポンスを解析するために、dom4jライブラリ
などなど必要だったのですが、今回はまったく必要ありません。


前回の日記で書いたように、Jenkins拡張用のプロジェクト作成から、デバック環境まで簡単に揃ってしまいますので
とても手軽に拡張用プラグインを作成できちゃいます。
これだけ簡単にできてしまうと、プラグインがたくさんあるのも頷けますね。