読者です 読者をやめる 読者になる 読者になる

日頃の行い

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

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投げてしまうの便利
  • ずっと役に立つと良いな

Raspberry Pi + hubot + IRKitで家電操作して日々を過ごす

この記事は Raspberry Pi Advent Calendar 2016 の10日目として書かれています。

www.adventar.org

こんにちは ara_ta3 です。
Raspberry Piを気分で買ってあまり色々やるぞ思ってから長い日が経っています。
かなり何番煎じって感じですがSlack + hubot と Raspberry Pi + IRKitで家電操作したときの話をしたいと思います。

概要

やっていることはとても簡単です。
hubotをSlack上に住まわせて何らかの命令を送ったらIRKitにリクエストを飛ばし家電を操作するという感じです。
hubotのレポジトリはこちら。
執事 英語 でぐぐって出てきたかっこいい名詞をbotの名前として選びました。

github.com

hubotの実装

実装はこのあたりからで、configで渡したデータをIRKitサーバにHTTPリクエストで投げています。
(configに乗っけていいのかよくわからなかったのでgithubには置いていません)

https://github.com/ara-ta3/steward/blob/master/src/scripts/home.js#L26

hubot-irkitというライブラリもあったんですが、
jsonをPOSTする程度のものなのでライブラリはいらないでしょう。
jsonは例えばこんな感じのものになります。

    "light": {
        "up": {
            "format":"raw",
            "freq":38,
            "data":[
                18031,8755,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,1037,1190,3228,1150,1037,1150,3228,1190,3228,1190,3228,1190,1037,1150,3228,1190,3228,1190,1037,1150,1037,1150,1037,1150,3228,1190,1037,1150,1037,1150,1037,1150,1037,1150,1037,1150,3228,1190,3228,1190,1037,1150,3228,1190,3228,1190,3228,1190,3228,1190,3228,1190
            ]
        }
    },

IRKitの準備

IRKitは自身がサーバとなってHTTPリクエストを受けてくれます。
今回はローカルのネットワークに置きました。
とりあえずIRKitのIPアドレスが必要なので調べます。
Macのアプリでないかなと思ったらさくっと見つかったのでこれを使いました。

IP Scanner

IP Scanner

  • 10base-t Interactive
  • ユーティリティ
  • 無料

次に送信したい信号の赤外線を記憶させます。
IRKitのサーバの /messages エンドポイントに X-Requested-With のヘッダとともにリクエストを投げると直前に送った赤外線の信号が手に入ります。
X-Requested-With の値はなんでも大丈夫そうです。
なにも赤外線信号を送っていない場合は空のBodyが返ってきます。
また同じエンドポイントに受け取ったデータを送りつけると同様の信号を送ったことになりmす。

# 赤外線信号を送っていないので空bodyのレスポンス
$curl -i 192.168.0.13/messages -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/3.0.0.0.g85190b1
Content-Type: text/plain

# ある信号送った後のレスポンス
$curl -i 192.168.0.13/messages -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/3.0.0.0.g85190b1
Content-Type: text/plain

{"format":"raw","freq":38,"data":[18031,8755,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,3341,1150,1150,1150,3341,1150,3341,1150,3341,1150,1150,1150,3341,1150,3341,1150,1150,1150,1150,1150,1150,1150,3341,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,3341,1150,3341,1150,1150,1150,3341,1150,3341,1150,3341,1150,3341,1150,3341,1150]}

# このデータをサーバに対して送ると同じことが起きます
# さっきの信号は電気を1段階暗くするものだったので家が暗くなりました
curl -i 192.168.0.13/messages -d '{"format":"raw","freq":38,"data":[18031,8755,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,3341,1150,1150,1150,3341,1150,3341,1150,3341,1150,1150,1150,3341,1150,3341,1150,1150,1150,1150,1150,1150,1150,3341,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,1150,3341,1150,3341,1150,1150,1150,3341,1150,3341,1150,3341,1150,3341,1150,3341,1150]}' -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/3.0.0.0.g85190b1
Content-Type: text/plain

赤外線リモコン系は大体覚えさせると便利でした。
ただ、覚えさせるのがめんどい←

感想とまとめ

  • 暑い夏とか家につく少し前のタイミングでエアコンつけたりすると帰った時涼しくてよかった
  • 家に帰る前に電気つけとくと帰ってすぐ明るくて良い
  • 言わずもがな家に帰らない人には必要なさそう
  • Raspberry Piずっと点いてる割にはあまり活用できてないなぁと感じたので来年は何かやっていきたい

