我正在研究使用Capistrano作为通用部署解决方案的可能性。 “通用”,我的意思是不是铁轨。我对我发现的文档的质量不满意,但是,我认为,我不是在考虑那些假设你正在部署rails的文档。所以我会尝试根据一些例子来解决问题,但是从一开始我就面临着一些问题。
我的问题是cap deploy
没有足够的信息可以做任何事情。重要的是,它缺少我要部署的版本的标记,并且此已在命令行上传递。
另一个问题是我如何指定我的git存储库。我们的git服务器在用户的帐户上通过SSH访问,但我不知道如何更改deploy.rb
以将用户的ID用作scm URL的一部分。
那么,我该如何完成这些事情呢?
示例
我想部署第二个版本的第一个sprint的结果。这在git存储库中标记为r2s1
。另外,假设用户“johndoe”负责部署系统。要访问存储库,他必须使用URL johndoe@gitsrv.domain:app
。因此,存储库的远程URL取决于用户ID。
获取所需文件的命令行将是:
git clone johndoe@gitsrv.domain:app
cd app
git checkout r2s1
答案 0 :(得分:47)
更新:对于Capistrano 3,请参阅scieslak's answer below。
jarrad已经说过,capistrano-ash是一个很好的基本辅助模块来部署其他项目类型,尽管在一天结束时并不需要它。它只是一种脚本语言,大多数任务都是通过系统命令完成的,最终变成了几乎像shell脚本一样。
要传入参数,可以在运行上限时设置-s标志,以便为您提供键值对。首先创建这样的任务。
desc "Parameter Testing"
task :parameter do
puts "Parameter test #{branch} #{tag}"
end
然后开始你的任务。
cap test:parameter -s branch=master -s tag=1.0.0
最后一部分。我建议使用ssh密钥为您的服务器设置无密码访问。但是如果你想从当前登录的用户那里拿走它。你可以这样做。
desc "Parameter Testing"
task :parameter do
system("whoami", user)
puts "Parameter test #{user} #{branch} #{tag}"
end
更新:已修改为使用最新版本的Capistrano。配置数组不再可用。
全局参数:参见注释使用set:branch,fetch(:branch,'a-default-value')全局使用参数。 (并用-S传递它们。)
答案 1 :(得分:10)
<强>更新。关于仅将参数传递给Capistrano 3任务。
我知道这个问题相当陈旧,但在搜索将参数传递给Capistrano任务时仍会首先在Google上弹出。不幸的是,Jamie Sutherland提供的精彩答案已不再适用于Capistrano 3.在您浪费时间尝试之前,除了结果如下:
cap test:parameter -s branch=master
输出:
cap aborted!
OptionParser::AmbiguousOption: ambiguous option: -s
OptionParser::InvalidOption: invalid option: s
和
cap test:parameter -S branch=master
输出:
invalid option: -S
@senz和Brad Dwyer提供的Capistrano 3的有效答案,您可以点击此黄金链接找到: Capistrano 3 pulling command line arguments
为了完整性,请参阅下面的代码,了解您的两个选项。
第一个选项:
您可以像使用常规哈希一样使用键和值迭代任务:
desc "This task accepts optional parameters"
task :task_with_params, :first_param, :second_param do |task_name, parameter|
run_locally do
puts "Task name: #{task_name}"
puts "First parameter: #{parameter[:first_param]}"
puts "Second parameter: #{parameter[:second_param]}"
end
end
调用上限时,请确保参数之间没有空格:
cap production task_with_params[one,two]
第二个选项:
当您调用任何任务时,您可以分配环境变量,然后从代码中调用它们:
set :first_param, ENV['first_env'] || 'first default'
set :second_param, ENV['second_env'] || 'second default'
desc "This task accepts optional parameters"
task :task_with_env_params do
run_locally do
puts "First parameter: #{fetch(:first_param)}"
puts "Second parameter: #{fetch(:second_param)}"
end
end
要分配环境变量,请调用caplow:
cap production task_with_env_params first_env=one second_env=two
希望能节省你一些时间。
答案 2 :(得分:9)
我建议使用ENV变量。
像这样的事(命令):
$ GIT_REPO="johndoe@gitsrv.domain:app" GIT_BRANCH="r2s1" cap testing
上限配置:
#deploy.rb:
task :testing, :roles => :app do
puts ENV['GIT_REPO']
puts ENV['GIT_BRANCH']
end
看看https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension,这种方法可能对你有用。
答案 3 :(得分:3)
正如Jamie已经展示的那样,您可以将参数传递给具有-s
标志的任务。我想告诉你如何另外使用默认值。
如果您想使用默认值,则必须使用fetch
代替||=
或检查nil
:
namespace :logs do
task :tail do
file = fetch(:file, 'production') # sets 'production' as default value
puts "I would use #{file}.log now"
end
end
您可以运行此任务(对production
使用默认值file
)
$ cap logs:tail
或(对cron
file
$ cap logs:tail -s file=cron
答案 4 :(得分:0)
查看capistrano-ash以获取有助于非rails部署的库。我使用它来部署PyroCMS应用程序并且效果很好。
以下是该项目的Capfile的片段:
# deploy from git repo
set :repository, "git@git.mygitserver.com:mygitrepo.git"
# tells cap to use git
set :scm, :git
我不确定我理解问题的最后两部分。提供更多细节,我很乐意提供帮助。
在给出示例后编辑:
set :repository, "#{scm_user}@gitsrv.domain:app"
然后,每个拥有部署priveled的人都可以将以下内容添加到他们的本地〜/ .caprc文件中:
set :scm_user, 'someuser'