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