こちらの記事はMackerel Advent Calendarの11日目の記事として書いています。 qiita.com
mackerelを使って監視ルールをバージョン管理して、もし差分があったら自動でGithubにPRを投げるみたいなものを作った時の話です。
こちらの記事を見ていいなぁと思い、そんなことをやってみたいと思いました。
概要
監視設定を管理している状態ですが、カジュアルにGUIで変更などした後にもその状態をちゃんと管理したいという気持ちがあります。
定期的に変わっていないかを判定して、変わっていたらアラートもありですが、結局その後することはコードに反映させることかと思うので、変更のPRまであげられたら楽だなぁと思いました。
なので今回は変更があった場合は何かアラートを投げるのではなく、PRを投げて人が見れるできる状態まで持っていきたいと思います。
やりかた
mackerelの監視設定と差があるかどうかは上記記事にもあるように mkr diff
で確認することが出来ます。
また、同じく上記記事にあるように -e
オプションを付ければ異常終了してくれるので便利です。
なので、今回は異常終了した際に hub
コマンドを利用してPRを投げたいと思います。
書いたコード
書いたコードはこんな感じです。
monitors/Makefile at master · ara-ta3/monitors · GitHub
hubコマンドでPRを投げるためには認証(OAuth)が必要で、
CIサーバで行う場合、設定を ~/.config/hub
に置く必要があります。
形式はこんな感じです。
github.com: - user: ara-ta3 oauth_token: XXXXXXXXX protocol: https
書いたスクリプトはこんな感じでした。
diffを取って異常終了だったら(差分があったら)PRを作る。
と言ったものです。
MKR=$(shell which mkr) HUB=bin/hub HUB_CONFIG= dirs=$(HOME)/.config bin tmp monitors=monitors.json current=$(shell date "+%Y/%m/%d %H:%M:%S") pr_branch=update-monitors-json-$(shell date "+%Y%m%d%H%M") pr_text_file=tmp/pr_text_file check-mackerel-monitors: $(MAKE) diff || $(MAKE) create-pull-request pull: $(MKR) monitors pull --file-path $(monitors) diff: $(MKR) monitors diff -e --file-path $(monitors) create-pull-request: $(HUB) $(HOME)/.config $(MAKE) pull $(HUB) checkout -b $(pr_branch) $(HUB) add $(monitors) $(HUB) commit -m "Update monitors.json $(current). job: $(job_url)" $(HUB) push origin $(pr_branch) $(MAKE) $(pr_text_file) $(HUB) pull-request -F $(pr_text_file) $(pr_text_file): tmp echo "Update monitors.json $(current)." > $(pr_text_file) echo "" >> $(pr_text_file) echo "job: $(job_url)" >> $(pr_text_file) $(MKR) monitors diff --file-path $(monitors) >> $(pr_text_file) bin/hub: tmp bin wget -O $</hub-linux-amd64-2.2.9.tgz https://github.com/github/hub/releases/download/v2.2.9/hub-linux-amd64-2.2.9.tgz cd $< && tar xzvf hub-linux-amd64-2.2.9.tgz mv $</hub-linux-amd64-2.2.9/bin/hub $@ rm -rf $< $(HOME)/.config/hub: $(HUB_CONFIG) $(HOME)/.config cp -f $< $@ $(dirs): mkdir -p $@
Jenkinsで回してみる
ここまできたのでJenkinsでJobを作ってみようかと思います。
Scriptはこんな感じでした。
事前にmkrコマンドはインストールしています。
$make -C ${WORKSPACE}/mackerel check-mackerel-monitors HUB_CONFIG=/credentials/hub-for-jenkins-mackerel
なにもない時の様子
その後モニタリング設定を変更して実行してみました。
モニタリングの設定を一つ減らしてJobを実行してみました。
https://github.com/ara-ta3/monitors/pull/4
Job結果を載せようと思いましたが、めっちゃくちゃ長かったのでやめました・・・w
とりあえず差分があればPRを投げてくれます。
感想とまとめ
- mkrコマンド便利
- diffがあったらPR投げてしまうの便利
- ずっと役に立つと良いな