Skip to content

Commit

Permalink
Fix coreos#3150 - Make push-container-manifest idempotent
Browse files Browse the repository at this point in the history
 - Check if the digests are already present in the remote
manifest and if you want to force or not a new manifest upload

Signed-off-by: Renata Ravanelli <[email protected]>
  • Loading branch information
ravanelli committed Nov 1, 2022
1 parent bc2a455 commit 3990436
Showing 1 changed file with 38 additions and 20 deletions.
58 changes: 38 additions & 20 deletions src/cmd-push-container-manifest
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@ def main():
# - Store the path to the container image in the container_images list
images = []
buildmetas = dict()
upload = False
check_digest = ""

# Checks if we already have it in the remote
try:
cmd = ["skopeo", "inspect","--raw", f"docker://{args.repo}:{args.tags[0]}"]
check_digest = runcmd(cmd, capture_output=True).stdout
except:
pass

for arch in args.arches:
if arch not in build_arches:
print(f"Requested architecture {arch} is not in {args.build}")
Expand All @@ -48,6 +58,13 @@ def main():
if not buildmeta['images'][args.artifact]:
print(f"No artifact {args.artifact} in {args.build}/{arch}")
raise Exception
# Checks if the meta digest is present and if it matches the arch digest in the remote
try:
digest = buildmetas[arch][args.metajsonname]['digest']
if digest not in str(check_digest)
upload = True
except:
pass
ociarchive = os.path.join(builddir, buildmeta['images'][args.artifact]['path'])
ocisha256sum = buildmeta['images'][args.artifact]['sha256']
if not os.path.exists(ociarchive):
Expand All @@ -58,26 +75,27 @@ def main():
raise Exception
images.append(f"oci-archive:{ociarchive}")

# Create/Upload the manifest list to the container registry
manifest_info = create_and_push_container_manifest(
args.repo, args.tags, images, args.v2s2)

# Update the `meta.json` files. Note the digest included is the
# arch-specific one for each individual arch, and not the manifest list
# digest. See: https://github.com/coreos/coreos-assembler/issues/3122.
assert len(manifest_info['manifests']) == len(buildmetas)
for manifest in manifest_info['manifests']:
arch = manifest['platform']['architecture']
if arch == 'arm64':
arch = 'aarch64'
elif arch == 'amd64':
arch = 'x86_64'
buildmetas[arch][args.metajsonname] = {
'image': args.repo,
'digest': manifest['digest'],
'tags': args.tags
}
buildmetas[arch].write(artifact_name=args.metajsonname)
if upload is True or args.force is True:
# Create/Upload the manifest list to the container registry
manifest_info = create_and_push_container_manifest(
args.repo, args.tags, images, args.v2s2)

# Update the `meta.json` files. Note the digest included is the
# arch-specific one for each individual arch, and not the manifest list
# digest. See: https://github.com/coreos/coreos-assembler/issues/3122.
assert len(manifest_info['manifests']) == len(buildmetas)
for manifest in manifest_info['manifests']:
arch = manifest['platform']['architecture']
if arch == 'arm64':
arch = 'aarch64'
elif arch == 'amd64':
arch = 'x86_64'
buildmetas[arch][args.metajsonname] = {
'image': args.repo,
'digest': manifest['digest'],
'tags': args.tags
}
buildmetas[arch].write(artifact_name=args.metajsonname)


def parse_args():
Expand Down

0 comments on commit 3990436

Please sign in to comment.