githubにpushされたのをhookしてec2で自動的にpullする

今回やりたかったことは、githubの特定のリポジトリにpushしたら、それをhookして、ec2のWebサーバーにPostされ、
自動的にpullして特定ディレクトリを更新。
です。
やったことがなかったので、ひじょうに勉強になりました!

ec2環境を整える

こちらの記事通りやればOK。
なかなか用語などに馴染みがなく理解しずらかったのですがこのあたりは慣れですね。

わずか5分!? AWSのEC2でクラウドなウェブサーバーを構築してみた | 株式会社LIG

rbenvを入れる

ec2にrbenvをインストールする方法 – Hive Color
こちらの記事のとおりやればうまくいきました!
以下、メモ程度でやったことを残しておきます。

install_rbenv.sh

groupadd staff
gpasswd -a ec2-user staff
cd /usr/local
git clone git://github.com/sstephenson/rbenv.git rbenv
chgrp -R staff rbenv
chmod -R g+rwxXs rbenv

yum install -y gcc-c++ patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison iconv-devel

mkdir /usr/local/rbenv/plugins
cd /usr/local/rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git
chgrp -R staff ruby-build
chmod -R g+rwxs ruby-build

あとは、インストールするだけ。

sudo sh install_rbenv.sh

すべてのユーザーでrbenv使えるようにしておく

/etc/profile.d/rbenv.sh
# vi /etc/profile.d/rbenv.sh
export RBENV_ROOT=/usr/local/rbenv
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"

一度ログアウトして再度ログインするか、

source /etc/profile.d/rbenv.sh

する。

rbenvでrubyをインストールする

rbenv install 2.1.2
rbenv rehash
rbenv global 2.2.1

これで、

ruby -v
ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]

こうなればOK!

hook用のWebサーバーはSinatraを使ってみる

ググるとSinatraでやっている方が多々いて、Sinatra久々に触ってみよーということでやってみました。
以下の記事のコードをかなり参考にさせていただきました!

githubにPushしたらwebhooksとSinatraを利用してサイトを自動的に更新する – blog.katsuma.tv
Webサイトをgithubで管理してpush時に自動的に同期する方法 – Blog by Sadayuki Furuhashi

app.js

require 'sinatra'
require 'json'

here = File.dirname(__FILE__)
SCRIPT = "sh -x #{here}/update-website.sh"

set :port, 8080

post '/' do
   begin
      push = JSON.parse(params[:payload])
      system(SCRIPT)
      "ok."
   rescue
      "error."
   end
end

get '/' do
  system(SCRIPT)
  "ok."
end

サンプルにもう書かれていて、他の記事にもJSON.parse(params[:payload])でpayloadというのが取れるというのが書かれていたのですが、
どうも今試してみると、取れなかった。

その変わり、githubに

Which events would you like to trigger this webhook?
Just the push event.

というラジオボタンがあったので、postの中身は、

post '/' do
  system(SCRIPT)
  "ok."
end

にしてみた。
確かに、イシュー追加しようが、コメント書こうがpostがこなかったので、これでもいいかな。

Rubyで外部コマンドを実行して結果を受け取る方法あれこれ – Qiita

git clone、git pullするshellスクリプト

#!/bin/sh

tmpdir=/var/www/html/hoge
repo=git@github.com:hoge/hoge.git

if [ -d "$tmpdir" ];then
    cd "$tmpdir"
    if git pull; then
        exit 0
    fi
fi

# /var/www/html/
dirname=`dirname "$tmpdir"`
# hoge
basename=`basename "$tmpdir"`

cd "$dirname"

if git clone "$repo" "$basename"; then
  exit 0
fi

Sinatraを起動する

production環境で実行しないと外からのリクエストを受け付けなくなったようなので、以下のように実行。

ruby app.rb -e production

Sinatraがデフォルトでは外部から繋がらなくなってたよ – Qiita

メモ

■yumでインストールしたファイル一覧
rpm -ql nginx
rpm -qa | grep nginx

■サービス一覧
chkconfig –list
3のところが自動起動するかどうか

■自動起動するようにする
chkconfig nginx on

■サービス自体をすぐに起動する
service nginx status
service nginx start

■pemファイルの権限は600にしないとダメ(Mac側)
chmod 600 cliskkey.pem

■ec2にsshログイン
ssh -i key.pem ec2-user@IPアドレス

■postが空いているか確認
telnet IPアドレス 8080

■指定ポートが使われているか確認
netstat -anp | grep 8080

■/var/www/htmlのownerを変える
chown ec2-user:ec2-user /var/www/html

参考リンク

Webhooks | GitHub API

Amazon Web Services クラウドデザインパターン実装ガイド
大澤 文孝
日経BP社
売り上げランキング: 43,041

Hubotを使ってSlack、Hipchatと連携してみる。さらにGitHubへ

Hubotをインストールする

はじめてのHubot – Qiita
こちらのまとめがすごく良かったです。

Hubotを使うにはnode.jsとredisが必要なのでインストールする。
ぼくはnodeはnodebrewですでに入れているので、redisだけをbrewから入れる。

% brew install redis

redisの起動しておく。

% redis-server &

