githubにpushするとcapistranoと連動して自動デプロイする
githubにはPost-Receive Hooksという機能があり、これはpushされると、登録したurlにpostアクセスし、json形式でpushしたデータの内容を渡してくれる。なので、このgithubからのpostアクセスを受け付けて、pushデータ内容に応じて、capistranoのサーバにアクセスしcapistranoでデプロイをするようにすれば、pushからの自動デプロイが可能になる。
PHPでGitHubからのpostアクセスの受けをつくる
今回はcapistranoと同じサーバにGitHubのpostアクセスの受けをつくった。ちなみにさくらのvpsサーバ。 apacheの設定をしてgithubから受けられるようにする。受けのphpは下記のような感じにした。
<?phpif(! isset($_POST['payload'])) die();
$payload = json_decode($_POST['payload']);if(! (isset($payload->repository->url) && $payload->repository->url == 'https://github.com/hogehoge')){ die();}
chdir('../cap/hoge');shell_exec('cap dev deploy');githubから来てるものに限定するとかするともっとよい。あと、ブランチに応じて、開発サーバデプロイと、本番サーバデプロイを分けるとかできる。まあでも本番デプロイは手動でもいいか。さくらvpsだとapacheのドキュメントルートは/var/www/htmlでして、そこに上記phpファイルを置いております。chdirはつまり/var/www/cap/hogeに移動しており、hoge上にcapistranoフォルダを作っており、そこでcap dev deployをしております。githubのpostアクセスを受けているのはapacheですので、cap dev deployしているのもapacheになります。なので、apache君のssh pubkeyを作ったりしました。あとデプロイサーバのssh pubkeyもgithubに登録しました。僕のcapistranoはどこかで調べてconfig/deploy.rb以外に、config/deploy/dev.rbというのもありますので、それぞれ下記のような内容にしました。ちなみにデプロイサーバもサクラのレンタルサーバです。
config/deploy.rb
require "capistrano/ext/multistage"require "capistrano_colors"require "railsless-deploy"require "rubygems"
ssh_options[:forward_agent] = falseset :normalize_asset_timestamps, falseset :use_sudo, falsedefault_run_options[:pty] = true
#ステージset :stages, ["dev", "pro"]set :default_stage, "dev"# バージョン管理set :scm, :gitset :scm_passphrase, "hogehogehoge"# リポジトリ# ブランチset :branch, "dev"# デプロイ方式#set :deploy_via, :remote_cache#世代管理set :keep_releases, 1
# デプロイ対象外ファイルset :copy_exclude, [".git", ".gitignore"]config/deploy/dev.rb
# アプリケーション名set :application, "hoge"# デプロイ先ディレクトリset :deploy_to, "/home/hogeo/www/#{application}"
# デプロイサーバー
#ユーザアカウントset:user, "hogeo"set:password, "hogehogehoge"
set :scm_passphrase, "hogehoge"
namespace :deploy do before "deploy" do try_sudo "chown -R hogeo:users #{deploy_to}" endend
after "deploy", "upload_config"
desc "各種セットアップ情報をアップロードします"task :upload_config, roles => :web do run "cp -f /home/hogeo/www/hoge/database.php #{latest_release}/app/Config/." run "chmod -R 755 #{deploy_to}/current/" run "rm -rf #{latest_release}/app/tmp/cache/persistent/*" run "rm -rf #{latest_release}/app/tmp/cache/models/*" run "rm -rf #{latest_release}/app/tmp/logs/*"end参考 Webサイトをgithubで管理してpush時に自動的に同期する方法 GitHubとJenkins連動 自動デプロイ 開発環境設定編 githubにPushしたらwebhooksとSinatraを利用してサイトを自動的に更新する GithubにあるプライベートリポジトリをCapistranoでデプロイ