2012-04-18 150 views
30

我正在研究使用Capistrano作为通用部署解决方案的可能性。通过“通用”,我的意思是不轨。我对我发现的文档的质量并不满意,但是,我没有看到那些假设你正在部署rails的文档。所以我会试着根据几个例子来破解一些东西,但是我从一开始就面临着一些问题。将参数传递给Capistrano

我的问题是,cap deploy没有足够的信息来做任何事情。重要的是,它缺少我想要部署的版本的标记,并且此要在命令行上传递。

另一个问题是我如何指定我的git存储库。我们的git服务器是通过SSH在用户帐户上访问的,但我不知道如何更改deploy.rb以将该用户的ID用作scm URL的一部分。

那么,我该如何完成这些事情呢?

我要部署的第二释放的第一冲刺的结果。这在git存储库中被标记为r2s1。另外,假设用户“johndoe”获得部署系统的任务。要访问存储库,他必须使用URL [email protected]:app。因此,存储库的远程URL取决于用户标识。

的命令行来获得所需的文件将这些:

git clone [email protected]:app 
cd app 
git checkout r2s1 
+0

嘿,我希望你不会忽视我们的答案。请至少评论他们。 :) – deadrunk 2012-04-27 09:55:08

回答

46

拥有jarrad说,Capistrano的-ash是部署其他项目类型的一个很好的基本辅助模块集合,尽管在一天结束时它不是必需的。这只是一种脚本语言,大部分任务都是通过系统命令完成的,并最终变成几乎像shell脚本一样。

要传递参数,您可以在运行cap时为-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 

UPDATE:编辑与Capistrano的最新版本。配置数组不再可用。

全局参数:请参阅注释使用set:branch,fetch(:branch,'a-default-value')来全局使用参数。 (并用-S代替。)

+0

尽管如此,但是如何告诉Capistrano它应该检查哪些标签? – 2012-04-27 12:53:17

+1

使用-s参数。所以我有一个像这样的命令来部署特定的标签。 帽生产部署-s标签= 2.1.3 如果你正在利用capistano灰的,你只需要做 集:分支,#{配置[:标签]} 这应该检出标签在命令行中设置 – 2012-04-27 13:14:09

+2

这不起作用了。根据https://groups.google.com/forum/?fromgroups=#!topic/capistrano/1nFQPWf9EIo和其他地方,“配置”已被弃用:#(NameError)'。现在你可以使用变量名称。这只是几个月前的工作? – jordanpg 2012-10-16 17:33:54

0

为图书馆,与非轨道部署有助于退房capistrano-ash。我用它来部署一个PyroCMS应用程序,它效果很好。

这里是我的Capfile片段为该项目:

# deploy from git repo 
set :repository, "[email protected]:mygitrepo.git" 
# tells cap to use git 
set :scm, :git 

我不知道我理解的问题的最后两个部分。提供更多的细节,我很乐意提供帮助。例如后

编辑给出:

set :repository, "#{scm_user}@gitsrv.domain:app" 

然后每个人与部署priveledges可以添加以下到其本地〜/ .caprc文件:

set :scm_user, 'someuser' 
+0

好吧,给出的例子。请注意,我无法将存储库设置为固定值,就像您在代码段中执行的操作一样。 – 2012-04-24 00:47:19

+0

主页的'.caprc'很好,但不能强制。我想在命令行上传递参数。 – 2012-04-27 12:51:48

9

我建议使用ENV变量。

出头喜欢这个(命令):

$ GIT_REPO="[email protected]: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,可能这种方法会为你有用。

+1

我注意到使用环境变量与Ruby的东西“在”,但我认为他们非常不方便。例如,我需要在Windows上使用三个单独的命令,并提供您提供的建议,每个命令都受到小的拼写错误的影响,并且如果发生拼写错误,则会出现糟糕的反馈。 – 2012-04-27 12:48:03

+0

我同意最后一条评论,我更喜欢一个带-s或-S var =值的命令行,然后像 'if variables.include?(:var) ... else ... end' – Federico 2012-06-20 15:32:11

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 

您可以通过运行该任务(使用默认值productionfile

$ cap logs:tail 

或(使用值cronfile

$ cap logs:tail -s file=cron 
6

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

我知道这个问题是相当古老的,但当搜索传递参数给Capistrano任务时,仍然会首先在Google上弹出。

cap test:parameter -s branch=master 

输出:

cap aborted! 
OptionParser::AmbiguousOption: ambiguous option: -s 
OptionParser::InvalidOption: invalid option: s 

和遗憾的是,在你浪费你的时间尝试它只是结果要像下面由杰米·萨瑟兰提供的梦幻般的答案是不再与Capistrano的3有效

cap test:parameter -S branch=master 

输出:

invalid option: -S 

对Capistrano的3有效答案由@senz和布拉德·德怀尔提供您可以通过点击此链接金发现: 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 

要分配环境变量,调用帽状波纹管:

cap production task_with_env_params first_env=one second_env=two 

希望,将节省你有一段时间。