我已经开发了一段时间的Rails,但不知何故,直到现在才避免使用capistrano .
试图弄清楚如何开始,我已经对最佳的capistrano配方感到困惑,因为资产管道部署的相当“标准”的rails 3.x . 也许是因为环顾谷歌,人们可以从历史的各个部分找到“答案”,不同的历史时期将不同的东西纳入上限 .
我有一个应用程序,我保留在git,rails 3.2,带有资产管道,只部署到一个有乘客的主机 .
想一想,我基本上需要限制:
_999_从git部署?
-
在git中为部署创建一个标签(和/或使用部署分支?无论什么是最标准的上限,如果有这样的事情)
-
bundle install --deployment
-
rake db:migrate
-
rake assets:预编译
-
touch tmp / restart.txt
哦,废话,一个可能奇怪的事情:
- 我想我将在部署服务器上使用系统范围的rbenv安装 . 不知道那会带来什么 .
什么是最标准,最简单,最简单,最易于维护的方法来制作所有这些东西?有什么我想念的吗?如果我指定的某些内容不是标准的,我很乐意使用标准的最佳实践(可能是一两个例外,我真的想为每个部署使用git标记,即使这不是标准的最佳实践,虽然我认为它会是,但是看着文档如何运作却感到困惑)
这里有一个简单的答案吗?
EDIT :是的,我很慢,但我甚至还没有'getting started'文件 . 没有关于默认开箱即用配方实际上做什么的文档 . 等等
update :我在搞清楚之后编写了我自己的指南 . https://gist.github.com/2161449
3 回答
好吧,不必使用capistrano是一种祝福:-) . 我越来越不喜欢它,但公平地说,它已经变得更好了,而且这里的文档解决了你的大部分问题 - 关于RVM的部分可能足以替代rbenv了 . 您的配置应该与开箱即用的capfile一起使用 .
编辑:是的,你需要自己做标记,但关键是要考虑你在capfile中编写的方法只是系统命令(记住你可能没有正常的shell路径和其他环境) . 按照其他git命令的例子,你会没事的 .
编辑:更好的答案(也许:-)
到这里:https://github.com/capistrano/capistrano/wiki/2.x-From-The-Beginning
gem install capistrano
(注意,通常这不属于您的Gemfile)cd
capify .
创建app/Capfile
和app/config/deploy.rb
您正在使用资产管道,因此在Capfile中取消注释
load 'deploy/assets'
现在,看看deploy.rb
应用程序名称是"my_application"这样的名称
repository是源控件存储库的URL,例如
myusername@github.com:yourrepo/yourproj.git
scm: git
(对吗?如果不是,同样的想法:上面的URL和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到远程计算机的权限,并且远程计算机需要访问源控制存储库 . 公钥是你的朋友 .
在此之后,工作流程为:
进行更改
本地测试
commit,并推送到git
cap deploy migrations
(迁移部分仅在您完成后才需要)大多数组织都有某种登台或测试服务器 . 找"multistage"得到它所以你可以做
cap test deploy
和cap staging deploy
等 .要在git上部署一个分支(我认为是一个标记)它是
cap -S <branch/tagname> deploy
(确保它的大写字母S可能是小写的) .一旦实现这一目标,您可能希望在部署之前或之后做些事情 - 例如发送电子邮件,重新生成站点 Map ,备份数据库等等 . 使用前面或后面的钩子来编写自己的任务 .
所以capistrano最糟糕的部分是所有的医生都假设你知道它到底做了什么 . 简而言之,它使用ssh(ruby的net-ssh)在任何本地的远程服务器上执行命令您部署的工作站 . 它会查看源树的头部(或者如果指定了标记或分支),将其拉入服务器上的新位置,执行其他任何操作(迁移,资产预编译)并准备应用程序;一旦看起来不错,它会更改符号链接(例如
/var/www/current
指向新位置,然后(在Passenger的情况下)调用touch app/tmp/restart.txt
以使服务器重新启动 .更好?
这是我用于大多数项目的上限配方......
https://gist.github.com/2118882
它不进行标记,但可以在自定义任务中完成,它们就像rake任务一样编写 . 默认情况下,它将执行预编译和捆绑安装 . 在底部是通过触摸tmp / restart.txt而不是重新启动来重新加载的任务 . 它还将清理您的版本,因此您只有服务器上的最新版本3(而不是默认情况下保留它们) .
我在任何环境中都不了解RBEnv,我使用RVM进行开发并且曾经在 生产环境 中使用过RVM,但是在 生产环境 环境中管理多个红宝石是非常麻烦的(而且非常糟糕的做法)我不会再这样做了 . 它为服务器端软件包的升级过程增加了很多复杂性 .
您是否看过Railscast:Deploying to a VPS虽然它基于nginx和独角兽,但还有另一种乘客配方 .