4

capistrano(実際にはwebistrano)を使用して1日に20を超えるデプロイメントを実行しますが、サーバーのディスク領域が古いデプロイメントフォルダーでいっぱいになるという問題があります。

時々、deploy:cleanupタスクを実行してすべてのデプロイメントをクリーンアップします(最後のデプロイメントを保持し:keep_releases、現在は30に設定されています)。クリーンアップを自動化したいのですが。

1つの解決策は、レシピに次を追加して、展開のたびにクリーンアップを自動的に実行することです。

after "deploy", "deploy:cleanup"

ただし、すべての展開後にこれを実行するのではなく、以前の展開の数がしきい値(70など)に達したときにのみ制限したいと思います。これを実行する方法を知っている人はいますか?


考え:

  • Capistranoは、以前の展開の数を保持する変数を提供しますか?
    • そうでない場合、誰かがそれを計算する方法を知っていますか?すなわちset :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

最小しきい値を使用するように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"

これの良いところは、にbefore設定afterされたディレクティブ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 に答える