个人服务器上的类似于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的样部署安装有用的混帐挂钩的工具。

+0

这完全不相干。我不需要知道如何部署应用程序,我需要知道如何使用自定义挂钩来自动启动这些进程,只要通过git推送应用程序 – sethvargo 2011-01-25 20:59:16

+6

您可以在Capistrano中创建任务来控制应用程序的启动和停止服务器(S)。所以不,不*完全*不相关。 – bhamby 2011-01-25 22:35:50

+0

是的,但我也可以用简单的耙子甚至bash脚本来做到这一点 – sethvargo 2011-01-26 03:23:09

我有一个类似的设置,主分支自动部署为在git push上使用capistrano进行分级。生产是从生产分支手动部署的。

该设置要求您使用set :deploy_via, :remote_cachedeploy.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 :)