Рецепт Capistrano для автоматического запуска развертывания: очистка только при необходимости - PullRequest
4 голосов
/ 10 августа 2011

Мы выполняем более 20 развертываний в день с использованием capistrano (на самом деле webistrano ), и у нас возникает проблема, когда дисковое пространство на наших серверах заполняется старыми папками развертывания.

Каждый сейчас иснова я запускаю задачу deploy:cleanup, чтобы очистить все развертывания (она сохраняет последний :keep_releases, в настоящее время установлен на 30).Я хотел бы автоматизировать очистку.

Одним из решений было бы добавить следующее к рецепту для автоматического запуска очистки после каждого развертывания:

after "deploy", "deploy:cleanup"

Но , я не хочу делатьэто после каждого развертывания, я хотел бы ограничить его только тогда, когда количество предыдущих развертываний достигнет предела, например 70. Кто-нибудь знает, как я могу это сделать?


Мысли:

  • Предоставляет ли Capistrano переменную, которая содержит количество предыдущих развертываний?
    • Если нет, кто-нибудь знает способ его расчета.то есть set :num_releases, <what-can-I-put-here-to-count-previous-deployments>
  • Есть ли способ pimp deploy:cleanup, поэтому он использует минимальное пороговое значение, то есть выход, если < :max_releases предыдущих развертываний (где :max_releases отличается от :keep_releases).
  • Можно ли использовать ключевое слово except?то есть что-то вроде :except => { :num_releases < 70}.

Ответы [ 2 ]

4 голосов
/ 11 августа 2011

Предоставляет ли Capistrano переменную, которая содержит число предыдущих развертываний?

Да, releases.length

Есть ли способ развернуть pimp: очистить, чтобы он использовал минимальное пороговое значение?

Да, это частная задача с пространством имен, которая будет запускать обычную задачу очистки ТОЛЬКО, если определенное числоВ папках релиза есть:

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"

Хорошая вещь в этом заключается в том, чтоДирективы before и after, установленные на deploy:cleanup, выполняются как обычно.Например, нам требуется следующее:

before 'deploy:cleanup', 'mystuff:prepare_cleanup_permissions'
after 'deploy:cleanup', 'mystuff:restore_cleanup_permissions'
0 голосов
/ 10 августа 2011

Быстрый и грязный подход с использованием текущего кода 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

к вашему рецепту развертывания.

...