Capistrano 3角色特定任务

时间:2016-07-06 18:45:28

标签: ruby deployment roles capistrano3

我最近从Capistrano 2换成了Capistrano 3,很多都发生了变化,我在努力让新的Capistrano适应我正在进行的项目中使用Capistrano 2所做的事情时遇到了一些麻烦

我目前面临的最大问题是按角色过滤。我知道你可以这样做:

ROLES=web,worker cap production deploy

但是如果你有一台具有所有角色的服务器,那似乎什么也没做。

使用Capistrano 2我可以跑:

cap worker deploy

将应用所有工作人员任务。 Capistrano 2具有在任务上指定的角色,如果未请求角色,则跳过任务(在大多数情况下)。但是对于Capistrano 3来说似乎并非如此,在多服务器环境中,过滤器非常棒,您可以为每个角色配备特定的服务器。但是如果服务器共享一个角色或者只有一个角色,它就会有点奇怪。在新的Capistrano中,任务似乎检查是否存在具有给定角色的主机,而不是根据角色检查任务是否应该运行。在我看来,ROLES旨在限制服务器而不是任务。

所以我想知道在Capistrano 3中是否可行。另一种观察方式是将名字下的任务分组。我想选择正在执行哪一组任务。

我可以通过一些修补来实现这一点,我可以检查ROLES是否存在并基于它跳过任务,我可以根据角色选择要加载的配方,我可以根据ROLES var动态附加任务,或者可以将角色命名文件中的任务分组,并根据ROLES等进行动态加载,但也许有些东西我不知道。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

  

在我看来,ROLES旨在限制服务器而不是任务。

是的,这是完全正确的。在Capistrano 3中,任务与角色无关。在任务中,可以在与特定角色匹配的服务器上执行命令。使用ROLES进行过滤时,可以限制运行命令的服务器,但不限制任务本身。

限制任务的一种方法是定义自己的高级任务,调用所需的任务。

例如:

# In deploy.rb
task "worker" do
  invoke "task1"
  invoke "task2"
  # etc.
end

这定义了一个worker任务,该任务又执行特定的任务列表,这些任务可以是您想要的任何内容。然后你可以运行:

cap production worker

将在您的生产服务器上运行所有这些与工作人员相关的任务。