docker_publisher.py: Add option to remove archs from published images

Set a fetcher to None to explicitly remove this arch from a manifest list.
This commit is contained in:
Fabian Vogt 2024-10-24 14:08:26 +02:00
parent d0f75c36cc
commit 71a07b9013

View File

@ -126,14 +126,20 @@ class DockerImagePublisherRegistry(DockerImagePublisher):
return self.cached_manifestlist
def _manifestIsForArch(self, manifest, docker_arch, docker_variant):
if 'variant' in manifest['platform'] and manifest['platform']['variant'] != docker_variant:
return False
return manifest['platform']['architecture'] == docker_arch
def releasedDockerImageVersion(self, arch):
docker_arch, docker_variant = self.getDockerArch(arch)
manifestlist = self._getManifestlist()
if manifestlist is None:
# No manifest -> force outdated version
return "0"
# No manifest
return None
for manifest in manifestlist['manifests']:
if docker_variant is not None:
@ -144,8 +150,7 @@ class DockerImagePublisherRegistry(DockerImagePublisher):
if 'vnd-opensuse-version' in manifest:
return manifest['vnd-opensuse-version']
# Arch not in the manifest -> force outdated version
return "0"
return None
def prepareReleasing(self):
if self.new_manifestlist is not None:
@ -192,6 +197,12 @@ class DockerImagePublisherRegistry(DockerImagePublisher):
"application/vnd.docker.container.image.v1+json"),
'layers': layers}
def removeImage(self, arch):
docker_arch, docker_variant = self.getDockerArch(arch)
self.new_manifestlist['manifests'] = [m for m in self.new_manifestlist['manifests']
if not self._manifestIsForArch(m, docker_arch, docker_variant)]
def addImage(self, version, arch, image_path):
docker_arch, docker_variant = self.getDockerArch(arch)
@ -221,18 +232,17 @@ class DockerImagePublisherRegistry(DockerImagePublisher):
# Register the manifest in the list
replaced = False
for manifest in self.new_manifestlist['manifests']:
if 'variant' in manifest['platform'] and manifest['platform']['variant'] != docker_variant:
if not self._manifestIsForArch(manifest, docker_arch, docker_variant):
continue
if manifest['platform']['architecture'] == docker_arch:
manifest['mediaType'] = manifest_v2['mediaType']
manifest['size'] = len(manifest_content)
manifest['digest'] = manifest_digest
manifest['vnd-opensuse-version'] = version
if docker_variant is not None:
manifest['platform']['variant'] = docker_variant
manifest['mediaType'] = manifest_v2['mediaType']
manifest['size'] = len(manifest_content)
manifest['digest'] = manifest_digest
manifest['vnd-opensuse-version'] = version
if docker_variant is not None:
manifest['platform']['variant'] = docker_variant
replaced = True
replaced = True
if not replaced:
# Add it instead
@ -423,7 +433,7 @@ def run():
for arch in fetchers:
print(f"\tArchitecture {arch}")
try:
current = fetchers[arch].currentVersion()
current = fetchers[arch].currentVersion() if fetchers[arch] else None
print(f"\t\tAvailable version: {current}")
released = publisher.releasedDockerImageVersion(arch)
@ -446,6 +456,12 @@ def run():
need_to_upload = False
for arch, version in archs_to_update.items():
if fetchers[arch] is None:
print(f"\tRemoving {arch} image")
publisher.removeImage(arch)
need_to_upload = True
continue
print(f"\tUpdating {arch} image to version {version}")
try:
fetchers[arch].getDockerImage(lambda image_path: publisher.addImage(version=version,