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),但我不知道该怎么办.
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服务器应该在一分钟左右更新.这通常足以满足大多数用途,并且希望也是如此.
| 归档时间: |
|
| 查看次数: |
1449 次 |
| 最近记录: |