capistrano读取releases目录的错误

新年刚开始工作就遇到capistrano读取releases目录的错误,deploy之后总是把最新的release目录删除,看来是判断哪个release目录是最新的时候出错了。

看了下2.5.11源代码,capistrano是这样定义releases目录的

_cset(:releases)          { capture("ls -x #{releases_path}").split.reverse }

其中ls -x的结果是

20091224074632  20091228080936  20091228082551  20100104023017  20100104025008

也就是说releases的结果就是

['20100104025008', '20100104023017', '20091228082551', '20091228080936', '20091224074632']

再看看删除release部分的代码

directories = (releases - releases.last(count)).map { |release|
  File.join(releases_path, release) }.join(" ")

try_sudo "rm -rf #{directories}"

从这段代码的逻辑可以判断,capistrano会把最新的20100104025008目录删除,显然这不是我们希望看到的结果。

看了2.5.9的源代码和github上最新的代码,releases却是这样定义的

_cset(:releases)          { capture("ls -x #{releases_path}").split.reverse }

而ls -xt的执行结果是

20100104025008  20100104023017  20091228082551  20091228080936  20091224074632

和2.0.11正好相反,看来这就是问题的症结。查了一下lighthouse,https://capistrano.lighthouseapp.com/projects/8716/tickets/88-getting-the-newest-directory#ticket-88-19,原来是因为file cache store才把-t参数去掉了,但是却导致了新的问题,根据上面的解决方案,在config/deploy.rb文件中增加

set(:releases) { capture("ls -x #{releases_path}").split }

即可

Posted in  ruby capistrano


blog comments powered by Disqus
Fork me on GitHub