Deployment 将参数传递给Capistrano

Deployment 将参数传递给Capistrano,deployment,capistrano,Deployment,Capistrano,我正在研究使用Capistrano作为通用部署解决方案的可能性。我所说的“通用”不是指rails。我对我发现的文档的质量不满意,不过,我并不是在看那些假定您正在部署rails的文档。因此,我将尝试根据几个例子来整理一些东西,但从一开始我就面临着几个问题 我的问题是capdeploy没有足够的信息来执行任何操作。重要的是,它缺少我想要部署的版本的标记,这必须通过命令行传递 另一个问题是如何指定git存储库。我们的git服务器是通过用户帐户上的SSH访问的,但我不知道如何更改deploy.rb以使用

我正在研究使用Capistrano作为通用部署解决方案的可能性。我所说的“通用”不是指rails。我对我发现的文档的质量不满意,不过,我并不是在看那些假定您正在部署rails的文档。因此,我将尝试根据几个例子来整理一些东西,但从一开始我就面临着几个问题

我的问题是
capdeploy
没有足够的信息来执行任何操作。重要的是,它缺少我想要部署的版本的标记,这必须通过命令行传递

另一个问题是如何指定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
查看有助于非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"
然后,具有部署权限的每个人都可以将以下内容添加到其本地~/.caprc文件中:

set :scm_user, 'someuser'

更新:有关Capistrano 3,请参阅


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

要传入参数,可以在运行cap时设置-s标志,以提供键值对。首先创建一个这样的任务

desc "Parameter Testing"
task :parameter do
  puts "Parameter test #{branch} #{tag}"
end
desc "Parameter Testing"
task :parameter do
  system("whoami", user)
  puts "Parameter test #{user} #{branch} #{tag}"
end
然后像这样开始你的任务

cap test:parameter -s branch=master -s tag=1.0.0
最后一部分。我建议使用ssh密钥设置对服务器的无密码访问。但是如果您想从当前登录的用户获取它。你可以这样做

desc "Parameter Testing"
task :parameter do
  puts "Parameter test #{branch} #{tag}"
end
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来传递它们。)

我建议使用ENV变量

类似这样的东西(命令):

Cap配置:

#deploy.rb:
task :testing, :roles => :app do
  puts ENV['GIT_REPO']
  puts ENV['GIT_BRANCH']
end

看看,这种方法可能对您也有用。

正如Jamie已经展示的,您可以使用
-s
标志将参数传递给任务。我想向您展示如何使用默认值

如果要使用默认值,必须使用
fetch
,而不是
|124;=
或检查
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
您可以通过运行此任务(使用
文件
的默认值
生产

或(使用
cron
值表示
文件

$ cap logs:tail
$ cap logs:tail -s file=cron

更新。仅关于向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

产出:

invalid option: -S
@senz和Brad Dwyer提供的Capistrano 3的有效答案,您可以通过单击此黄金链接找到:

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

第一选项:

set :repository, "#{scm_user}@gitsrv.domain:app"
您可以像使用常规哈希一样使用键和值迭代任务:

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时,请确保参数之间没有空格:

cap production task_with_params[one,two]
第二选项:

set :repository, "#{scm_user}@gitsrv.domain:app"
调用任何任务时,可以分配环境变量,然后从代码中调用它们:

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
要分配环境变量,请调用cap(如以下所示):

cap production task_with_env_params first_env=one second_env=two

希望这能为您节省一些时间。

好的,举个例子。请注意,我不能像您在代码片段中那样将存储库设置为固定值。Home的
。caprc
很好,但不是强制性的。我想在命令行上传递参数。嘿,我希望您不要忽略我们的答案。请至少对它们进行注释。:)我注意到使用环境变量与Ruby的东西是“合二为一”的,但我认为它们非常不方便。例如,我需要在Windows上使用三个单独的命令,每个命令都会出现小的打字错误,如果您确实输入了错误,则会得到糟糕的反馈。我同意上一条评论,我更喜欢使用-s或-s var=value的命令行,然后使用类似于
if variables.include?(:var)…的命令行。。。其他的使用-s参数结束
。所以我有一个这样的命令行来部署一个特定的标记。cap production deploy-s tag=2.1.3如果您使用的是capistano ash,您只需执行set:branch、#{configuration[:tag]}即可在命令行签出标记集。这不再有效。根据和其他地方,
配置
已被弃用:
未定义的局部变量或#(NameError)
的方法“配置”。现在您可以只使用变量名。就在几个月前,它是如何工作的?如果您正在使用Capistrano的多级扩展,那么stage.rb文件似乎是在