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

19

我正在尝试建立一个类似于Heroku的纯Git工作流服务器。 我不需要关于设置Git的帮助,但出于信息目的,我正在使用gitolite。 我想要(某种方式)在此系统的操作系统(Ubuntu)中编写自定义钩子,以便在接收到特定分支的推送时,执行所有Heroku所做的运算(启动Rack、Mongrel、Apache(对于我来说是静态服务页面),等等)。

有人可以指向一些资源来完成这个或者至少开始吗?Google搜索并没有真正帮助到我...

5个回答

28

听起来您想在Git工作流程的某个特定点执行任意功能。Git hooks是解决该问题的方法。

如果您查看任何Git仓库(位于.git文件夹内),您将看到一个hooks文件夹。其中有许多不同名称的示例钩子文件。根据您上面的说明,您想编辑post-receive钩子文件,因为该文件将在远程仓库中更新新引用后立即调用(由本地推送导致)。有关更多信息,请阅读官方文档上的hooks或阅读这篇也许更易懂的解释

您可以在钩子文件中放置任何您想要的shell命令。将文件名从post-receive.sample更改为简单的post-receive,添加您需要启动Rack,Mongrel,Apache等所需的命令,然后使用快速的chmod +x post-receive使文件可执行即可。


我有点失望我的答案没有被选中,因为更新的版本包括一个指向git-deploy的链接,它正好做到了作者所要求的(“类似于Heroku的纯git工作流程” - 并在评论中解释了它的工作原理),但我还是会给你点赞的。 :) - bhamby
Git-deploy看起来是一个有趣的项目,但它似乎强调Ruby + Capistrano。我认为seth.vargo提出问题的主要驱动力是,如何根据Git活动自动触发操作。在这种情况下,对Git钩子的基本了解更具普适性。感谢您的支持。 - semperos

19
你看过Capistrano吗?以下是维基百科的介绍:

Capistrano是一种实用程序和框架,可通过SSH在多台远程计算机上并行执行命令。它使用一个简单的特定领域语言(DSL),部分借鉴自rake工具。 Rake类似于C世界中的make,允许您定义任务,并将其应用于某些角色的机器。它还支持通过某些网关机器进行隧道连接,以使操作在VPN和防火墙后执行。

Capistrano最初旨在简化和自动化Web应用程序部署到分布式环境,并最初捆绑了一组旨在部署Rails应用程序的任务。自 Capistrano 2.0以来,部署任务现在是可选的,并要求客户端在其食谱中显式放置“load 'deploy'”。

它不基于任何提交或帖子钩子,但我相信如果你真的需要这样做,那么你一定能找到一些示例配方来完成类似的工作。
更新:也许git-deploy(基于Capistrano)是你想要的:

一种在您的远程存储库上安装有用git钩子的工具,以在您的主机上启用基于push的、类似于Heroku的部署。


完全没有关系。我不需要知道如何部署应用程序,我需要知道如何使用自定义钩子,在通过git推送应用程序时自动启动这些进程。 - sethvargo
6
你可以在Capistrano中创建任务来控制你的应用服务器的启动和停止。因此,它并不是完全无关的。 - bhamby
是的,但我也可以用简单的rake甚至bash脚本来完成。 - sethvargo
@seth想要的和@galador提供的唯一区别是,@seth想要从他的开发工具箱中仅使用git。 - Andres Jaan Tack
这就是我的“更新”链接是如何工作的(git-deploy)。您只需运行一次设置以初始化一些东西,然后您可以执行类似于git push origin production的操作(其中production是您要自动部署的任何分支)。然后,它将在服务器端使用可爱的Git钩子自动执行部署操作(哪些操作由代码更改而确定,并在Github页面的“部署”部分中详细描述)。 - bhamby
大约一年前,git-deploy不再依赖于Capistrano。我发现这是最简单的设置工作流程的方式,而不会引入额外的复杂性或依赖关系。 - azurewraith

5
我刚发现了 https://github.com/mislav/git-deploy,它正是我所需要的。我将保留其他答案为“正确”(因为它是当时最好的),但我现在正在使用 git-deploy :)

2
我有一个类似的设置,其中主分支在 git push 时使用 capistrano 自动部署为 staging。生产环境从 production 分支手动部署。
此设置需要在 deploy.rb 中使用 "set :deploy_via, :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
                # 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

2
我建议您查看GitHub: progrium / dokku,它基于Docker技术,非常易于设置和使用。
如果您还在寻找云提供商,我推荐DigitalOcean,因为他们支持Dokku开箱即用!请查看他们的社区文档以获取更多信息。
您的工作流程将与Heroku非常相似:(完整教程)
  1. 设置Dokku服务器(您的个人Heroku)和您的公钥
  2. 将您的域配置为指向* .DOMAIN.com到Dokku服务器
  3. 将Git Remote添加到您的repo:git remote add myheroku dokku@DOMAIN.com:your-app
  4. 将代码推送到Dokku服务器:git push myheroku master
  5. 检查http://your-app.DOMAIN.com
另外,如果您想要为应用程序分配不同的子域或完整域,可以安装Dokku Domain Plugin,并将域指定为your-app:dokku domains:set your-app NEWDOMAIN.com 值得一提的是,还有一个名为Flynn的新项目GitHub:flynn / flynn,它比Dokku拥有更多的功能。在此处阅读关于Flynn和Dokku的历史...

还需要将0.0.0.0设置为RoR应用程序的主机名。 - przemo_li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接