分析
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 服务器应该会在一分钟左右内自行更新。这通常足以满足大多数目的,希望你也是如此。