【问题标题】:Capistrano 3 pulling command line argumentsCapistrano 3 拉取命令行参数
【发布时间】:2014-01-28 10:20:13
【问题描述】:

我正在从 Capistrano 2 升级到 Capistrano 3。在 Cap 2 中,我使用以下命令将命令行参数作为分支名称(否则默认为 master

set :branch, fetch(:branch, "master")

如果我调用cap deploy,它将部署主分支。但它也让我做这样的事情:

cap deploy -S branch=foo

这将部署foo 分支。

现在,在 Capistrano 3 中,如果我尝试运行上述内容,则会收到错误消息:invalid option: -S

现在通过命令行传递参数的正确方法是什么?

【问题讨论】:

标签: ruby-on-rails git rake capistrano


【解决方案1】:

我最终做的是设置一个ENV 变量。

所以现在我可以打电话了

cap production deploy branch=mybranch

它将部署mybranch。如果我运行一个简单的cap production deploy,它将部署默认分支(master,如果你没有设置一个,但我已经将我的下面更改为default 以进行演示)

这是我在deploy.rb 文件中输入的代码:

set :branch, "default"
if ENV['branch']
        set :branch, ENV['branch']
end

【讨论】:

  • 为了让它干燥,set :branch, ENV['branch'] || 'default'
  • 环境变量用于全局设置(如登录,或更改一些默认值)。你不应该将它用于任务参数
  • 您仍然可以使用fetch 来获取以这种方式设置的环境变量。
  • UPD:​​> 不,fetch(:branch) 有问题,因为它默认返回master。更好地使用branch=asdENV["asd"]
【解决方案2】:

Rake 任务(cap 正在使用)是支持论点。

namespace :test do
  desc "Test task"
  task :test, :arg1 do |t, args|
    arg1 = args[:arg1]
    puts arg1
  end
end

cap -T 输出:

cap yiic:test[arg1] # 测试任务

调用示例:

上限生产 yiic:test[test1]

另外,这里有一个有用的post

P.S.:您应该使用 env vars 进行“全局”设置。就像多个任务的通用值一样。

【讨论】:

    【解决方案3】:

    为 Capistrano 3 提供更新且有效的解决方案(因为我花了一段时间才找到并且进行了太多测试以使其正常工作)。

    我的文件是这样的:

    config/
        deploy/
            staging.rb
            production.rb
        deploy.rb
    ...
    Capfile
    

    staging.rb 我有:

    server 'staging', roles: %w(db)
    
    set :branch,    ENV.fetch('REVISION', 'master')
    set :use_sudo,  false
    set :user,      'toto'
    set :deploy_to, '/var/www'
    

    (在server 'staging'中,staging是一个SSH连接,在我的.ssh/config中定义)

    然后,要部署特定的修订,我只需要调用:

    cap staging deploy REVISION=3b2d9ab
    

    3b2d9ab 是 Git 提交哈希(短版或长版)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 2016-05-20
      • 1970-01-01
      • 2011-07-06
      • 2014-01-03
      • 2018-06-14
      相关资源
      最近更新 更多