[stable/zed] Refactor image tags to be dynamic (#1122)

In order to simplify backporting and branching of new releases,
this patch relies on the Zuul branch when building images so
that we can easily branch out a new release and it will
automatically pick up the images.
Closes: #1121
diff --git a/Dockerfile b/Dockerfile
index 4b74bee..278b418 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,6 +12,8 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+ARG RELEASE
+
 FROM golang:1.21 AS go-builder
 COPY go.mod go.sum /src/
 WORKDIR /src
@@ -22,6 +24,6 @@
 COPY internal/ /src/internal/
 RUN go build -o main ./cmd/libvirt-tls-sidecar/main.go
 
-FROM registry.atmosphere.dev/library/ubuntu:zed AS libvirt-tls-sidecar
+FROM registry.atmosphere.dev/library/ubuntu:${RELEASE} AS libvirt-tls-sidecar
 COPY --from=libvirt-tls-sidecar-builder /src/main /usr/bin/libvirt-tls-sidecar
 ENTRYPOINT ["/usr/bin/libvirt-tls-sidecar"]
diff --git a/build/pin-images.py b/build/pin-images.py
index d35ca65..8818f2c 100755
--- a/build/pin-images.py
+++ b/build/pin-images.py
@@ -129,12 +129,6 @@
     parser.add_argument(
         "dst", help="Path for output file", type=argparse.FileType("r+")
     )
-    parser.add_argument(
-        "-r",
-        "--registry",
-        default="ghcr.io/vexxhost/atmosphere",
-        help="Registry containing Atmosphere images",
-    )
 
     args = parser.parse_args()
 
@@ -145,15 +139,8 @@
         if image in SKIP_IMAGE_LIST:
             continue
 
-        # NOTE(mnaser): If we're in CI, only pin the Atmosphere images
-        if (
-            "registry.atmosphere.dev" in args.registry
-            and "ghcr.io/vexxhost/atmosphere" not in data["_atmosphere_images"][image]
-        ):
-            continue
-
         image_src = data["_atmosphere_images"][image].replace(
-            "ghcr.io/vexxhost/atmosphere", args.registry
+            "{{ atmosphere_release }}", data["atmosphere_release"]
         )
         pinned_image = get_pinned_image(image_src)
 
diff --git a/images/barbican/Dockerfile b/images/barbican/Dockerfile
index e121478..743ec32 100644
--- a/images/barbican/Dockerfile
+++ b/images/barbican/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG BARBICAN_GIT_REF=7d6749fcb1ad16a3350de82cd8e523d5b55306f8
 ADD --keep-git-dir=true https://opendev.org/openstack/barbican.git#${BARBICAN_GIT_REF} /src/barbican
 RUN git -C /src/barbican fetch --unshallow
@@ -23,5 +25,5 @@
         pykmip
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 COPY --from=build --link /var/lib/openstack /var/lib/openstack
diff --git a/images/cinder/Dockerfile b/images/cinder/Dockerfile
index 4c8f153..f954b3a 100644
--- a/images/cinder/Dockerfile
+++ b/images/cinder/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG CINDER_GIT_REF=f74e2729554bee01b0a3e631a8001bb39e540433
 ADD --keep-git-dir=true https://opendev.org/openstack/cinder.git#${CINDER_GIT_REF} /src/cinder
 RUN git -C /src/cinder fetch --unshallow
@@ -23,7 +25,7 @@
         purestorage
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/designate/Dockerfile b/images/designate/Dockerfile
index e1610c8..6bcdda7 100644
--- a/images/designate/Dockerfile
+++ b/images/designate/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG DESIGNATE_GIT_REF=d247267823034c5e656f74e91b50475aa54d3fa6
 ADD --keep-git-dir=true https://opendev.org/openstack/designate.git#${DESIGNATE_GIT_REF} /src/designate
 RUN git -C /src/designate fetch --unshallow
@@ -22,7 +24,7 @@
         /src/designate
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/glance/Dockerfile b/images/glance/Dockerfile
index 2965d44..dae55ee 100644
--- a/images/glance/Dockerfile
+++ b/images/glance/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG GLANCE_GIT_REF=06a18202ab52c64803f044b8f848ed1c160905d2
 ADD --keep-git-dir=true https://opendev.org/openstack/glance.git#${GLANCE_GIT_REF} /src/glance
 RUN git -C /src/glance fetch --unshallow
@@ -27,7 +29,7 @@
         /src/glance_store[cinder]
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/heat/Dockerfile b/images/heat/Dockerfile
index 1162298..ee6afed 100644
--- a/images/heat/Dockerfile
+++ b/images/heat/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG HEAT_GIT_REF=d3948706a3ff28d0160157f76f1e18244a8dad5c
 ADD --keep-git-dir=true https://opendev.org/openstack/heat.git#${HEAT_GIT_REF} /src/heat
 RUN git -C /src/heat fetch --unshallow
@@ -22,7 +24,7 @@
         /src/heat
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/horizon/Dockerfile b/images/horizon/Dockerfile
index 58e8a65..c119e11 100644
--- a/images/horizon/Dockerfile
+++ b/images/horizon/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG HORIZON_GIT_REF=5de40f9b222608d35c5a0919117259e966217a86
 ADD --keep-git-dir=true https://opendev.org/openstack/horizon.git#${HORIZON_GIT_REF} /src/horizon
 RUN git -C /src/horizon fetch --unshallow
@@ -50,7 +52,7 @@
         /src/senlin-dashboard
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/ironic/Dockerfile b/images/ironic/Dockerfile
index 614985a..aeb0ac4 100644
--- a/images/ironic/Dockerfile
+++ b/images/ironic/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG IRONIC_GIT_REF=995fa6c048297211deceddb05b00bbd34ef27eb6
 ADD --keep-git-dir=true https://opendev.org/openstack/ironic.git#${IRONIC_GIT_REF} /src/ironic
 RUN git -C /src/ironic fetch --unshallow
@@ -24,7 +26,7 @@
         sushy
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/keepalived/Dockerfile b/images/keepalived/Dockerfile
index e4bfc08..55cb73a 100644
--- a/images/keepalived/Dockerfile
+++ b/images/keepalived/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/ubuntu:zed
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/ubuntu:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/keystone/Dockerfile b/images/keystone/Dockerfile
index cf9daaf..12833a6 100644
--- a/images/keystone/Dockerfile
+++ b/images/keystone/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG KEYSTONE_GIT_REF=f63062d47712406a807ce07b4ff3ec6213b0e824
 ADD --keep-git-dir=true https://opendev.org/openstack/keystone.git#${KEYSTONE_GIT_REF} /src/keystone
 RUN git -C /src/keystone fetch --unshallow
@@ -25,7 +27,7 @@
         keystone-keycloak-backend==0.1.8
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/libvirtd/Dockerfile b/images/libvirtd/Dockerfile
index 51cad16..65ae2d2 100644
--- a/images/libvirtd/Dockerfile
+++ b/images/libvirtd/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-runtime:zed
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-runtime:${RELEASE}
 ADD --chmod=644 https://download.ceph.com/keys/release.gpg /etc/apt/trusted.gpg.d/ceph.gpg
 COPY <<EOF /etc/apt/sources.list.d/ceph.list
 deb http://download.ceph.com/debian-reef/ jammy main
diff --git a/images/magnum/Dockerfile b/images/magnum/Dockerfile
index f945cf1..103adfe 100644
--- a/images/magnum/Dockerfile
+++ b/images/magnum/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/ubuntu:zed AS helm
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/ubuntu:${RELEASE} AS helm
 ARG TARGETOS
 ARG TARGETARCH
 ARG HELM_VERSION=3.14.0
@@ -20,7 +22,7 @@
 RUN tar -xzf /helm.tar.gz
 RUN mv /${TARGETOS}-${TARGETARCH}/helm /usr/bin/helm
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG MAGNUM_GIT_REF=0ee979099a01ae2c8b1b5d6757897a8993e4e34c
 ADD --keep-git-dir=true https://opendev.org/openstack/magnum.git#${MAGNUM_GIT_REF} /src/magnum
 RUN git -C /src/magnum fetch --unshallow
@@ -33,7 +35,7 @@
         magnum-cluster-api==0.16.0
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/manila/Dockerfile b/images/manila/Dockerfile
index 4a222e0..fd7f65e 100644
--- a/images/manila/Dockerfile
+++ b/images/manila/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG MANILA_GIT_REF=c0fc23a39f87629b59fae7bbf46f70e3e1b459cd
 ADD --keep-git-dir=true https://opendev.org/openstack/manila.git#${MANILA_GIT_REF} /src/manila
 RUN git -C /src/manila fetch --unshallow
@@ -24,7 +26,7 @@
         /src/manila
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/netoffload/Dockerfile b/images/netoffload/Dockerfile
index 9ffd6a3..a1a0ec2 100644
--- a/images/netoffload/Dockerfile
+++ b/images/netoffload/Dockerfile
@@ -12,13 +12,15 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+ARG RELEASE
+
 FROM golang:1.20 AS build
 ARG NETOFFLOAD_GIT_REF=94b8c0fdb0b83bd1b7e14b9a58077a047c78a800
 ADD https://github.com/vexxhost/netoffload.git#${NETOFFLOAD_GIT_REF} /src
 WORKDIR /src
 RUN go build -v -o offloadctl ./cmd/offloadctl/main.go
 
-FROM registry.atmosphere.dev/library/ubuntu:zed
+FROM registry.atmosphere.dev/library/ubuntu:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/neutron/Dockerfile b/images/neutron/Dockerfile
index 5d0fa5c..38b3d72 100644
--- a/images/neutron/Dockerfile
+++ b/images/neutron/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG NEUTRON_GIT_REF=ca25eb96f16dbe5ff1ca4446534f9a1d12fa7035
 ADD --keep-git-dir=true https://opendev.org/openstack/neutron.git#${NEUTRON_GIT_REF} /src/neutron
 RUN git -C /src/neutron fetch --unshallow
@@ -27,7 +29,7 @@
         /src/neutron-vpnaas
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/nova-ssh/Dockerfile b/images/nova-ssh/Dockerfile
index 84f6889..37fc531 100644
--- a/images/nova-ssh/Dockerfile
+++ b/images/nova-ssh/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-runtime:zed
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-runtime:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/nova/Dockerfile b/images/nova/Dockerfile
index 7f4a9dd..415034c 100644
--- a/images/nova/Dockerfile
+++ b/images/nova/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG NOVA_GIT_REF=b4a69447e2a176fd3821abc427019339ec700f0c
 ADD --keep-git-dir=true https://opendev.org/openstack/nova.git#${NOVA_GIT_REF} /src/nova
 RUN git -C /src/nova fetch --unshallow
@@ -22,7 +24,7 @@
         /src/nova
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 ADD https://github.com/novnc/noVNC.git#v1.4.0 /usr/share/novnc
 RUN <<EOF bash -xe
 apt-get update -qq
diff --git a/images/octavia/Dockerfile b/images/octavia/Dockerfile
index bf8d7e7..688ce28 100644
--- a/images/octavia/Dockerfile
+++ b/images/octavia/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG OCTAVIA_GIT_REF=000b577f3e9c9ff7cb893e9f6e635753017a78c6
 ADD --keep-git-dir=true https://opendev.org/openstack/octavia.git#${OCTAVIA_GIT_REF} /src/octavia
 RUN git -C /src/octavia fetch --unshallow
@@ -25,7 +27,7 @@
         /src/ovn-octavia-provider
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/openstack-runtime/Dockerfile b/images/openstack-runtime/Dockerfile
index 3cf9ae4..0bd8099 100644
--- a/images/openstack-runtime/Dockerfile
+++ b/images/openstack-runtime/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-ARG FROM=registry.atmosphere.dev/library/ubuntu-cloud-archive:zed
+ARG RELEASE
+
+ARG FROM=registry.atmosphere.dev/library/ubuntu-cloud-archive:${RELEASE}
 FROM ${FROM}
 ONBUILD ARG PROJECT
 ONBUILD ARG SHELL=/usr/sbin/nologin
diff --git a/images/openstack-venv-builder/Dockerfile b/images/openstack-venv-builder/Dockerfile
index 2b154cf..71efa94 100644
--- a/images/openstack-venv-builder/Dockerfile
+++ b/images/openstack-venv-builder/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/ubuntu-cloud-archive:zed AS requirements
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/ubuntu-cloud-archive:${RELEASE} AS requirements
 ADD https://releases.openstack.org/constraints/upper/zed /upper-constraints.txt
 RUN <<EOF sh -xe
 sed -i 's/cryptography===36.0.2/cryptography===42.0.4/' /upper-constraints.txt
@@ -32,7 +34,7 @@
 sed -i '/horizon/d' /upper-constraints.txt
 EOF
 
-FROM registry.atmosphere.dev/library/python-base:zed
+FROM registry.atmosphere.dev/library/python-base:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/ovn/Dockerfile b/images/ovn/Dockerfile
index 4e9ac93..43201d1 100644
--- a/images/ovn/Dockerfile
+++ b/images/ovn/Dockerfile
@@ -12,6 +12,8 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+ARG RELEASE
+
 FROM golang:1.20 AS ovn-kubernetes
 ARG OVN_KUBERNETES_REF=5359e7d7f872058b6e5bf884c9f19d1922451f29
 ADD https://github.com/ovn-org/ovn-kubernetes.git#${OVN_KUBERNETES_REF} /src
@@ -22,7 +24,7 @@
 go build -o /usr/bin/ovn-kube-util ./cmd/ovn-kube-util
 EOF
 
-FROM registry.atmosphere.dev/library/openvswitch:zed
+FROM registry.atmosphere.dev/library/openvswitch:${RELEASE}
 ADD --chmod=755 https://dl.k8s.io/release/v1.29.3/bin/linux/amd64/kubectl /usr/local/bin/kubectl
 ARG OVN_SERIES=23.03
 ARG OVN_VERSION=${OVN_SERIES}.0-69
diff --git a/images/placement/Dockerfile b/images/placement/Dockerfile
index 2aeaf23..0cfa6b5 100644
--- a/images/placement/Dockerfile
+++ b/images/placement/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG PLACEMENT_GIT_REF=d7ced6bd2fc82caf458f20b5652888164b1bbb70
 ADD --keep-git-dir=true https://opendev.org/openstack/placement.git#${PLACEMENT_GIT_REF} /src/placement
 RUN git -C /src/placement fetch --unshallow
@@ -22,5 +24,5 @@
         /src/placement
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 COPY --from=build --link /var/lib/openstack /var/lib/openstack
diff --git a/images/python-base/Dockerfile b/images/python-base/Dockerfile
index 0d4c8c4..883a4f4 100644
--- a/images/python-base/Dockerfile
+++ b/images/python-base/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/ubuntu-cloud-archive:zed
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/ubuntu-cloud-archive:${RELEASE}
 ENV PATH=/var/lib/openstack/bin:$PATH
 RUN \
     apt-get update -qq && \
diff --git a/images/senlin/Dockerfile b/images/senlin/Dockerfile
index f341d10..8d9bb13 100644
--- a/images/senlin/Dockerfile
+++ b/images/senlin/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG SENLIN_GIT_REF=b6ef17b0f787fb7a0609ba36dc13097882a6a3ff
 ADD --keep-git-dir=true https://opendev.org/openstack/senlin.git#${SENLIN_GIT_REF} /src/senlin
 RUN git -C /src/senlin fetch --unshallow
@@ -22,5 +24,5 @@
         /src/senlin
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 COPY --from=build --link /var/lib/openstack /var/lib/openstack
diff --git a/images/staffeln/Dockerfile b/images/staffeln/Dockerfile
index da7b121..c4fb1fb 100644
--- a/images/staffeln/Dockerfile
+++ b/images/staffeln/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG STAFFELN_GIT_REF=v2.2.3
 ADD --keep-git-dir=true https://github.com/vexxhost/staffeln.git#${STAFFELN_GIT_REF} /src/staffeln
 RUN git -C /src/staffeln fetch --unshallow
@@ -22,5 +24,5 @@
         /src/staffeln
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 COPY --from=build --link /var/lib/openstack /var/lib/openstack
diff --git a/images/tempest/Dockerfile b/images/tempest/Dockerfile
index ab4f183..7b71fc0 100644
--- a/images/tempest/Dockerfile
+++ b/images/tempest/Dockerfile
@@ -12,6 +12,8 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+ARG RELEASE
+
 FROM golang:1.18 AS octavia-test-server
 ADD --keep-git-dir=true https://opendev.org/openstack/octavia-tempest-plugin.git#master /src
 RUN GO111MODULE=off CGO_ENABLED=0 GOOS=linux go build \
@@ -19,7 +21,7 @@
     -o /build/test_server.bin \
     /src/octavia_tempest_plugin/contrib/test_server/test_server.go
 
-FROM registry.atmosphere.dev/library/openstack-venv-builder:zed AS build
+FROM registry.atmosphere.dev/library/openstack-venv-builder:${RELEASE} AS build
 ARG TEMPEST_GIT_REF=aeb9b13e930841c87b826d3ba917b224095f1d81
 ADD --keep-git-dir=true https://opendev.org/openstack/tempest.git#${TEMPEST_GIT_REF} /src/tempest
 RUN git -C /src/tempest fetch --unshallow
@@ -48,7 +50,7 @@
         /src/octavia-tempest-plugin
 EOF
 
-FROM registry.atmosphere.dev/library/openstack-python-runtime:zed
+FROM registry.atmosphere.dev/library/openstack-python-runtime:${RELEASE}
 RUN <<EOF bash -xe
 apt-get update -qq
 apt-get install -qq -y --no-install-recommends \
diff --git a/images/ubuntu-cloud-archive/Dockerfile b/images/ubuntu-cloud-archive/Dockerfile
index 43d3a1a..9d8f017 100644
--- a/images/ubuntu-cloud-archive/Dockerfile
+++ b/images/ubuntu-cloud-archive/Dockerfile
@@ -12,7 +12,9 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
-FROM registry.atmosphere.dev/library/ubuntu:zed
+ARG RELEASE
+
+FROM registry.atmosphere.dev/library/ubuntu:${RELEASE}
 COPY trusted.gpg.d/ubuntu-cloud-keyring.gpg /etc/apt/trusted.gpg.d/ubuntu-cloud-keyring.gpg
 COPY <<EOF /etc/apt/sources.list.d/cloudarchive.list
 deb http://ubuntu-cloud.archive.canonical.com/ubuntu jammy-updates/zed main
diff --git a/roles/defaults/vars/main.yml b/roles/defaults/vars/main.yml
index e767a38..4b82047 100644
--- a/roles/defaults/vars/main.yml
+++ b/roles/defaults/vars/main.yml
@@ -12,12 +12,14 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+atmosphere_release: zed
+
 _atmosphere_images:
   alertmanager: quay.io/prometheus/alertmanager:v0.27.0
-  barbican_api: registry.atmosphere.dev/library/barbican:zed
-  barbican_db_sync: registry.atmosphere.dev/library/barbican:zed
-  bootstrap: registry.atmosphere.dev/library/heat:zed
-  ceph_config_helper: registry.atmosphere.dev/library/libvirtd:zed
+  barbican_api: "registry.atmosphere.dev/library/barbican:{{ atmosphere_release }}"
+  barbican_db_sync: "registry.atmosphere.dev/library/barbican:{{ atmosphere_release }}"
+  bootstrap: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  ceph_config_helper: "registry.atmosphere.dev/library/libvirtd:{{ atmosphere_release }}"
   ceph: quay.io/ceph/ceph:v16.2.11
   cert_manager_cainjector: quay.io/jetstack/cert-manager-cainjector:v1.7.1
   cert_manager_cli: quay.io/jetstack/cert-manager-ctl:v1.7.1
@@ -25,14 +27,14 @@
   cert_manager_webhook: quay.io/jetstack/cert-manager-webhook:v1.7.1
   cilium_node: quay.io/cilium/cilium:v1.14.8
   cilium_operator: quay.io/cilium/operator-generic:v1.14.8
-  cinder_api: registry.atmosphere.dev/library/cinder:zed
-  cinder_backup_storage_init: registry.atmosphere.dev/library/cinder:zed
-  cinder_backup: registry.atmosphere.dev/library/cinder:zed
-  cinder_db_sync: registry.atmosphere.dev/library/cinder:zed
-  cinder_scheduler: registry.atmosphere.dev/library/cinder:zed
-  cinder_storage_init: registry.atmosphere.dev/library/cinder:zed
-  cinder_volume_usage_audit: registry.atmosphere.dev/library/cinder:zed
-  cinder_volume: registry.atmosphere.dev/library/cinder:zed
+  cinder_api: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_backup_storage_init: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_backup: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_db_sync: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_scheduler: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_storage_init: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_volume_usage_audit: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
+  cinder_volume: "registry.atmosphere.dev/library/cinder:{{ atmosphere_release }}"
   cluster_api_controller: registry.k8s.io/cluster-api/cluster-api-controller:v1.6.0
   cluster_api_kubeadm_bootstrap_controller: registry.k8s.io/cluster-api/kubeadm-bootstrap-controller:v1.6.0
   cluster_api_kubeadm_control_plane_controller: registry.k8s.io/cluster-api/kubeadm-control-plane-controller:v1.6.0
@@ -43,49 +45,49 @@
   csi_rbd_provisioner: registry.k8s.io/sig-storage/csi-provisioner:v3.1.0
   csi_rbd_resizer: registry.k8s.io/sig-storage/csi-resizer:v1.3.0
   csi_rbd_snapshotter: registry.k8s.io/sig-storage/csi-snapshotter:v4.2.0
-  db_drop: registry.atmosphere.dev/library/heat:zed
-  db_init: registry.atmosphere.dev/library/heat:zed
-  dep_check: registry.atmosphere.dev/library/kubernetes-entrypoint:zed
-  designate_api: registry.atmosphere.dev/library/designate:zed
-  designate_central: registry.atmosphere.dev/library/designate:zed
-  designate_db_sync: registry.atmosphere.dev/library/designate:zed
-  designate_mdns: registry.atmosphere.dev/library/designate:zed
-  designate_producer: registry.atmosphere.dev/library/designate:zed
-  designate_sink: registry.atmosphere.dev/library/designate:zed
-  designate_worker: registry.atmosphere.dev/library/designate:zed
-  glance_api: registry.atmosphere.dev/library/glance:zed
-  glance_db_sync: registry.atmosphere.dev/library/glance:zed
-  glance_metadefs_load: registry.atmosphere.dev/library/glance:zed
-  glance_registry: registry.atmosphere.dev/library/glance:zed
-  glance_storage_init: registry.atmosphere.dev/library/glance:zed
+  db_drop: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  db_init: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  dep_check: "registry.atmosphere.dev/library/kubernetes-entrypoint:{{ atmosphere_release }}"
+  designate_api: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  designate_central: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  designate_db_sync: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  designate_mdns: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  designate_producer: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  designate_sink: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  designate_worker: "registry.atmosphere.dev/library/designate:{{ atmosphere_release }}"
+  glance_api: "registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
+  glance_db_sync: "registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
+  glance_metadefs_load: "registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
+  glance_registry: "registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
+  glance_storage_init: "registry.atmosphere.dev/library/glance:{{ atmosphere_release }}"
   grafana_sidecar: quay.io/kiwigrid/k8s-sidecar:1.26.1
   grafana: docker.io/grafana/grafana:10.4.0
   haproxy: docker.io/library/haproxy:2.5
-  heat_api: registry.atmosphere.dev/library/heat:zed
-  heat_cfn: registry.atmosphere.dev/library/heat:zed
-  heat_cloudwatch: registry.atmosphere.dev/library/heat:zed
-  heat_db_sync: registry.atmosphere.dev/library/heat:zed
-  heat_engine_cleaner: registry.atmosphere.dev/library/heat:zed
-  heat_engine: registry.atmosphere.dev/library/heat:zed
-  heat_purge_deleted: registry.atmosphere.dev/library/heat:zed
-  horizon_db_sync: registry.atmosphere.dev/library/horizon:zed
-  horizon: registry.atmosphere.dev/library/horizon:zed
+  heat_api: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  heat_cfn: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  heat_cloudwatch: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  heat_db_sync: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  heat_engine_cleaner: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  heat_engine: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  heat_purge_deleted: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  horizon_db_sync: "registry.atmosphere.dev/library/horizon:{{ atmosphere_release }}"
+  horizon: "registry.atmosphere.dev/library/horizon:{{ atmosphere_release }}"
   ingress_nginx_controller: registry.k8s.io/ingress-nginx/controller:v1.1.1
   ingress_nginx_default_backend: registry.k8s.io/defaultbackend-amd64:1.5
   ingress_nginx_kube_webhook_certgen: registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.1.1
-  keepalived: registry.atmosphere.dev/library/keepalived:zed
+  keepalived: "registry.atmosphere.dev/library/keepalived:{{ atmosphere_release }}"
   keycloak: quay.io/keycloak/keycloak:22.0.1-0
-  keystone_api: registry.atmosphere.dev/library/keystone:zed
-  keystone_credential_cleanup: registry.atmosphere.dev/library/heat:zed
-  keystone_credential_rotate: registry.atmosphere.dev/library/keystone:zed
-  keystone_credential_setup: registry.atmosphere.dev/library/keystone:zed
-  keystone_db_sync: registry.atmosphere.dev/library/keystone:zed
-  keystone_domain_manage: registry.atmosphere.dev/library/heat:zed
-  keystone_fernet_rotate: registry.atmosphere.dev/library/keystone:zed
-  keystone_fernet_setup: registry.atmosphere.dev/library/keystone:zed
-  ks_endpoints: registry.atmosphere.dev/library/heat:zed
-  ks_service: registry.atmosphere.dev/library/heat:zed
-  ks_user: registry.atmosphere.dev/library/heat:zed
+  keystone_api: "registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
+  keystone_credential_cleanup: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  keystone_credential_rotate: "registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
+  keystone_credential_setup: "registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
+  keystone_db_sync: "registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
+  keystone_domain_manage: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  keystone_fernet_rotate: "registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
+  keystone_fernet_setup: "registry.atmosphere.dev/library/keystone:{{ atmosphere_release }}"
+  ks_endpoints: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  ks_service: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  ks_user: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
   kube_apiserver: registry.k8s.io/kube-apiserver:v1.22.17
   kube_controller_manager: registry.k8s.io/kube-controller-manager:v1.22.17
   kube_coredns: registry.k8s.io/coredns/coredns:v1.8.4
@@ -94,79 +96,79 @@
   kube_scheduler: registry.k8s.io/kube-scheduler:v1.22.17
   kube_state_metrics: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.12.0
   kubectl: docker.io/bitnami/kubectl:1.27.3
-  libvirt: registry.atmosphere.dev/library/libvirtd:zed
-  libvirt_tls_sidecar: registry.atmosphere.dev/library/libvirt-tls-sidecar:zed
+  libvirt: "registry.atmosphere.dev/library/libvirtd:{{ atmosphere_release }}"
+  libvirt_tls_sidecar: "registry.atmosphere.dev/library/libvirt-tls-sidecar:{{ atmosphere_release }}"
   libvirt_exporter: docker.io/vexxhost/libvirtd-exporter:latest
   local_path_provisioner_helper: docker.io/library/busybox:1.36.0
   local_path_provisioner: docker.io/rancher/local-path-provisioner:v0.0.24
   loki_gateway: docker.io/nginxinc/nginx-unprivileged:1.24-alpine
   loki: docker.io/grafana/loki:2.9.6
-  magnum_api: registry.atmosphere.dev/library/magnum:zed
-  magnum_cluster_api_proxy: registry.atmosphere.dev/library/magnum:zed
-  magnum_conductor: registry.atmosphere.dev/library/magnum:zed
-  magnum_db_sync: registry.atmosphere.dev/library/magnum:zed
+  magnum_api: "registry.atmosphere.dev/library/magnum:{{ atmosphere_release }}"
+  magnum_cluster_api_proxy: "registry.atmosphere.dev/library/magnum:{{ atmosphere_release }}"
+  magnum_conductor: "registry.atmosphere.dev/library/magnum:{{ atmosphere_release }}"
+  magnum_db_sync: "registry.atmosphere.dev/library/magnum:{{ atmosphere_release }}"
   magnum_registry: quay.io/vexxhost/magnum-cluster-api-registry:latest
-  manila_api: registry.atmosphere.dev/library/manila:zed
-  manila_data: registry.atmosphere.dev/library/manila:zed
-  manila_db_sync: registry.atmosphere.dev/library/manila:zed
-  manila_scheduler: registry.atmosphere.dev/library/manila:zed
-  manila_share: registry.atmosphere.dev/library/manila:zed
+  manila_api: "registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
+  manila_data: "registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
+  manila_db_sync: "registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
+  manila_scheduler: "registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
+  manila_share: "registry.atmosphere.dev/library/manila:{{ atmosphere_release }}"
   memcached: docker.io/library/memcached:1.6.17
-  netoffload: registry.atmosphere.dev/library/netoffload:zed
-  neutron_bagpipe_bgp: registry.atmosphere.dev/library/neutron:zed
-  neutron_bgp_dragent: registry.atmosphere.dev/library/neutron:zed
+  netoffload: "registry.atmosphere.dev/library/netoffload:{{ atmosphere_release }}"
+  neutron_bagpipe_bgp: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_bgp_dragent: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
   neutron_coredns: docker.io/coredns/coredns:1.9.3
-  neutron_db_sync: registry.atmosphere.dev/library/neutron:zed
-  neutron_dhcp: registry.atmosphere.dev/library/neutron:zed
-  neutron_ironic_agent: registry.atmosphere.dev/library/neutron:zed
-  neutron_l2gw: registry.atmosphere.dev/library/neutron:zed
-  neutron_l3: registry.atmosphere.dev/library/neutron:zed
-  neutron_linuxbridge_agent: registry.atmosphere.dev/library/neutron:zed
-  neutron_metadata: registry.atmosphere.dev/library/neutron:zed
-  neutron_netns_cleanup_cron: registry.atmosphere.dev/library/neutron:zed
-  neutron_openvswitch_agent: registry.atmosphere.dev/library/neutron:zed
-  neutron_ovn_metadata: registry.atmosphere.dev/library/neutron:zed
-  neutron_server: registry.atmosphere.dev/library/neutron:zed
-  neutron_sriov_agent_init: registry.atmosphere.dev/library/neutron:zed
-  neutron_sriov_agent: registry.atmosphere.dev/library/neutron:zed
+  neutron_db_sync: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_dhcp: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_ironic_agent: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_l2gw: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_l3: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_linuxbridge_agent: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_metadata: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_netns_cleanup_cron: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_openvswitch_agent: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_ovn_metadata: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_server: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_sriov_agent_init: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
+  neutron_sriov_agent: "registry.atmosphere.dev/library/neutron:{{ atmosphere_release }}"
   node_feature_discovery: registry.k8s.io/nfd/node-feature-discovery:v0.11.2
-  nova_api: registry.atmosphere.dev/library/nova:zed
-  nova_archive_deleted_rows: registry.atmosphere.dev/library/nova:zed
-  nova_cell_setup_init: registry.atmosphere.dev/library/heat:zed
-  nova_cell_setup: registry.atmosphere.dev/library/nova:zed
-  nova_compute_ironic: registry.atmosphere.dev/library/nova:zed
-  nova_compute_ssh: registry.atmosphere.dev/library/nova-ssh:zed
-  nova_compute: registry.atmosphere.dev/library/nova:zed
-  nova_conductor: registry.atmosphere.dev/library/nova:zed
-  nova_consoleauth: registry.atmosphere.dev/library/nova:zed
-  nova_db_sync: registry.atmosphere.dev/library/nova:zed
-  nova_novncproxy_assets: registry.atmosphere.dev/library/nova:zed
-  nova_novncproxy: registry.atmosphere.dev/library/nova:zed
-  nova_placement: registry.atmosphere.dev/library/nova:zed
-  nova_scheduler: registry.atmosphere.dev/library/nova:zed
-  nova_service_cleaner: registry.atmosphere.dev/library/heat:zed
-  nova_spiceproxy_assets: registry.atmosphere.dev/library/nova:zed
-  nova_spiceproxy: registry.atmosphere.dev/library/nova:zed
+  nova_api: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_archive_deleted_rows: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_cell_setup_init: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  nova_cell_setup: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_compute_ironic: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_compute_ssh: "registry.atmosphere.dev/library/nova-ssh:{{ atmosphere_release }}"
+  nova_compute: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_conductor: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_consoleauth: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_db_sync: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_novncproxy_assets: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_novncproxy: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_placement: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_scheduler: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_service_cleaner: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  nova_spiceproxy_assets: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
+  nova_spiceproxy: "registry.atmosphere.dev/library/nova:{{ atmosphere_release }}"
   oauth2_proxy: quay.io/oauth2-proxy/oauth2-proxy:v7.6.0
-  octavia_api: registry.atmosphere.dev/library/octavia:zed
-  octavia_db_sync: registry.atmosphere.dev/library/octavia:zed
-  octavia_health_manager_init: registry.atmosphere.dev/library/heat:zed
-  octavia_health_manager: registry.atmosphere.dev/library/octavia:zed
-  octavia_housekeeping: registry.atmosphere.dev/library/octavia:zed
-  octavia_worker: registry.atmosphere.dev/library/octavia:zed
-  openvswitch_db_server: registry.atmosphere.dev/library/openvswitch:zed
-  openvswitch_vswitchd: registry.atmosphere.dev/library/openvswitch:zed
-  ovn_controller: registry.atmosphere.dev/library/ovn-host:zed
-  ovn_northd: registry.atmosphere.dev/library/ovn-central:zed
-  ovn_ovsdb_nb: registry.atmosphere.dev/library/ovn-central:zed
-  ovn_ovsdb_sb: registry.atmosphere.dev/library/ovn-central:zed
+  octavia_api: "registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
+  octavia_db_sync: "registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
+  octavia_health_manager_init: "registry.atmosphere.dev/library/heat:{{ atmosphere_release }}"
+  octavia_health_manager: "registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
+  octavia_housekeeping: "registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
+  octavia_worker: "registry.atmosphere.dev/library/octavia:{{ atmosphere_release }}"
+  openvswitch_db_server: "registry.atmosphere.dev/library/openvswitch:{{ atmosphere_release }}"
+  openvswitch_vswitchd: "registry.atmosphere.dev/library/openvswitch:{{ atmosphere_release }}"
+  ovn_controller: "registry.atmosphere.dev/library/ovn-host:{{ atmosphere_release }}"
+  ovn_northd: "registry.atmosphere.dev/library/ovn-central:{{ atmosphere_release }}"
+  ovn_ovsdb_nb: "registry.atmosphere.dev/library/ovn-central:{{ atmosphere_release }}"
+  ovn_ovsdb_sb: "registry.atmosphere.dev/library/ovn-central:{{ atmosphere_release }}"
   pause: registry.k8s.io/pause:3.9
   percona_xtradb_cluster_haproxy: docker.io/percona/percona-xtradb-cluster-operator:1.13.0-haproxy
   percona_xtradb_cluster_operator: docker.io/percona/percona-xtradb-cluster-operator:1.13.0
   percona_xtradb_cluster: docker.io/percona/percona-xtradb-cluster:8.0.32-24.2
   percona_version_service: docker.io/perconalab/version-service:main-3325140
-  placement_db_sync: registry.atmosphere.dev/library/placement:zed
-  placement: registry.atmosphere.dev/library/placement:zed
+  placement_db_sync: "registry.atmosphere.dev/library/placement:{{ atmosphere_release }}"
+  placement: "registry.atmosphere.dev/library/placement:{{ atmosphere_release }}"
   prometheus_config_reloader: quay.io/prometheus-operator/prometheus-config-reloader:v0.73.0
   prometheus_ipmi_exporter: us-docker.pkg.dev/vexxhost-infra/openstack/ipmi-exporter:1.4.0
   prometheus_memcached_exporter: quay.io/prometheus/memcached-exporter:v0.10.0
@@ -185,16 +187,16 @@
   rabbitmq_topology_operator: docker.io/rabbitmqoperator/messaging-topology-operator:1.6.0
   rook_ceph: docker.io/rook/ceph:v1.10.10
   secretgen_controller: ghcr.io/carvel-dev/secretgen-controller@sha256:59ec05ce5847bfd70c8e04f08b5195e918c8f6fbb947ffc91b456494a2958fd5
-  senlin_api: registry.atmosphere.dev/library/senlin:zed
-  senlin_conductor: registry.atmosphere.dev/library/senlin:zed
-  senlin_db_sync: registry.atmosphere.dev/library/senlin:zed
-  senlin_engine_cleaner: registry.atmosphere.dev/library/senlin:zed
-  senlin_engine: registry.atmosphere.dev/library/senlin:zed
-  senlin_health_manager: registry.atmosphere.dev/library/senlin:zed
-  staffeln_db_sync: registry.atmosphere.dev/library/staffeln:zed
-  staffeln_conductor: registry.atmosphere.dev/library/staffeln:zed
-  staffeln_api: registry.atmosphere.dev/library/staffeln:zed
-  tempest_run_tests: registry.atmosphere.dev/library/tempest:zed
+  senlin_api: "registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
+  senlin_conductor: "registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
+  senlin_db_sync: "registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
+  senlin_engine_cleaner: "registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
+  senlin_engine: "registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
+  senlin_health_manager: "registry.atmosphere.dev/library/senlin:{{ atmosphere_release }}"
+  staffeln_db_sync: "registry.atmosphere.dev/library/staffeln:{{ atmosphere_release }}"
+  staffeln_conductor: "registry.atmosphere.dev/library/staffeln:{{ atmosphere_release }}"
+  staffeln_api: "registry.atmosphere.dev/library/staffeln:{{ atmosphere_release }}"
+  tempest_run_tests: "registry.atmosphere.dev/library/tempest:{{ atmosphere_release }}"
   vector: docker.io/timberio/vector:0.37.0-debian
 
 atmosphere_images: '{{ _atmosphere_images | combine(atmosphere_image_overrides, recursive=True)
diff --git a/zuul.d/container-images/barbican.yaml b/zuul.d/container-images/barbican.yaml
index 6e38ff6..73d178e 100644
--- a/zuul.d/container-images/barbican.yaml
+++ b/zuul.d/container-images/barbican.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=barbican
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/cinder.yaml b/zuul.d/container-images/cinder.yaml
index 66e83a6..fa7a675 100644
--- a/zuul.d/container-images/cinder.yaml
+++ b/zuul.d/container-images/cinder.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=cinder
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/cluster-api-provider-openstack.yaml b/zuul.d/container-images/cluster-api-provider-openstack.yaml
index 25a858b..53394e4 100644
--- a/zuul.d/container-images/cluster-api-provider-openstack.yaml
+++ b/zuul.d/container-images/cluster-api-provider-openstack.yaml
@@ -35,7 +35,7 @@
           arch:
             - linux/amd64
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/cluster-api-provider-openstack/.*
 
diff --git a/zuul.d/container-images/designate.yaml b/zuul.d/container-images/designate.yaml
index ed9719a..9ff13fd 100644
--- a/zuul.d/container-images/designate.yaml
+++ b/zuul.d/container-images/designate.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=designate
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/glance.yaml b/zuul.d/container-images/glance.yaml
index a9aa580..69b5433 100644
--- a/zuul.d/container-images/glance.yaml
+++ b/zuul.d/container-images/glance.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=glance
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/heat.yaml b/zuul.d/container-images/heat.yaml
index 2492adc..52403ef 100644
--- a/zuul.d/container-images/heat.yaml
+++ b/zuul.d/container-images/heat.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=heat
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/horizon.yaml b/zuul.d/container-images/horizon.yaml
index 389e828..914053d 100644
--- a/zuul.d/container-images/horizon.yaml
+++ b/zuul.d/container-images/horizon.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=horizon
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/ironic.yaml b/zuul.d/container-images/ironic.yaml
index 462d12d..3e16dd1 100644
--- a/zuul.d/container-images/ironic.yaml
+++ b/zuul.d/container-images/ironic.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=ironic
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/keepalived.yaml b/zuul.d/container-images/keepalived.yaml
index 11d66cf..68f462a 100644
--- a/zuul.d/container-images/keepalived.yaml
+++ b/zuul.d/container-images/keepalived.yaml
@@ -37,8 +37,10 @@
           repository: registry.atmosphere.dev/library/keepalived
           arch:
             - linux/amd64
+          build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/keepalived/.*
diff --git a/zuul.d/container-images/keystone.yaml b/zuul.d/container-images/keystone.yaml
index 84d58a5..791f3ce 100644
--- a/zuul.d/container-images/keystone.yaml
+++ b/zuul.d/container-images/keystone.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=keystone
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/kubernetes-entrypoint.yaml b/zuul.d/container-images/kubernetes-entrypoint.yaml
index 3c6a60b..ea04bde 100644
--- a/zuul.d/container-images/kubernetes-entrypoint.yaml
+++ b/zuul.d/container-images/kubernetes-entrypoint.yaml
@@ -35,7 +35,7 @@
           arch:
             - linux/amd64
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/kubernetes-entrypoint/.*
 
diff --git a/zuul.d/container-images/libvirt-tls-sidecar.yaml b/zuul.d/container-images/libvirt-tls-sidecar.yaml
index 734bc5b..76dfd48 100644
--- a/zuul.d/container-images/libvirt-tls-sidecar.yaml
+++ b/zuul.d/container-images/libvirt-tls-sidecar.yaml
@@ -38,8 +38,10 @@
           repository: registry.atmosphere.dev/library/libvirt-tls-sidecar
           arch:
             - linux/amd64
+          build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - cmd/.*
diff --git a/zuul.d/container-images/libvirtd.yaml b/zuul.d/container-images/libvirtd.yaml
index 77b6ecc..dc2d6d2 100644
--- a/zuul.d/container-images/libvirtd.yaml
+++ b/zuul.d/container-images/libvirtd.yaml
@@ -42,9 +42,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=nova
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/magnum.yaml b/zuul.d/container-images/magnum.yaml
index 55e009d..234e591 100644
--- a/zuul.d/container-images/magnum.yaml
+++ b/zuul.d/container-images/magnum.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=magnum
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/manila.yaml b/zuul.d/container-images/manila.yaml
index 7655da2..2d71690 100644
--- a/zuul.d/container-images/manila.yaml
+++ b/zuul.d/container-images/manila.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=manila
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/netoffload.yaml b/zuul.d/container-images/netoffload.yaml
index 58cba39..2ca86b4 100644
--- a/zuul.d/container-images/netoffload.yaml
+++ b/zuul.d/container-images/netoffload.yaml
@@ -37,8 +37,10 @@
           repository: registry.atmosphere.dev/library/netoffload
           arch:
             - linux/amd64
+          build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/netoffload/.*
diff --git a/zuul.d/container-images/neutron.yaml b/zuul.d/container-images/neutron.yaml
index 4758952..5612ff8 100644
--- a/zuul.d/container-images/neutron.yaml
+++ b/zuul.d/container-images/neutron.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=neutron
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/nova-ssh.yaml b/zuul.d/container-images/nova-ssh.yaml
index 8c60c07..d7801c1 100644
--- a/zuul.d/container-images/nova-ssh.yaml
+++ b/zuul.d/container-images/nova-ssh.yaml
@@ -42,9 +42,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=nova
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/nova.yaml b/zuul.d/container-images/nova.yaml
index d16d032..5b415c3 100644
--- a/zuul.d/container-images/nova.yaml
+++ b/zuul.d/container-images/nova.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=nova
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/octavia.yaml b/zuul.d/container-images/octavia.yaml
index 0b79b4f..e8555a3 100644
--- a/zuul.d/container-images/octavia.yaml
+++ b/zuul.d/container-images/octavia.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=octavia
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/openstack-python-runtime.yaml b/zuul.d/container-images/openstack-python-runtime.yaml
index 3ef1110..5a7ce33 100644
--- a/zuul.d/container-images/openstack-python-runtime.yaml
+++ b/zuul.d/container-images/openstack-python-runtime.yaml
@@ -42,9 +42,10 @@
           arch:
             - linux/amd64
           build_args:
-            - FROM=registry.atmosphere.dev/library/python-base:zed
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
+            - "FROM=registry.atmosphere.dev/library/python-base:{{ zuul.branch | replace('stable/', '') }}"
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/openstack-runtime.yaml b/zuul.d/container-images/openstack-runtime.yaml
index 039c880..cde0737 100644
--- a/zuul.d/container-images/openstack-runtime.yaml
+++ b/zuul.d/container-images/openstack-runtime.yaml
@@ -39,8 +39,10 @@
           repository: registry.atmosphere.dev/library/openstack-runtime
           arch:
             - linux/amd64
+          build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/openstack-venv-builder.yaml b/zuul.d/container-images/openstack-venv-builder.yaml
index 73767b5..a50ee93 100644
--- a/zuul.d/container-images/openstack-venv-builder.yaml
+++ b/zuul.d/container-images/openstack-venv-builder.yaml
@@ -41,8 +41,10 @@
           repository: registry.atmosphere.dev/library/openstack-venv-builder
           arch:
             - linux/amd64
+          build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/openvswitch.yaml b/zuul.d/container-images/openvswitch.yaml
index 542616b..67a55c6 100644
--- a/zuul.d/container-images/openvswitch.yaml
+++ b/zuul.d/container-images/openvswitch.yaml
@@ -35,7 +35,7 @@
           arch:
             - linux/amd64
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/openvswitch/.*
 
diff --git a/zuul.d/container-images/ovn.yaml b/zuul.d/container-images/ovn.yaml
index 66242ad..5a3e180 100644
--- a/zuul.d/container-images/ovn.yaml
+++ b/zuul.d/container-images/ovn.yaml
@@ -38,18 +38,20 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - OVN_COMPONENT=central
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
         - context: images/ovn
           registry: registry.atmosphere.dev
           repository: registry.atmosphere.dev/library/ovn-host
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - OVN_COMPONENT=host
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/openvswitch/.*
       - images/ovn/.*
diff --git a/zuul.d/container-images/placement.yaml b/zuul.d/container-images/placement.yaml
index 765e950..d020a79 100644
--- a/zuul.d/container-images/placement.yaml
+++ b/zuul.d/container-images/placement.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=placement
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/python-base.yaml b/zuul.d/container-images/python-base.yaml
index e88a9c6..3e63e8c 100644
--- a/zuul.d/container-images/python-base.yaml
+++ b/zuul.d/container-images/python-base.yaml
@@ -39,8 +39,10 @@
           repository: registry.atmosphere.dev/library/python-base
           arch:
             - linux/amd64
+          build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/senlin.yaml b/zuul.d/container-images/senlin.yaml
index cb3592e..fc12aa0 100644
--- a/zuul.d/container-images/senlin.yaml
+++ b/zuul.d/container-images/senlin.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=senlin
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/staffeln.yaml b/zuul.d/container-images/staffeln.yaml
index e765381..db01912 100644
--- a/zuul.d/container-images/staffeln.yaml
+++ b/zuul.d/container-images/staffeln.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=staffeln
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/tempest.yaml b/zuul.d/container-images/tempest.yaml
index 8d321a5..1d81749 100644
--- a/zuul.d/container-images/tempest.yaml
+++ b/zuul.d/container-images/tempest.yaml
@@ -46,9 +46,10 @@
           arch:
             - linux/amd64
           build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
             - PROJECT=tempest
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/ubuntu-cloud-archive.yaml b/zuul.d/container-images/ubuntu-cloud-archive.yaml
index a643e3a..d2d23ba 100644
--- a/zuul.d/container-images/ubuntu-cloud-archive.yaml
+++ b/zuul.d/container-images/ubuntu-cloud-archive.yaml
@@ -37,8 +37,10 @@
           repository: registry.atmosphere.dev/library/ubuntu-cloud-archive
           arch:
             - linux/amd64
+          build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
       - images/ubuntu-cloud-archive/.*
diff --git a/zuul.d/container-images/ubuntu.yaml b/zuul.d/container-images/ubuntu.yaml
index 6fb76d3..5e39b95 100644
--- a/zuul.d/container-images/ubuntu.yaml
+++ b/zuul.d/container-images/ubuntu.yaml
@@ -34,8 +34,10 @@
           repository: registry.atmosphere.dev/library/ubuntu
           arch:
             - linux/amd64
+          build_args:
+            - "RELEASE={{ zuul.branch | replace('stable/', '') }}"
           tags:
-            - zed
+            - "{{ zuul.branch | replace('stable/', '') }}"
     files: &container_image_files
       - images/ubuntu/.*
 
diff --git a/zuul.d/playbooks/molecule/pre.yml b/zuul.d/playbooks/molecule/pre.yml
index a4bc692..9e10180 100644
--- a/zuul.d/playbooks/molecule/pre.yml
+++ b/zuul.d/playbooks/molecule/pre.yml
@@ -59,15 +59,14 @@
         - name: Replace the registry in image manifest
           ansible.builtin.replace:
             path: "{{ zuul.project.src_dir }}/roles/defaults/vars/main.yml"
-            regexp: "{{ repo }}:{{ tag }}"
-            replace: '{{ buildset_registry.host }}:{{ buildset_registry.port }}/{{ repo }}:{{ tag }}'
+            regexp: "{{ repo }}:"
+            replace: '{{ buildset_registry.host }}:{{ buildset_registry.port }}/{{ repo }}:'
           loop: "{{ zuul.artifacts | default([]) }}"
           loop_control:
             loop_var: zj_zuul_artifact
           when: "'metadata' in zj_zuul_artifact and zj_zuul_artifact.metadata.type | default('') == 'container_image'"
           vars:
             repo: "{{ zj_zuul_artifact.metadata.repository }}"
-            tag: "{{ zj_zuul_artifact.metadata.tag }}"
 
     # TODO(mnaser): Drop this when we move to PBR
     - name: Add current folder to Git's safe directories