クリーンアップポリシー

クリーンアップ・ポリシーは、ユーザーによって設定されたいくつかのパラメータに従ってオブジェクトを自動的に削除する、繰り返し実行されるバックグラウンド・プロセスです。

コンテナレジストリ

コンテナレジストリのクリーンアップポリシーは、単一のプロジェクトでホストされているすべてのコンテナリポジトリに対して機能します。クリーンアップ・パラメーターに一致するすべてのタグが削除されます。

パラメータ

ContainerExpirationPolicyは、コンテナレジストリのクリーンアップポリシーのすべてのパラメータを保持します。

パラメータは 2 つのグループに分けられます:

  • 保持するタグを定義するパラメータ:
    • keep_n.n 最新のタグを保持します。
    • name_regex_keep.この正規表現にマッチするタグを保持します。
  • 破棄するタグを定義するパラメータです:
    • older_than.このタイムスタンプより古いタグを破棄します。
    • name_regex.この正規表現にマッチするタグを破棄します。

残りのパラメータは、ポリシーが実行されるときに影響します:

  • enabled.ポリシーが有効かどうかを定義します。
  • cadence.ポリシーの実行ケイデンスを定義します。
  • next_run_at.次の実行のタイミングを定義します。

実行

GitLab.comで処理する必要があるポリシーの数が多いため、実行はこの設計に従っています。

  • ポリシーの実行には時間制限があります。
  • ポリシーの実行は完全または部分的です。
  • バックグラウンド・ジョブは2つの優先順位に基づいて次に実行するジョブを検討します:
    • 過去にnext_run_at
    • 部分的に実行されたポリシー

コンテナ・リポジトリのクリーンアップ・ポリシーのステータスを追跡するために、ContainerRepository モデルにexpiration_policy_cleanup_status を用意しました。

この実行のためのバックグラウンドジョブが整理されています:

  • 1時間ごとに実行されるcronバックグラウンドジョブ。
  • ポリシーの実行が必要なコンテナリポジトリをループするバックグラウンドジョブのセット。

cronバックグラウンドジョブ

cronバックグラウンドジョブは非常にシンプルです。主なタスクは

  1. クリーンアップが必要なコンテナリポジトリがあるかどうかをチェックします。もしあれば、必要な数の容量制限ジョブを、上限まで待ち受けます。
  2. クリーンアップ・ポリシーのメトリクスを計算し、ログに記録します。

容量制限ジョブ

このジョブは 容量制限の懸念に基づいています。

このジョブは特定の容量まで並行して実行されます。

このジョブの主な責任は、クリーニングが必要な次のコンテナリポジトリを選択し、関連サービスを呼び出すことです。

ここで、2つの優先順位が順番に評価されます。コンテナリポジトリが見つかれば、その上でクリーンアップサービスが呼び出されます。

指定されたコンテナリポジトリに対して、常に1つのクリーニングしか実行されないようにするため、expiration_policy_cleanup_status 列とともにデータベースロックを使用します。

このジョブは、クリーンアップが必要なコンテナリポジトリがなくなるまで再キューします。

サービス

以下は、定員制のジョブから発生するサービスコールです:

flowchart TD job[Limited capacity job] --> cleanup([ContainerExpirationPolicies::CleanupService]) cleanup --> cleanup_tags([Projects::ContainerRepository::CleanupTagsService]) cleanup_tags --> delete_tags([Projects::ContainerRepository::DeleteTagsService])
  • ContainerExpirationPolicies::CleanupService.このサービスは主にコンテナリポジトリexpiration_policy_cleanup_status の更新を扱い、cleanup tags サービスを呼び出します。
  • Projects::ContainerRepository::CleanupTagsService.このサービスはポリシーパラメーターを受け取り、コンテナレジストリ上で破棄するタグのリストを作成します。
  • Projects::ContainerRepository::DeleteTagsService.このサービスはタグのリストを受け取り、そのリスト上でループします。各タグについて、サービスはコンテナレジストリ API エンドポイントを呼び出して対象のタグを破棄します。

cleanupタグサービスは、破棄するタグのリストを作成するために、非常に特殊な実行順序を使用します。

最後に、cleanup tagsサービスとdelete tagsサービスはファサードを使用して動作します。実際の実装は、接続するコンテナレジストリの種類によって異なります。GitLab コンテナレジストリが接続されている場合は、コンテナレジストリ API をよりうまく使えるようになるなど、クリーンアップポリシーの実行時にいくつかの改善が利用できます。