Capistrano,Rails 3.2,标准配方?

时间:2012-03-19 16:35:28

标签: ruby-on-rails capistrano

我已经开发了一段时间的Rails,但不知何故直到现在才避免使用capistrano。

试图弄清楚如何开始,我对于使用资产管道部署的相当“标准”rails 3.x的最佳capistrano配方感到困惑。也许是因为环顾谷歌,人们可以从历史的各个部分找到“答案”,不同的历史时期将不同的东西纳入上限。

我有一个应用程序,我保留在git,rails 3.2,带有资产管道,只部署到一个带有乘客的主机。

考虑一下,我基本上需要限制:

  • 从git部署?
  • 在git中为部署制作一个标签(和/或使用部署分支?无论什么是最标准的帽子,如果有这样的事情)
  • 捆绑安装 - 部署
  • rake db:migrate
  • rake assets:precompile
  • 触摸tmp / restart.txt

哦,废话,一个可能奇怪的事情:

  • 我想我将在部署服务器上使用系统范围的rbenv安装。不知道那会带来什么。

最简单,最简单,最简单,最易于维护的方法是如何让所有这些东西完成?有什么我想念的吗?如果我指定的某些内容不是标准的,我很乐意使用标准的最佳实践(可能是一两个例外,我真的想为每个部署使用git标记,即使这不是标准的最佳实践,虽然我认为它会是,但是看着文档如何运作却感到困惑)

这里有一个简单的答案吗?

编辑:是的,我看过了Cap wiki。可能是因为我很慢,但我在那里找到了没有问题的答案。甚至没有“入门”文件。没有关于默认开箱即用配方实际上做什么的文档。等。

更新:我在搞清楚之后编写了自己的指南。 https://gist.github.com/2161449

3 个答案:

答案 0 :(得分:9)

好吧,不必使用capistrano是一种祝福:-)。我越来越不喜欢它,但公平地说,它已经有了更好的很多,而这里的文档https://github.com/capistrano/capistrano/wiki/解决了你的大多数问题 - 关于RVM的部分可能足以替代rbenv。您的配置应该与开箱即用的capfile一起使用。

编辑:是的,你需要自己做标记,但关键是要把你在capfile中编写的方法看作系统命令(记住你可能没有正常的shell路径和其他环境) )。按照其他git命令的例子,你会没事的。

编辑:更好的回答(可能: - )

  • 转到此处:https://github.com/capistrano/capistrano/wiki/2.x-From-The-Beginning
  • gem install capistrano(注意,通常这不属于您的Gemfile)
  • cd
  • capify .创建app/Capfileapp/config/deploy.rb
  • 您正在使用资产管道,因此在Capfile中取消注释load 'deploy/assets'
  • 现在,看看deploy.rb
    • 应用程序名称是“my_application”
    • 之类的名称
    • repository是源控件存储库的URL,例如myusername@github.com:yourrepo/yourproj.git
    • scm: git(对吗?如果没有,同样的想法:上面的网址和SVN的这个,或其他什么)
    • role :web "www.example.com"因为你的:db和:app都在一个盒子里,那些是相同的
    • 您正在使用Passenger,因此请按指示取消注释。
    • 不确定,但您可能需要require "bundler/capistrano"位于顶部
    • 您需要set :deploy_to, <remote installation path> "/var/www"
    • 按照指南中的其他步骤进行操作
    • 假设在这些以及我错过的步骤之后,检查所有这些,并确保您的应用已签入(并在git中推送),然后执行cap deploy:setup

假设,安装程序将相应地配置您的服务器。这里最有可能的错误是您当前的计算机需要ssh到远程计算机的权限,并且远程计算机需要访问源控制存储库。公钥是你的朋友。

在此之后,工作流程为:

  • 进行更改
  • 本地测试
  • 提交,并推送到git
  • cap deploy migrations(只有在您完成任务后才需要迁移部分)

大多数组织都有某种登台或测试服务器。寻找“多级”来获取它,以便您可以cap test deploycap staging deploy等。

要在git上部署一个分支(我认为是一个标记),它是cap -S <branch/tagname> deploy(确保它的大写字母S可能是小写的。)

一旦实现这一目标,您可能希望在部署之前或之后做些事情 - 例如发送电子邮件,重新生成站点地图,备份数据库等等。使用前面或后面的钩子来编写自己的任务。

所以capistrano最糟糕的部分是所有的医生都假设你知道它到底是做什么的。简而言之,它使用ssh(ruby的net-ssh)从您部署的任何本地工作站在远程服务器上执行命令。它会查看源树的头部(或者如果指定了标记或分支),将其拉入服务器上的新位置,执行其他任何操作(迁移,资产预编译)并准备应用程序;一旦看起来不错,它会更改符号链接(例如/var/www/current指向新位置,然后(在Passenger的情况下)调用touch app/tmp/restart.txt以使服务器重新启动。

更好?

答案 1 :(得分:1)

这是我用于大多数项目的上限配方......

https://gist.github.com/2118882

它不进行标记,但可以在自定义任务中完成,它们就像rake任务一样编写。默认情况下,它将执行预编译和捆绑安装。在底部是通过触摸tmp / restart.txt而不是重新启动来重新加载的任务。它还会清理你的版本,所以你只能在服务器上安装最新版本3(而不是默认保留它们)。

我在任何环境中都不了解RBEnv,我使用RVM进行开发,并且曾经在生产中使用过RVM,但是在生产环境中管理多个红宝石是非常麻烦的(而且非常糟糕的做法)我不会再来一遍。它为服务器端软件包的升级过程增加了很多复杂性。

答案 2 :(得分:0)

您是否看过Railscast:Deploying to a VPS虽然它基于nginx&amp;独角兽,有另一种乘客食谱。

相关问题