3

我在 bitbucket 中有一个 Git 存储库,在我的 live rails 服务器上有另一个,我怎样才能做到,所以每当我推送到 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 上看到过 post hooks(类似于 github),但我不知道该怎么做。

4

2 回答 2

8

分析

BitBucket 有许多服务挂钩,但我使用的没有一个明确用于触发部署脚本。您可以使用BitBucket 代理 API扮演自己的角色,但这通常不是正确的做法。

公认的智慧是使用来自持续集成的部署脚本,这样您只部署成功的构建。请注意,我说的是“部署”而不是“推送”,因为您无法推送到具有工作树的存储库。

但是,如果没有持续集成、接收后挂钩或Capistrano等部署工具,当然也可以触发 Rails 更新 。轮询是一种选择。

解决方案

虽然 post-receive 或 service hook 可以在提交时触发任意操作,但最简单的事情就是从您的 Web 服务器轮询 Git。例如,您可以每分钟运行一次 cron 作业,以将当前的 master 分支拉入您的 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 服务器应该会在一分钟左右内自行更新。这通常足以满足大多数目的,希望你也是如此。

于 2012-06-29T00:40:52.827 回答
0

如果您希望在推送到 bitbucket 时发生事情,我认为您需要以某种方式使用他们的经纪人支持。也许将更新的 refs 发布到服务器上的某些服务,这些服务会拉取、重置等。

但是如果你直接推送到你自己的服务器,你可以使用标准的 git post-receive 钩子。

于 2012-06-09T15:43:01.467 回答