分析
BitBucket には多数のサービス フックがありますが、デプロイ スクリプトを明示的にトリガーするために使用したフックはありません。BitBucket ブローカー APIを使用して独自のロールを作成することもできますが、これは一般的に正しいことではありません。
成功したビルドのみをデプロイするように、継続的インテグレーションのデプロイ スクリプトを使用するというのが一般的な知恵です。「プッシュ」ではなく「デプロイ」と言ったことに注意してください。これは、作業ツリーを含むリポジトリにプッシュできないためです。
ただし、継続的インテグレーション、受信後のフック、または
Capistranoなどのデプロイ ツールがなくても、Rails の更新をトリガーすることは確かに可能です。ポーリングは 1 つの代替手段です。
解決
post-receive または service フックはコミット時に任意のアクションをトリガーできますが、最も簡単なことは、Web サーバーから Git をポーリングすることです。たとえば、毎分 cron ジョブを実行して、現在のマスター ブランチを Web ルートの下の作業ツリーにプルすることができます。
まず、ポーリング スクリプトをインストールしてテストします。私は通常、これのバリエーションを使用します。
#!/bin/bash
# Script:
# git_poll.sh <appname>
# Purpose:
# Poll your Rails repository for changes.
set -e
WEBROOT='/var/www'
MY_RAILS_APPNAME="$1"
shift
# Use the flock(1) utility to guard against long-running fetch or merge
# operations using the flock(2) system call. On Debian-based systems,
# this tool is found in the util-linux package.
(
flock -n 9
cd "$WEBROOT/$MY_RAILS_APPNAME"
git fetch origin master
# Check if heads point to the same commit.
if ! cmp --quiet <(git rev-parse master) <(git rev-parse origin/master)
then
git pull --force origin master
touch "$WEBROOT/$MY_RAILS_APPNAME/tmp/restart.txt"
fi
) 9> "/var/lock/polling4${MY_RAILS_APPNAME}"
このスクリプトは、Phusion Passengerを使用していることを前提としています。他のものを使用している場合は、Git がリモート リポジトリからプルした後に他のアクションを実行するようにスクリプトを変更する必要がある場合があります。
次に、スクリプトが実行可能であることを確認します。chmod 755
/usr/local/bin/git_poll.sh
するべきです。
最後に、Rails ユーザーまたはシステムの crontab を次のように更新します。
* * * * * /usr/local/bin/git_poll.sh example_app
スクリプトで排他ロックを使用しているため、毎分のポーリングで問題ありません。ロックを使用しない場合、またはシステムの負荷を軽減したい場合は、crontab でより長いポーリング間隔を設定してください。
それでおしまい!これで、開発または QA からオリジンにプッシュすると、Rails サーバーは 1 分ほどで更新されるはずです。通常、ほとんどの目的にはこれで十分です。