使用Git和Rails自动部署,它是如何工作的?

Rya*_*yan 3 git ruby-on-rails bitbucket

我在bitbucket中有一个Git存储库,在我的实时rails服务器上有另一个存储库,我怎样才能这样做,每当我推送到bitbucket它时,实时服务器也从bitbucket中取出它?

我在网上发现了这个片段,我把它放在我的直播服务器的git hooks上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
Run Code Online (Sandbox Code Playgroud)

任何人都可以指出我应该怎么做才能实现这一目标?我在bitbucket上看过post hooks(类似于github),但我不知道该怎么办.

Tod*_*obs 8

分析

BitBucket有许多服务挂钩,但我所使用的没有明确用于触发部署脚本.您可以使用BitBucket代理API自行编写角色,但这通常不是正确的做法.

获得的智慧是使用来自持续集成的部署脚本,因此您只需部署成功的构建.请注意,我说"部署"而不是"推送",因为您无法使用工作树推送到存储库.

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

虽然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}"
Run Code Online (Sandbox Code Playgroud)

此脚本假设您正在使用Phusion Passenger.如果您正在使用其他内容,则可能需要修改脚本以在Git从远程存储库中提取后执行其他操作.

接下来,确保脚本是可执行的.chmod 755 /usr/local/bin/git_poll.sh应该这样做.

最后,使用类似于以下内容的方式更新您的Rails用户或系统crontab:

* * * * * /usr/local/bin/git_poll.sh example_app
Run Code Online (Sandbox Code Playgroud)

由于我们在脚本中使用独占锁定,因此每分钟轮询应该没问题.如果不使用锁定,或者想减少系统负载,请在crontab中设置更长的轮询间隔.

而已!现在,当您从开发或QA 推送到时,您的Rails服务器应该在一分钟左右更新.这通常足以满足大多数用途,并且希望也是如此.