diff --git a/roles/build-container-image/common.rst b/roles/build-container-image/common.rst
index 737887001..4ae76cd3e 100644
--- a/roles/build-container-image/common.rst
+++ b/roles/build-container-image/common.rst
@@ -100,7 +100,10 @@ Once this role completes, the temporary upload tags are no longer
required. The role removes the change-id tags from the repository in
the registry, and removes any similar change-ids tags. This keeps the
repository tidy in the case that gated changes fail to merge after
-uploading their staged images.
+uploading their staged images. Remvoing these tags is a registry
+specific operation. You should double check the ``api_token``
+requirements for your registry described below. For more details see
+:zuul:role:`remove-registry-tag`.
In ``intermediate-registry`` mode, this role queries Zuul to find the
build performed by the build role in the ``gate``. It then copies
@@ -179,6 +182,22 @@ using the roles described here.
repository: "^myorgname/{{ zuul.project.short_name }}.*"
+ .. zuul:rolevar:: api_token
+
+ Optional; When using the promote roles, the registry API is
+ used to remove temporary tags. if your registry requires a
+ token to talk to the registry API, add it here. This is
+ registry dependent; some allow API access via the
+ username/password, but others require issuing a separate
+ token. For more details see
+ :zuul:role:`remove-registry-tag`. Some examples:
+
+ * **docker** : API is access via username/password, does not
+ require token.
+ * **quay.io** : A token must be generated from an
+ "application" that a user has allowed to operate on its
+ behalf. See ``__.
+
.. zuul:rolevar:: container_images
:type: list
diff --git a/roles/promote-container-image/tasks/promote-from-tag.yaml b/roles/promote-container-image/tasks/promote-from-tag.yaml
index 2a14f2e15..fb4a96d6c 100644
--- a/roles/promote-container-image/tasks/promote-from-tag.yaml
+++ b/roles/promote-container-image/tasks/promote-from-tag.yaml
@@ -23,10 +23,3 @@
loop_control:
loop_var: zj_image
include_tasks: promote-retag.yaml
-
-# The docker roles prune obsolete tags here, but that relies on a
-# timestamp to make sure we're not deleting in-progress tags (that the
-# gate pipeline may be uploading at the same time we're promoting).
-# That timestamp is not available with skopeo list-tags, so some other
-# mechanism will need to be devised to clean them up. In the
-# meantime, we hope that the cleanup in promote-retag succeeds.
diff --git a/roles/promote-container-image/tasks/promote-retag-inner.yaml b/roles/promote-container-image/tasks/promote-retag-inner.yaml
index 96b5f9b19..5a4dfee8c 100644
--- a/roles/promote-container-image/tasks/promote-retag-inner.yaml
+++ b/roles/promote-container-image/tasks/promote-retag-inner.yaml
@@ -10,29 +10,10 @@
retries: 3
delay: 30
-# NOTE(ianw) 2023-03-27 : It is actually quite difficult to delete a
-# tag in a generic way...
-#
-# The OCI distribution spec does has specified for a while that you
-# should be able to delete a tag with the registry API using DELETE
-# /v2//manifests/tag [1] but this is basically not implemented
-# on any registry. So that's out.
-#
-# "skopeo delete" dereferences the tag to a digest and deletes that.
-# This is not what we want, as it deletes *all* tags pointing to it.
-# This is probably not what people want (see many github issues!) but
-# now it's like that, it's difficult to change. The man page now
-# gives all sorts of caveats [2].
-#
-# So that leaves deleting tags via individual API's specified by each
-# provider. This is what promote-docker-image currently does (via the
-# hub API at hub.docker.com). quay.io also allows this via API, but
-# implements getting an API token differently to hub.docker.com.
-# artifactory also allows it via it's API.
-#
-# [1] https://github.com/opencontainers/distribution-spec/blob/v1.0/spec.md#deleting-tags
-# [2] https://github.com/containers/skopeo/blob/main/docs/skopeo-delete.1.md
-
-- name: Delete the current change tag
- debug:
- msg: 'We currently do not delete old tags'
+- name: Delete the temporary change tag we just renamed
+ include_role:
+ name: remove-registry-tag
+ vars:
+ remove_registry_tag_repository: '{{ zj_image.repository }}'
+ remove_registry_tag_tag: '{{ promote_tag_prefix }}_{{ zj_image_tag }}'
+ no_log: true
diff --git a/roles/promote-container-image/tasks/promote-retag.yaml b/roles/promote-container-image/tasks/promote-retag.yaml
index 270a71658..dbe453872 100644
--- a/roles/promote-container-image/tasks/promote-retag.yaml
+++ b/roles/promote-container-image/tasks/promote-retag.yaml
@@ -17,3 +17,12 @@
always:
- name: Log out of registry
command: "skopeo logout {{ zj_image.registry }}"
+
+# If a gate job failed, we might have uploaded and leaked tags. This
+# cleans up anything around for more than 24 hours
+- name: Cleanup leaked images
+ include_role:
+ name: remove-registry-tag
+ vars:
+ remove_registry_tag_repository: '{{ zj_image.repository }}'
+ no_log: true