【问题标题】:Running Capistrano tasks only for certain roles仅为特定角色运行 Capistrano 任务
【发布时间】:2011-09-25 13:53:24
【问题描述】:

我的项目有一个多步骤管道,其中包括一些步骤,如 Crawling、NLP 等,但我将它们称为 Step1、Step2 等。此外,我希望能够部署到不同的环境(开发、产品等)。

我想我将为 Capistrano 使用多级组件,以便部署到不同的环境(例如 cap dev deploy 与 cap prod deploy)。

在每个管道步骤中使用角色似乎也很直观。但是,每个步骤都完全独立于管道的其余部分运行,因此每个步骤都可以独立于其他步骤重新启动/部署。 Capistrano 似乎并不明确支持仅为特定角色运行任务。有什么好的方法可以做到这一点?

执行此定义任务的最佳方式是专门针对每个角色吗?如果角色之间有一些共同的任务怎么办?也许帮助方法是那里的答案?

【问题讨论】:

    标签: ruby-on-rails capistrano roles task


    【解决方案1】:

    查看此讨论Creating a Capistrano task that performs different tasks based on role

    task :stop_memcached, :roles => :memcache do 
    ...
    end
    

    【讨论】:

    • 不是我想要的。例如,如果我有一个像这样的任务:` task :clear_logs do run "rm -f /tmp/blah.log" end` 作为部署的一部分,如果我部署所有机器,我希望在我的所有机器上运行它我管道中的步骤。但是如果我只是部署管道的 Step2,我只想清除所有具有 Step2 角色的机器上的日志。我遇到的角色问题是他们擅长指定在哪些机器上运行任务,但您似乎无法指定是否为特定部署实际运行它们。
    【解决方案2】:

    不确定这是否正是您要寻找的,但是当我只想为特定角色做某事时,我使用 capistrano shell。例如,假设我想部署但只部署到我的应用服务器,我可能会执行以下操作:

    cap production shell
    cap>with app
    cap>!deploy #or any other cap task you have
    

    如果需要,您也可以按机器进行范围。再次:

    cap production shell
    cap>on <machine name or ip>
    cap>!deploy #or any other cap task you have
    

    希望对你有帮助,

    斯科特

    【讨论】:

      【解决方案3】:

      不确定该功能是在哪个版本中添加的,但 cap 会查看 ROLES 环境变量以确定要运行的角色

      $ ROLES=db cap deploy
      

      【讨论】:

        【解决方案4】:

        如果您想从命令行运行 capistrano 任务,但只针对已定义角色的子集,您可以使用 ROLES 参数。

        下面的命令只为角色was执行任务category:task

        cap ROLES=was category:task
        

        ROLES 参数是多值的,所以你可以添加更多的角色,用逗号分隔:

        cap ROLES=was,db category:task
        

        更多细节可以参考invoke文档

        【讨论】:

          猜你喜欢
          • 2014-05-02
          • 2016-11-08
          • 1970-01-01
          • 2020-10-05
          • 1970-01-01
          • 2011-11-04
          • 1970-01-01
          • 1970-01-01
          • 2013-05-05
          相关资源
          最近更新 更多