メールでJenkinsにコマンドを送りたい(5) 〜Groovy対応〜
Groovy対応って言ってますが、たいした物ではありません。
いやいや、威張る所ではない(笑)のですが、基本方針は以下の通り。
- CLIコマンドとして「groovy」を見つけたら、メール本文をファイルに保存
- ファイルの保存先は、ビルドごとのフォルダ(つまり重複しない)
- CLIクラスに渡す時に、「groovy」の引数として先ほど保存したファイルのフルパスを渡す
実装ですが、全体としては前回載せているので、メールの件名判定ループ部分だけ。
public String receive(AbstractBuild build, BuildListener listener) { //〜〜〜省略〜〜〜 for (Message message : messages) { String findStr = message.getSubject().split(" ")[0]; if (commands.indexOf(findStr) != -1) { subject = message.getSubject(); InternetAddress[] addresses = (InternetAddress[]) message.getFrom(); saveFile(build, "tmp.address", addresses[0].getAddress()); if ("groovy".indexOf(findStr) != -1) saveFile(build, "groovy.script", (String) message.getContent()); message.setFlag(Flag.DELETED, true); break; } } //〜〜〜省略〜〜〜 }
上のsaveFileは以下のような簡単なファイル保存のロジックです。
private void saveFile(AbstractBuild build, String filename, String contents) { try { FileOutputStream fos = new FileOutputStream(new File(build.getRootDir(), filename)); OutputStreamWriter osw = new OutputStreamWriter(fos); BufferedWriter bw = new BufferedWriter(osw); bw.write(contents); bw.close(); osw.close(); fos.close(); } catch (IOException ioe) { System.err.println(ioe.getMessage()); } finally { } }
<recieveメソッドについて>
以下の部分で、メール本文を保存しています。
if ("groovy".indexOf(findStr) != -1) saveFile(build, "groovy.script", (String) message.getContent());
ただし、現在は文字コードなどを考慮せずに保存しているので、ダブルバイトコードが存在すると問題が発生する恐れがあります。
さて実験の時間です。下のような状況の(若干寂しい感じ)のJenkinsが動作している環境があったとします。
件名に「groovy」本文に好きなgroovyスクリプト(こちらも寂しいが。)を書いた以下のようなメールを送信すると、、、
以下のように、groovyスクリプトの実行結果がメールで送られてきます。
最初のぼんやりとした発想時点では、手元に携帯くらいしかないときにメールか何かでコマンド発行できたら
便利かなというのがあったので、携帯はありだと思っていました。
なんとか目標のところまでたどり着くことができました。
このプラグインは、jenkins-ci.orgにホスティングしましたので、インストールして試してみるも、
ソースをいじって自分なりに楽しんでみるのもご自由にどうぞ。