今回やりたかったことは、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
参考リンク
日経BP社
売り上げランキング: 43,041