个人服务器上的类似于heroku的工作流程
我正在尝试使用类似于heroku的纯Git工作流设置服务器。我不要需要帮助设置git,但为了提供信息,我使用的是gitolite。我想(以某种方式)在该系统的操作系统(Ubuntu)中编写自定义钩子,以便当它在特定分支上收到推送时,它执行所有的操作员heroku(启动Rack,Mongrel,Apache(for静态服务于我的情况下页)等个人服务器上的类似于heroku的工作流程
有人能指出我朝着资源要做到这一点,或至少开始?谷歌搜索并没有真的没什么帮助......
听起来好像你想在你的Git工作流中的某个点执行任意的功能。 Git钩子是要走的路。
如果您查看任何Git回购(位于.git
文件夹内),您会看到一个hooks
文件夹。里面有很多不同名称的示例钩子文件。根据你上面的解释,你需要编辑post-receive
钩子文件,因为在你的远程仓库中更新一个新的ref(这是从一个本地仓库推送产生的)后立即调用它。欲了解更多信息,请阅读the official documentation on hooks或阅读也许more approachable explanation。
你可以在钩子文件中放入你想要的任何shell命令。将文件名从post-receive.sample
更改为post-receive
,添加启动Rack,Mongrel,Apache等所需的命令,然后使用快速chmod +x post-receive
来使文件可执行,并且完成设置。
你有没有看?在Capistrano来自维基:
Capistrano的是用于在并行执行命令的效用和框架多台远程机器,通过SSH。它 使用部分从工具耙借来的简单域特定语言 。 Rake与C世界中的 类似,并允许您定义任务,其中 可应用于某些 角色中的机器。它还支持通过某些网关机器 的隧道连接 ,以允许在VPN和防火墙后面执行操作 。
Capistrano的 的最初目的是为了简化 和自动化网络的部署 应用分布式 环境,和最初来 用一套旨在 部署Rails应用程序的任务捆绑在一起。 部署任务现在(截至 Capistrano 2.0)选择加入并要求 客户端明确将“加载 ”部署“”放入其配方中。
它不是基于任何类型的提交或邮件挂钩,虽然我确定如果你真的需要这样做,那么你将能够找到一些例子食谱做这样的事情。
更新:也许git-deploy(基于Capistrano的)是你想要什么:
到远程仓库,使你的主机上的基于推送的,Heroku的样部署安装有用的混帐挂钩的工具。
我有一个类似的设置,主分支自动部署为在git push上使用capistrano进行分级。生产是从生产分支手动部署的。
该设置要求您使用set :deploy_via, :remote_cache
的deploy.rb
在服务器上有本地缓存副本。这是为了能够运行最新配置的capistrano(如果自上次部署以来已更改)。
post-receive
钩子脚本:
#!/bin/bash
while read oldrev newrev ref
do
if [ "$ref" = "refs/heads/master" ] ; then
echo "Master branch pushed, deploying to staging"
# seams to be set to "." for hooks, unset to make things more normal
unset GIT_DIR
# deploy path, where "current", "releases", "shared" etc are
DEPLOYDIR="/home/user/deploy/staging"
# default path for :deploy_via :remote_cache is shared/cached-copy
cd "$DEPLOYDIR/shared/cached-copy"
# update cache to pushed revision, will be done by capistrano too
git fetch origin && git fetch --tags origin && git reset --hard "$newrev"
# load rvm
source ~/.rvm/scripts/rvm
rvm use 1.9.2
# make sure correct gems are installed
# this will also create a .bundle directory
bundle install --gemfile Gemfile --path "$DEPLOYDIR/shared/bundle" --deployment --without development test
# run capistrano
# if you use deploy:migrations instead of deploy you should probably add
# after "deploy:migrations", "deploy:cleanup"
# to your deploy.rb
bundle exec cap staging deploy:migrations
fi
done
没有:remote_cache
一个更简单的设置也是可能的,但它会运行与以前的(目前部署)配置和接缝Capistrano的更脆弱一些。
post-receive
钩子脚本:
#!/bin/bash
while read oldrev newrev ref
do
if [ "$ref" = "refs/heads/master" ] ; then
echo "Master branch pushed, deploying to staging"
# seams to be set to "." for hooks, unset to make things more normal
unset GIT_DIR
source ~/.rvm/scripts/rvm
rvm use 1.9.2
cd /home/user/deploy/staging/current && bundle exec cap staging deploy:migrations
fi
done
我刚刚发现https://github.com/mislav/git-deploy,这正是我想要的。我打算将其他答案保留为“正确”(因为它当时是最好的),但我现在正在使用git-deploy :)
这完全不相干。我不需要知道如何部署应用程序,我需要知道如何使用自定义挂钩来自动启动这些进程,只要通过git推送应用程序 – sethvargo 2011-01-25 20:59:16
您可以在Capistrano中创建任务来控制应用程序的启动和停止服务器(S)。所以不,不*完全*不相关。 – bhamby 2011-01-25 22:35:50
是的,但我也可以用简单的耙子甚至bash脚本来做到这一点 – sethvargo 2011-01-26 03:23:09