日頃の行い

個人的な日頃の行いをつらつら書いてます\\\\ ٩( 'ω' )و ////

Github管理しているmackerelの監視ルールが変更されたらJenkinsからPRを投げる

こちらの記事はMackerel Advent Calendarの11日目の記事として書いています。 qiita.com

mackerelを使って監視ルールをバージョン管理して、もし差分があったら自動でGithubにPRを投げるみたいなものを作った時の話です。
こちらの記事を見ていいなぁと思い、そんなことをやってみたいと思いました。

kakakakakku.hatenablog.com

概要

監視設定を管理している状態ですが、カジュアルにGUIで変更などした後にもその状態をちゃんと管理したいという気持ちがあります。
定期的に変わっていないかを判定して、変わっていたらアラートもありですが、結局その後することはコードに反映させることかと思うので、変更のPRまであげられたら楽だなぁと思いました。
なので今回は変更があった場合は何かアラートを投げるのではなく、PRを投げて人が見れるできる状態まで持っていきたいと思います。

やりかた

mackerelの監視設定と差があるかどうかは上記記事にもあるように mkr diff で確認することが出来ます。
また、同じく上記記事にあるように -e オプションを付ければ異常終了してくれるので便利です。
なので、今回は異常終了した際に hub コマンドを利用してPRを投げたいと思います。

github.com

書いたコード

書いたコードはこんな感じです。

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 

なにもない時の様子

f:id:arata3da4:20161207020839p:plain

その後モニタリング設定を変更して実行してみました。
モニタリングの設定を一つ減らしてJobを実行してみました。

https://github.com/ara-ta3/monitors/pull/4

f:id:arata3da4:20161208225327p:plain

Job結果を載せようと思いましたが、めっちゃくちゃ長かったのでやめました・・・w
とりあえず差分があればPRを投げてくれます。

感想とまとめ

  • mkrコマンド便利
  • diffがあったらPR投げてしまうの便利
  • ずっと役に立つと良いな