ACRの世代管理について検討したのでまとめます。
まずレジストリやタグ、マニフェストといった各種用語を理解しておくことが重要です。
レジストリ、リポジトリ、成果物について
タグなしマニフェストって?
-
ACRを使っていると、Azure Portalからリポジトリを見たときに、タグ数とマニフェスト数がずれていることが見られます。

-
これはACRに同じタグでpushしたときに前回のタグがnoneとなることによって発生します。
-
この例では52のマニフェストがタグなしであることが分かります。
-
このタグなしマニフェストはAzure Portalから確認することができません。以下コマンドを実行することでタグなしのマニフェストを確認することができます。
$ az acr manifest list-metadata --registry [レジストリ名] --name [リポジトリ名]
マニフェストのタグを削除する
- ACRタスクを使って定期的にコマンドを実行できるようにします。
- 今回のコマンドだと以下条件で動作します。
- 90日以上更新がないマニフェストのタグを削除します
- 90日以上更新がなくても10世代は残します
- 毎日JST20時にこの処理は動作します
$ PURGE_CMD="acr purge --ago 90d --filter '[リポジトリ名]:.*' --keep 10"
$ az acr task create --name purgeTagTask \
--cmd "$PURGE_CMD" \
--schedule "0 11 * * *" \
--registry [レジストリ名] \
--context /dev/null
- タスクが作成されたか確認します。
$ az acr task list-runs -r [レジストリ名]
タグが付いていないマニフェストを削除する
- こちらもACRタスクを使って定期実行します。
- タグが付いていないマニフェストが対象となるため、マニフェストのタグを削除した後に実行するようにしています。
- 今回のコマンドだと以下条件で動作します。
- タグが付いていないマニフェストを全て削除します。
- --ago 90dオプションは--untaggedオプションを付けているときは無効になるのがポイントです(--agoは必須オプションなので指定は必要だが無効になっている)
- 毎日JST21時にこの処理は動作します
- タグが付いていないマニフェストを全て削除します。
$ PURGE_CMD="acr purge --ago 90d --filter '[リポジトリ名]:.*' --keep 10 --untagged"
$ az acr task create --name purgeManifestTask \
--cmd "$PURGE_CMD" \
--schedule "0 12 * * *" \
--registry [レジストリ名] \
--context /dev/null
- タスクが作成されたか確認します。
$ az acr task list-runs -r [レジストリ名]
ACRタスク実行ログ確認
- ACRタスクの実行をログを確認する方法です。指定したタスクの最新の実行結果ログが確認可能です。
$ az acr task logs --registry [レジストリ名] -n [タスク名]
Azure Portalからの設定
-
ただしあくまでもタグなしマニフェストの削除にしか使えません。タグありをタグなしに変更して世代管理するには現時点ではコマンドラインで組むしかなさそうです。
-
あとPortalから設定した場合、設定したタイミング以降に作られたマニフェストのみが対象になります。設定以前に作られたマニフェストは本設定の対象とはならないため注意が必要です。
以上です。

