Jenkins でのブランチの自動ビルドに Multi-Branch Project Plugin が便利

環境

Multi-Branch Project Plugin

GitHub を使っていないプロジェクトで、ブランチが増えたり減ったりする場合に、
そのブランチを自動で Jenkins のビルドジョブにしたい。
そのような場合に Multi-Branch Project Plugin が便利だったので紹介。

Multi-Branch Project Plugin をインストールすると新規ジョブの画面に「Freestyle multi-branch project」というジョブタイプが追加される。
このジョブタイプを選択すると、それぞれのブランチがサブジョブとして追加される。

メインのジョブは /job/my-project/ という URL になり、ブランチのジョブは /job/my-project/branch/my-branch/ というような URL にそれぞれ割り当てられる。
当然、通常のプロジェクトにできる操作は、ブランチジョブに対してもできる。

また、メインジョブでビルド設定を変更すると、サブジョブのビルド設定も変更される。
一応、サブジョブ単位でもビルド設定が変更できるが、わかりにくくなるため変更しない方が良い。

プッシュのタイミングでブランチを同期する

プッシュと同時にブランチを同期するために、Git リポジトリの post-recieve に以下のような設定をする。

curl -XPOST -u jenkins:apikey "https://your.jenkins.host/job/my-project/syncBranches" > /dev/null 2>&1
while read oldrev newrev refname; do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    curl -XPOST -u jenkins:apikey "https://your.jenkins.host/job/my-project/branch/${branch}/build" > /dev/null 2>&1
done

また、メインジョブの設定で以下のように設定する。

  • Sync Branches Schedule を 空 にする
  • Git の「高度な設定」から Exclude branches にビルドしないブランチの命名規則を指定する。指定方法は ワイルドカードのスペース区切り らしい。

これで、新しいブランチをプッシュすると、Jenkins にビルドジョブが追加されてビルドされる。

まとめ

Jenkins Multi-Branch Project Plugin 最高!

Jenkins のプラグインの配布に JitPack.io が便利過ぎる件

JitPack | Publish JVM and Android libraries というサービスがある。

GitHub に置いた Java プロジェクトのソースコードをビルドして、Maven リポジトリとして配布してくれるサービスである。
以前はタグを作る必要があったが、現在はコミット ID をバージョンとして使えるようになって利便性が上がった。

Maven でビルドできるプロジェクトであればよいので、 Jenkins プラグインのプロジェクトもビルドできる。
この JitPack が Jenkins のアップデートセンターに登録するほどでもないプラグインを配布するのに便利だという気づいた。

そこで以下に私が作った Jenkins プラグインのうち、アップデートセンターからダウンロードできないもののダウンロードリンクをまとめた。

まとめ

JitPack 最高!

Jenkins Warning Plugin + Ant + Javadoc で警告を集計

環境

という環境で Javadoc が出すエラー/警告を Jenkins Warning Plugin で集計しようとしたら結構大変だったのでメモ。

設定

プリセットされているパーサーだと Ant + Javadoc + 日本語環境 で解析できるものがなかったので、自前でパーサーを定義してやる。

名前:JavaDoc Tool(Ant)
リンク名:Javadoc 警告
推移レポート名:Javadoc 警告
正規表現

\s*\[javadoc\] (.+):(\d+?): (エラー|警告): (.+)\s*

マッピング スクリプト

import hudson.plugins.warnings.parser.Warning
import hudson.plugins.analysis.util.model.Priority

String fileName = matcher.group(1)
String lineNumber = matcher.group(2)
String level = matcher.group(3)
String message = matcher.group(4)
Priority priority = (level == "エラー" ? Priority.HIGH : Priority.NORMAL)

return new Warning(fileName, Integer.parseInt(lineNumber), "Dynamic Parser", "Warning", message, priority);

ログメッセージ:(空白)

あとは上で定義したパーサーをビルド後の処理で呼び出せば、こんな感じでグラフが出る。

警告が多い?ちょっと何言っているかわからないですね…。

まとめ

Jenkins Warning Plugin 最高!

Munin の jstat__heap を Java8 対応にした

MuninJava のヒープを監視するスクリプトjstat__heap がある。

このスクリプトが結構内容が古くて、

対応と書いてあっていろいろアレである。

とはいえ Java7 まではそのままで使えていたが、Java8 になってパーマネント領域がメタスペースに変更になったため、使えなくなった。

そこで Java8 対応版を作った → jstat__heap

の両方に対応している。

困っている人がいるかもしれないのでシェア。

まとめ

