33

我正在研究使用 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
4

5 回答 5

48

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


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

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

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

于 2012-04-24T00:22:22.527 回答
20

更新。仅关于将参数传递给 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 pull 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 时参数之间没有空格:

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:

cap production task_with_env_params first_env=one second_env=two

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

于 2016-10-15T15:57:43.880 回答
10

我建议使用 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,这种方法可能对您也有用。

于 2012-04-24T06:03:02.043 回答
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
于 2014-05-06T10:38:26.650 回答
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"

然后每个拥有部署权限的人都可以将以下内容添加到他们的本地 ~/.caprc 文件中:

set :scm_user, 'someuser'
于 2012-04-23T23:54:19.827 回答