我最近从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等进行动态加载,但也许有些东西我不知道。
有什么想法吗?
答案 0 :(得分:1)
在我看来,ROLES旨在限制服务器而不是任务。
是的,这是完全正确的。在Capistrano 3中,任务与角色无关。在任务中,可以在与特定角色匹配的服务器上执行命令。使用ROLES进行过滤时,可以限制运行命令的服务器,但不限制任务本身。
限制任务的一种方法是定义自己的高级任务,调用所需的任务。
例如:
# In deploy.rb
task "worker" do
invoke "task1"
invoke "task2"
# etc.
end
这定义了一个worker
任务,该任务又执行特定的任务列表,这些任务可以是您想要的任何内容。然后你可以运行:
cap production worker
将在您的生产服务器上运行所有这些与工作人员相关的任务。