将参数传递给Capistrano

时间:2012-04-18 19:46:28

标签: 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

5 个答案:

答案 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'