我有一个到位桶Git仓库和另一个我的生活轨道的服务器上,我怎样才能使它所以每当我推到它到位桶,直播服务器从到位桶拉呢?
我发现这个片段在网上,我把它放在我的直播服务器的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
任何人都可以指出我应该怎么做才能做到这一点? 我见过的到位桶(类似于github上)支柱钩子,但我不知道该怎么办。
分析
到位桶有许多服务挂钩 ,但没有我所使用的那些是明确触发部署脚本。 你可以角色自己使用到位桶经纪人API ,但这通常是不应该做的事情。
普遍的看法是,从持续集成使用部署脚本,让你只部署成功的基础之上。 请注意,我说的“部署”,而不是“推”,因为你不能推到一个资源库和工作树。
然而,这当然有可能触发没有持续集成一个Rails更新后收到钩,或诸如部署工具Capistrano的 。 轮询是一个替代方案。
解
虽然后收到或服务挂钩可以触发提交任意行动,以最简单的做法就是从你的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客运 。 如果你使用别的东西,你可能需要修改脚本的Git从远程仓库拉后采取一些其他动作。
接下来,确保脚本是可执行的。 chmod 755 /usr/local/bin/git_poll.sh
应该这样做。
最后,更新你的Rails用户或系统的crontab类似下面的内容:
* * * * * /usr/local/bin/git_poll.sh example_app
由于我们在脚本中,轮询采用独家锁定每分钟应该罚款。 如果你不使用锁定,或者要减少系统上的负载,然后在crontab设置较长的轮询间隔。
而已! 现在,当您从开发或QA推到原点 ,你的Rails服务器会在一分钟左右的时间内进行自我更新。 这通常在大多数情况下足够,希望你也是如此。
如果你想,当你推到位桶,我认为你需要使用他们发生的事情经纪人支持莫名其妙。 也许发表您的服务器上更新裁判的一些服务,拉,复位等。
但是,如果你直接推送到自己的服务器,你可以使用标准的git后收到钩。