将参数传递给Capistrano

Dan*_*ral 31 deployment capistrano

我正在研究使用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
Run Code Online (Sandbox Code Playgroud)

Jam*_*and 47

更新:对于Capistrano 3,请参阅下面的scieslak的答案.


jarrad已经说过,capistrano-ash是一个很好的基本辅助模块来部署其他项目类型,尽管在一天结束时并不需要它.它只是一种脚本语言,大多数任务都是通过系统命令完成的,最终变成了几乎像shell脚本一样.

要传入参数,可以在运行上限时设置-s标志以为您提供键值对.首先创建这样的任务.

desc "Parameter Testing"
task :parameter do
  puts "Parameter test #{branch} #{tag}"
end
Run Code Online (Sandbox Code Playgroud)

然后像这样开始你的任务.

cap test:parameter -s branch=master -s tag=1.0.0
Run Code Online (Sandbox Code Playgroud)

最后一部分.我建议使用ssh密钥为您的服务器设置无密码访问.但是如果你想从当前登录的用户那里拿走它.你可以做这样的事情.

desc "Parameter Testing"
task :parameter do
  system("whoami", user)
  puts "Parameter test #{user} #{branch} #{tag}"
end
Run Code Online (Sandbox Code Playgroud)

更新:编辑使用最新版本的Capistrano.配置数组不再可用.

全局参数:请参阅注释 使用set:branch,fetch(:branch,'a-default-value')全局使用参数.(并用-S传递它们.)

  • 是的,确切地说 - 使用`set:branch,fetch(:branch,'a-default-value')`来全局使用参数.(并用'-S`代替它们.) (4认同)
  • 如果您正在使用Capistrano的多级扩展,则stage.rb文件似乎在Capfile中的代码之后进行评估,并且在那里设置的变量将覆盖通过-s参数设置的变量.我必须在我的多级文件中执行以下操作:`set:p,"default"if!:p`这使参数不被删除. (3认同)
  • 这不再起作用了.根据https://groups.google.com/forum/?fromgroups=#!topic/capistrano/1nFQPWf9EIo和其他地方,`configuration`已被弃用:`<Capistrano ::'未定义的局部变量或方法'配置'::配置:0x0000010145e708>(NameError)`.现在您可以使用变量名称.几个月前这是怎么回事? (2认同)
  • 我发现用-s param传入的参数只限于任务范围,所以如果你需要全局访问一个参数(例如,对一些任务创建进行元编程)那么这不起作用...... (2认同)

小智 14

更新.关于仅将参数传递给Capistrano 3任务.

我知道这个问题已经很老了,但在搜索将参数传递给Capistrano任务时仍会首先在Google上弹出.不幸的是,Jamie Sutherland提供的梦幻般的答案已不再适用于Capistrano 3.在您浪费时间尝试之前,除了结果如下所示:

cap test:parameter -s branch=master 
Run Code Online (Sandbox Code Playgroud)

产出:

cap aborted!
OptionParser::AmbiguousOption: ambiguous option: -s
OptionParser::InvalidOption: invalid option: s
Run Code Online (Sandbox Code Playgroud)

cap test:parameter -S branch=master 
Run Code Online (Sandbox Code Playgroud)

输出:

invalid option: -S
Run Code Online (Sandbox Code Playgroud)

@senz和Brad Dwyer提供的Capistrano 3的有效答案你可以点击这个金链接找到: Capistrano 3拉命令行参数

为了完整性,请参阅下面的代码,了解您有两个选项.

第一选择:

您可以像使用常规哈希一样使用键和值迭代任务:

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
Run Code Online (Sandbox Code Playgroud)

调用cap时,确保参数之间没有空格:

cap production task_with_params[one,two]
Run Code Online (Sandbox Code Playgroud)

第二种选择:

在调用任何任务时,可以分配环境变量,然后从代码中调用它们:

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
Run Code Online (Sandbox Code Playgroud)

要分配环境变量,请调用cap,如下:

cap production task_with_env_params first_env=one second_env=two
Run Code Online (Sandbox Code Playgroud)

希望能省你一些时间.


dea*_*unk 9

我建议使用ENV变量.

像这样的事情(命令):

$ GIT_REPO="johndoe@gitsrv.domain:app" GIT_BRANCH="r2s1" cap testing
Run Code Online (Sandbox Code Playgroud)

上限配置:

#deploy.rb:
task :testing, :roles => :app do
  puts ENV['GIT_REPO']
  puts ENV['GIT_BRANCH']
end
Run Code Online (Sandbox Code Playgroud)

并查看https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension,这种方法可能对您也有用.