3

Bitbucket に Git リポジトリがあり、ライブ Rails サーバーに別の Git リポジトリがあります。bitbucket にプッシュするたびに、ライブ サーバーが bitbucket からもプルするようにするにはどうすればよいですか?

このスニペットをオンラインで見つけて、ライブ サーバーの git フックに として配置しましたpost-receiveが、次に何をすればよいかわかりません。

#!/bin/sh
name=$1
if [ -z "$name" ] ; then
        echo "need to give name of checkout dir on command line"
        exit 1
fi

dir=/srv/web/$name
if [ ! -d $dir ] ; then
        echo "the directory $dir does not exist"
        exit 1
fi

cd $dir
env -i git pull
rake db:migrate
touch $dir/tmp/restart.txt

これを実現するために何をすべきか誰でも指摘できますか? bitbucket でポスト フック (github に類似) を見たことがありますが、どうすればよいかわかりません。

4

2 に答える 2

8

分析

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 分ほどで更新されるはずです。通常、ほとんどの目的にはこれで十分です。

于 2012-06-29T00:40:52.827 に答える
0

bitbucket にプッシュしたときに何かが起こるようにしたい場合は、何らかの方法でブローカーのサポートを使用する必要があると思います。おそらく、プル、リセットなどを行うサーバー上のサービスに、更新された参照を投稿してください。

ただし、独自のサーバーに直接プッシュする場合は、標準の git post-receive フックを使用できます。

于 2012-06-09T15:43:01.467 に答える