Jenkins でのブランチの自動ビルドに Multi-Branch Project Plugin が便利
環境
- Jenkins 1.532.3
- Multi-Branch Project Plugin 0.2.2
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 プラグインのうち、アップデートセンターからダウンロードできないもののダウンロードリンクをまとめた。
Jenkins Bugsnag Plugin
Jenkins でキャッチされなかった例外を Bugsnag に送信するプラグイン作った - mallowlabsの備忘録
Jenkins Executor Favicon Plugin
Jenkins War Numbering Plugin
Jenkins で Tomcat の Parallel Deployment をしやすくするプラグイン作った - mallowlabsの備忘録
Jenkins Gem Server Plugin
Jenkins Redmine OAuth Plugin
Redmine・Gitlab・Jenkins のログインパスワードの管理が大変になったので OAuth 化した - すえひろがりっっっっ!
まとめ
JitPack 最高!
Jenkins Warning Plugin + Ant + Javadoc で警告を集計
環境
- Windows Server 2012 R2
- Java 8 u45
- Jenkins 1.609
- Ant 1.9.4
- Jenkins Warning Plugin 4.47
という環境で 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 最高!
Java で Airbrake/Errbit を使うときに airbrake-java を使うべきではない
問題
Java + log4j で Airbrake / Errbit を使う場合には、公式である airbrake-java を使うと思う。
しかし、このライブラリは v2.2.8 時点でとんでもない地雷ライブラリだったので使うべきではない。
具体的には以下の様な不具合がある
- API に POST する XML のエスケープが正しくないため、コンストラクタ(
)がスタックトレースに含まれると XML が壊れる - XML のエンコーディングが指定されていないため、マルチバイト文字列を含むと XML が壊れる
- ホスト名を指定するのが難しい
いくつかの問題に対しては 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つの問題があることがわかりました。
- Heroku の Web プロセスは一定時間アクセスが無いと、プロセスごと落とされてスレッドが止まる
- 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 を選ぶと赤外線の一覧が表示されます。
Send IR をクリックすると、その場で赤外線を送ることができます。
crontab の書式でスケジュールを指定すると、その時間に赤外線が送信されます。
曜日の指定もできるので、平日だけ電灯をつけるということもできます。
リポジトリ
GitHub - mallowlabs/irkitly: A web interface for IRKit
上記の Heroku にデプロイされているものを使ってもいいですし、自分でデプロイしたものを使ってもいいです。
もちろん Heroku Deploy Button にも対応しています。
まとめ
IRKitly を使って、二度寝と戦おう!