4

我们每天使用 capistrano(实际上是webistrano)进行 20 多次部署,但我们遇到了一个问题,即我们服务器上的磁盘空间充满了旧的部署文件夹。

我不时地运行deploy:cleanup任务以清除所有部署(它保留最后一个:keep_releases,当前设置为 30)。我想自动化清理。

一种解决方案是将以下内容添加到配方中,以便在每次部署后自动运行清理:

after "deploy", "deploy:cleanup"

但是,我不想在每次部署后都这样做,我想将其限制为仅当先前部署的数量达到阈值时,例如 70。有谁知道我该怎么做?


想法:

  • Capistrano 是否提供了一个变量来保存先前部署的数量?
    • 如果没有,有没有人知道计算它的方法。IEset :num_releases, <what-can-I-put-here-to-count-previous-deployments>
  • 有没有办法拉皮条deploy:cleanup,所以它使用最小阈值,即如果< :max_releases以前的部署(:max_releases与 不同:keep_releases)则退出。
  • 可以使用except关键字吗?即类似的东西:except => { :num_releases < 70}
4

2 回答 2

4

Capistrano 是否提供了一个变量来保存先前部署的数量?

是的,releases.length

有没有办法 pimp deploy:cleanup 所以它使用最小阈值?

是的,这是一个私有命名空间的任务,只有在建立了一定数量的发布文件夹时才会触发正常的清理任务:

namespace :mystuff do
  task :mycleanup, :except => { :no_release => true } do
    thresh = fetch(:cleanup_threshold, 70).to_i
    if releases.length > thresh
      logger.info "Threshold of #{thresh} releases reached, runing deploy:cleanup."
      deploy.cleanup
    end
  end
end

要在部署后自动运行,请将其放在配方的顶部:

after "deploy", "mystuff:mycleanup"

这样做的好处是,设置beforeafter指令deploy:cleanup正常执行。例如,我们需要以下内容:

before 'deploy:cleanup', 'mystuff:prepare_cleanup_permissions'
after 'deploy:cleanup', 'mystuff:restore_cleanup_permissions'
于 2011-08-11T06:26:37.567 回答
0

使用当前 capistrano 代码的快速而肮脏的方法:

将https://github.com/capistrano/capistrano/blob/master/lib/capistrano/recipes/deploy.rb#L405中的清理任务更改为:

  task :cleanup, :except => { :no_release => true } do
    thresh = fetch(:cleanup_threshold, 70).to_i
    count = fetch(:keep_releases, 5).to_i
    if thresh >= releases.length
      logger.important "no old releases to clean up"
    else
      logger.info "threshold of #{thresh} releases reached, keeping #{count} of #{releases.length} deployed releases"

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

      try_sudo "rm -rf #{directories}"
    end
  end

然后你就可以添加

set :cleanup_threshold, 70

到您的部署配方。

于 2011-08-10T09:53:31.010 回答