HubotのコマンドはCoffeeScriptで書かれているので、Hubotと一緒にインストールしちゃいます。

% npm install -g hubot coffee-script

あとは、Hubotの環境を作ります。

% hubot –create projectName

するとprojectNameというディレクトリが作られるので、

% cd projectName
% ./bin/hubot

でHubotのコマンドが打てるようになります。

Hubot> hubot ping
Hubot> PONG

PONGと返ってくればHubotが動いています。
個人的にはパグ画像を引っ張ってきてくれるコマンドが好きです。(パグかわいい!)

Hubot> hubot pug me

これもかわいい!gifの犬画像ヤヴァい!

Hubot> hubot animate me dog

HubotをHerokuにデプロイしSlackと連携してみる

基本的にはここに書かれていることをやるとうまくいく。
hubot-slack/README.md at master · tinyspeck/hubot-slack

すでにHubotはインストールしているので、

% npm install hubot-slack –save

だけ実行しておく。

ここからはHerokuにデプロイする方法になります。
hubot/docs/deploying/heroku.md at master · github/hubot

Herokuにログインする。

% heroku login
Enter your Heroku credentials.
Email: youremail@example.com
Password:
Could not find an existing public key.
Would you like to generate one? [Yn]
Generating new SSH public key.
Uploading ssh public key /Users/you/.ssh/id_rsa.pub

Herokuにデプロイするためにgitリポジトリを作る。

% git init
% git add .
% git commit -m “Initial commit”

Herokuアプリケーションを作る。
redisを使うのでアドオンも追加しておく。

% heroku create my-company-slackbot
$ heroku addons:add redistogo:nano

ここでアプリケーションのURLが作成される。

HerokuへのデプロイファイルのProcfileを編集する。

web: bin/hubot –adapter slack

HubotとSlackをIntegrationさせる。

Team Integration | Frontend-Team Slack
こちらより、追加させる。

% heroku config:add HEROKU_URL=自分のHerokuアプリケーションURL
% heroku config:add HUBOT_SLACK_TOKEN=HubotとSlackをIntegrationしたときに表示される
% heroku config:add HUBOT_SLACK_TEAM=HubotとSlackをIntegrationしたときに表示される
% heroku config:add HUBOT_SLACK_BOTNAME=HubotとSlackをIntegrationしたときに表示される

忘れちゃいけないのが、Service Configuration先ほど作ったHerokuのアプリケーションURLを入れる。
これを忘れるといっこうに連携されない。

最後にHerokuにデプロイしてアプリケーションを起動すればOK!

% git push heroku master
% heroku ps:scale web=1

Slack上で

slackbot pug me

のようにコマンドを実行できるようなっているはず。
@はつけない。

HubotをHerokuにデプロイしHipchatと連携してみる

事前にHipchatでGroup Adminよりbot用のアカウントを追加しておく。
RoleはUserにしておいた。
Slackと違い、Hipchatは事前にユーザーを追加しておく必要があるみたいだ。

すでにHubotの環境があるので、そのまま続けてHipchatとも連携してみる。

hipchat/hubot-hipchat
基本的にはここのリンクの通りやるとうまくいく。

icu4cというのをインストールする必要があるが、すでに入っていたのでスキップした。

% brew install icu4c
% brew link icu4c

Hipchatと連携要のnpmをインストールする。

% npm install –save hubot-hipchat

Procfileに

web: bin/hubot –adapter hipchat

を追加する。
なので、slackの分を合わせると、

web: bin/hubot –adapter slack
web: bin/hubot –adapter hipchat

こうなる。

heroku config:add HUBOT_HIPCHAT_TOKEN=HipchatのAPIからtokenを作成する
heroku config:add HUBOT_HIPCHAT_JID=123_456@chat.hipchat.com
heroku config:add HUBOT_HIPCHAT_PASSWORD=アカウントのパスワード
heroku config:add HUBOT_HIPCHAT_ROOMS=123_hoge@@conf.hipchat.com

HUBOT_HIPCHAT_JIDはbot用に作ったユーザーのJabber IDです。
はじめ自分のJabber IDにしてて、まったくHubotが動かなくてハマりました。
XMPP/Jabber account settings

HUBOT_HIPCHAT_ROOMSが部屋のnameでなく、XMPP JIDなのでお間違えなく。

最後にデプロイすれば、自動的にHipchatにhubotユーザーが追加される。
追加されなければ何かが間違っている。

もしかすると、Roomのパーミッションをopenにしてないと追加されないかもしれない。
追加されたあとにprivateにすればよい。

% git push heroku master
% heroku ps:scale web=1

ちなみにHubotのコマンドはすごい量が公開されているので、必要ならこちらから取り込もう。
hubot-scripts/src/scripts at master · github/hubot-scripts

なかでも、hubot-scripts/src/scripts/zombies.coffee at master · github/hubot-scriptsがきになるが、コードを見ると特定の画像をrandomで出してるだけだったw

HipchatとGithubを連携させる

連携メモ – 優々自適
こちらの記事のとおりだが、一点気をつけるところは、

GitHub Integration – Help Center

RoomがXMPP JIDではなく、単純にRoom名なところ。
ここでもちょいとハマった。

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)
大塚 弘記
技術評論社
売り上げランキング: 465