edo1z blog

プログラミングなどに関するブログです

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は下記のような感じにした。

<?php
if(! isset($_POST['payload'])) die();

$payload = json_decode($_POST['payload']);
if(! (isset($payload->repository->url) &amp;&amp; $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] = false
set :normalize_asset_timestamps, false
set :use_sudo, false
default_run_options[:pty]   = true

#ステージ
set :stages, ["dev", "pro"]
set :default_stage, "dev"
# バージョン管理
set :scm, :git
set :scm_passphrase, "hogehogehoge"
# リポジトリ
set :repository, "git@github.com:hogeo/hoge.git"
# ブランチ
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}"

# デプロイサーバー
role :web, "hogeo@hogeo.sakura.ne.jp"
role :app, "hogeo@hogeo.sakura.ne.jp"

#ユーザアカウント
set:user, "hogeo"
set:password, "hogehogehoge"

set :scm_passphrase, "hogehoge"

namespace :deploy do
  before "deploy" do
    try_sudo "chown -R hogeo:users #{deploy_to}"
  end
end

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でデプロイ