Munin 最高!

Java で Airbrake/Errbit を使うときに airbrake-java を使うべきではない

環境

  • airbrake-java: v2.2.8
  • errbit-java: v2.3.1

問題

Java + log4jAirbrake / Errbit を使う場合には、公式である airbrake-java を使うと思う。
しかし、このライブラリは v2.2.8 時点でとんでもない地雷ライブラリだったので使うべきではない。

具体的には以下の様な不具合がある

いくつかの問題に対しては Pull-Request が上がっているが放置されている。
公式ライブラリとは一体…。

ではどうするか?

errbit-java という 3rd-party 製のライブラリがあって、上記の問題が全て解決されている。

使い方も簡単で、まず pom.xml に以下のように書く。

<dependency>
    <groupId>net.lightoze.errbit</groupId>
    <artifactId>errbit-logger</artifactId>
    <version>2.3.1</version>
</dependency>

次に log4j.properites に以下のように書く。

log4j.appender.errbit=net.lightoze.errbit.Log4jErrbitAppender
log4j.appender.errbit.apiKey=YOUR_ERRBIT_API_KEY
log4j.appender.errbit.environment=production
log4j.appender.errbit.url=https://your.errbit.host/notifier_api/v2/notices

log4j.rootLogger=INFO, stdout, errbit

これで例外が出た時に Airbrake/Errbit に通知される。簡単ですね。

まとめ

Errbit 最高!

Heroku で cron 処理をする gem を作ってみた時の知見

IRKitly を作った時の知見です。
Heroku の無料プランで cron 処理をするには Heroku Scheduler を使うのが一般的です。
しかし、Heroku Scheduler では分単位で指定することはできません。

ChronoCross

この問題を解決するために Chrono という gem をラップした ChronoCross という gem を作りました。
スレッドを立てて、指定した時間まで sleep することで cron 処理を実現しています。
ChronoCross の gem の中で、Chrono::Trigger を参照しているのが最大の見所です。

問題点

この gem は一見するとうまく動くように見えますが、以下の2つの問題があることがわかりました。

  1. Heroku の Web プロセスは一定時間アクセスが無いと、プロセスごと落とされてスレッドが止まる
  2. Heroku は一日一回必ず再起動するので、スレッドを復元しなければならない

1つ目の問題に対しては、New Relic APM | Heroku Dev Center を使って、ping を飛ばし続ける定番の方法で回避しました。

2つ目の問題に対しては、config/initializers に、「DB を select してジョブを登録するスクリプト」を追加することで回避しました。
IRKitly のコード が参考になるかもしれません。

このように Heroku で使うには少しクセがある gem ですが、なんといっても Heroku の Web プロセス 1 dyno で済むのが最大の特長となっています。

その他の方法

sidekiq-cron を使う方法もあるようです。
無料プランで使う場合には、sidekiq プロセスだけで dyno を動かす必要があります。

Unicorn の before_fork に入れる方法もあるようですが、おそらく Web プロセスを寝かさないようにする必要がありそうです。

まとめ

Heroku でも cron 処理をしよう!

Heroku から IRKit をスケジュールで操作できる IRKitly をリリースしました

以前の記事で IRKit と Heroku Scheduler でフロアライトを光目覚ましにしてみた - mallowlabsの備忘録 というのを作りました。
この方法だと Heroku Scheduler を使って IRKit の API を叩いているので、平日と休日で動作を変えるといった、細かな制御ができないのが難点でした。

そこで Heroku から Irkit をスケジュールで操作できる IRKitly を作りました。


https://irkitly.herokuapp.com/

機能紹介

スクリーンショットで説明しつつ、機能の紹介をします。

ログインは GitHub アカウントで行います。

IRKit の情報の登録は 橋本商会 » 赤外線学習リモコンIRKitのrubygemを作った を使います。
IRKit Internet HTTP API を有効にしている必要があります。

登録が完了すると、IRKit の一覧が表示されます。

IRKit を選ぶと赤外線の一覧が表示されます。

Send IR をクリックすると、その場で赤外線を送ることができます。

crontab の書式でスケジュールを指定すると、その時間に赤外線が送信されます。

曜日の指定もできるので、平日だけ電灯をつけるということもできます。

リポジトリ

GitHub - mallowlabs/irkitly: A web interface for IRKit
上記の Heroku にデプロイされているものを使ってもいいですし、自分でデプロイしたものを使ってもいいです。
もちろん Heroku Deploy Button にも対応しています。

まとめ

IRKitly を使って、二度寝と戦おう!