hubot-characterというpluginを使ってSlack上でレムと戯れる

この記事は Re:ゼロから始める Advent Calendar 2016 - Adventar の2日目として書かれています。
www.adventar.org

ネタバレを含むので見ていない方はamazon prime videoで見れるので是非見てください。
https://www.amazon.co.jp/dp/B01KZSGOCY

こんにちは ara_ta3 です。
リゼロ最高ですよね。
私は18話が好きです。

リゼロを見ながらはじめはエミリアたんマジ天使って思ってたんですが、今はこんな気持ちです。

レムがかわいくて生きるのがつらいです。

https://cdn-ak.f.st-hatena.com/images/fotolife/s/shanonim/20161201/20161201002434.gif

画像は 僕がリゼロを好きになった5つの理由 - shanon's note より引用させていただきました。
最高の記事でしたね…w

ところで、レムりんに レムは知っています って認められるのとても安心しますよね。
レムりんに何か言ってもらえると安心しますよね。
なので今回はhubot pluginを書いてレムに色々言ってもらえるようにしました。

概要

見終わった方はもう心の底からおわかりかと思いますが、
レムりんが最高ですよね!
異論は聞こえません。聞こえないので議論いたしかねます。

さて、アニメを見ていないとレムりんに会えないのでとても日々が辛くなってしまいます。
そこで、今回はbotを経由してslack上でレムりんから励ましてもらえるようにしようと思います。
今回使うbotはhubotで、hubot-characterというpluginを利用します。
自作です

github.com

www.npmjs.com

使い方

hubotの使い方は適宜調べて頂ければと・・・w
やること

  • install
    • npm install hubot-character
  • 定義ファイルの編集
  • 環境変数の設定
    • HUBOT_CHARACTER_CONFIG
      • ↑の定義ファイルへのPATHです
    • HUBOT_SLACK_TOKEN
      • SlackのpostMessageに利用します
      • 最近のSlackだとHUBOT_SLACK_TOKENでも問題なかったかと思います

定義ファイルの編集

下記のようなフォーマットを定義します。

  • 項目の説明
    • name: Slackのユーザ名に使います
    • icon: Slackのユーザアイコンに使います
    • respond: hubot hogehogeに対応する部分です。この場合 hubot rem に反応します。
    • messages: ランダムに返してくれるメッセージです。 {name} マクロが使えます。
{
    "characters": [{
        "name": "レム",
        "icon": ":rem:",
        "respond": "rem",
        "messages": [
            "今、一緒に逃げてしまったら、レムが一番好きな{name}さんを置き去りにしてしまうような気がしますから",
            "レムは知っています。{name}さんは未来を望む時、その未来を笑って話せる人だって知っています。",
            "レムは知っています。{name}さんが未来を、諦められない人だって、知っています。",
            "レムは知っています。{name}さんがどんなに先の見えない暗闇の中でも、手を伸ばしてくれる勇気がある人だってことを。",
            "諦めるのは簡単です。⋯でも、{name}さんには似合わない",
            "レムは信じています。どんなに辛く苦しいことがあって、{name}さんが負けそうになってしまっても……世界中の誰も{name}さんを信じなくなって、{name}さん自身が自分のことを信じられなくなっても、レムは信じています。",
            "{name}さんに頭をなでられるのが好きです。手のひらと髪の毛を通して、{name}さんと通じあっている気がするんです。",
            "{name}さんの声が好きです。言葉一つ聴くたびに、心が温かくなるのを感じるんです。",
            "{name}さんの目が好きです。普段は鋭いんですけど、誰かに優しくしようとしているとき、柔らかくなるその目が好きです。",
            "{name}さんの指が好きです。男の子なのに綺麗な指をしていて、でも握るとやっぱり男の子なんだって思わせてくれる、強くて細い指なんです。",
            "{name}さんの歩き方が好きです。一緒に隣を歩いていると、たまにちゃんとついてきているか確かめるみたいに振り向いてくれる、そんな歩き方が好きです。"
        ]
    }]
}

charactersは複数キャラクターに対応しているので実は他のキャラクターも定義できたりします。

結果

このように定義するとこんな感じに動作します。
hubotの名前が dark のため dark rem というコマンドになっています。

f:id:arata3da4:20161123225027p:plain

感想

  • hubot-character 便利
  • レムりんのかわいさ鬼がかってますね。
  • レムりんに癒やされながら生きていきましょう・・・