个人服务器上类似heroku的工作流程

时间:2011-01-25 18:35:42

标签: ruby-on-rails git ubuntu workflow heroku

我正在尝试使用类似于heroku的纯git工作流设置服务器。我需要帮助设置git,但出于提供信息的目的,我正在使用gitolite。我想(不知何故)在这个系统的操作系统(Ubuntu)中编写自定义钩子,这样当它在特定分支上接收推送时,它会执行heroku所做的所有操作(启动Rack,Mongrel,Apache(用于)在我的情况下静态服务页面等)

有人能指向我这样做的资源或至少开始吗?谷歌搜索似乎没有帮助......

5 个答案:

答案 0 :(得分:28)

听起来你想在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使文件可执行即可全套。

答案 1 :(得分:19)

你看过Capistrano了吗?来自wiki:

  

Capistrano是一个实用程序和框架   用于并行执行命令   多台远程机器,通过SSH。它   使用简单的域特定语言   借用了工具耙子。   Rake类似于C世界中的make   并允许您定义任务,其中   可以适用于某些机器   角色。它还支持隧道   通过一些网关机器连接   允许执行操作   在VPN和防火墙之后。

     

Capistrano的   最初旨在简化   并自动部署Web   应用程序分发   环境,最初来了   捆绑了一套设计的任务   用于部署Rails应用程序。该   部署任务现在(截至   Capistrano 2.0)选择加入并要求   客户明确地加载"加载   “部署”"在他们的食谱中。

它不是基于任何类型的提交或发布挂钩,虽然我确定如果你确实需要它,那么你将能够找到一些示例配方来做类似的事情。

更新:也许git-deploy(基于Capistrano)就是您想要的:

  

在远程存储库上安装有用的git挂钩的工具,用于在主机上启用基于推送的Heroku式部署。

答案 2 :(得分:5)

我刚刚发现了https://github.com/mislav/git-deploy,这正是我想要的。我将把另一个答案保留为“正确”(因为它当时是最好的),但我现在正在使用git-deploy:)

答案 3 :(得分:2)

我有一个类似的设置,其中master分支在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

答案 4 :(得分:2)

我建议您查看GitHub:progrium/dokku,它基于Docker技术,并且非常易于设置和使用。

如果您还在寻找云提供商,我建议DigitalOcean,因为他们支持开箱即用的Dokku!查看他们的community documentation以获取更多信息。

您的工作流程与Heroku非常相似:(Full Tutorial

  1. 设置Dokku服务器(您的个人Heroku)和您的公钥
  2. 将您的域配置为* .DOMAIN.com指向Dokku服务器
  3. 将Git Remote添加到您的仓库:git remote add myheroku dokku@DOMAIN.com:your-app
  4. 将代码推送到Dokku服务器:git push myheroku master
  5. 结帐http://your-app.DOMAIN.com
  6. 此外,如果您希望为自己的应用分配不同的子域或完整域名,则可以安装Dokku Domain Plugin,只需为您的应用指定域名:dokku domains:set your-app NEWDOMAIN.com

    值得一提的是名为Flynn GitHub: flynn/flynn的新项目,其功能比Dokku更多。阅读Flynn和Dokku背后的历史here...