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拡張用のプロジェクト作成から、デバック環境まで簡単に揃ってしまいますので
とても手軽に拡張用プラグインを作成できちゃいます。
これだけ簡単にできてしまうと、プラグインがたくさんあるのも頷けますね。