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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>