Skip to content

Commit f5fcd0d

Browse files
Change the format of the relese_info file
1 parent 8ea1b0c commit f5fcd0d

File tree

2 files changed

+66
-8
lines changed

2 files changed

+66
-8
lines changed

scripts/release/build/image_build_process.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import base64
22
import subprocess
3-
from typing import Dict
3+
from typing import Dict, Optional
44

55
import boto3
66
import docker
@@ -22,6 +22,14 @@ def build_image(self, tags: list[str],
2222
args: Dict[str, str],
2323
platforms: list[str]): pass
2424

25+
# check_if_image_exists could easily be used to get the digest of manfiest list but
26+
# the python package that we use somehow doesn't return the digest of manifest list
27+
# even though the respective docker CLI returns the digest. That's why we had to introduce
28+
# this function.
29+
def get_manfiest_list_digest(self, image: str) -> Optional[str]: pass
30+
31+
def pull_image(self, image: str): pass
32+
2533

2634
DEFAULT_BUILDER_NAME = "multiarch" # Default buildx builder name
2735

@@ -109,6 +117,25 @@ def check_if_image_exists(self, image_tag: str) -> bool:
109117
else:
110118
return True
111119

120+
def pull_image(self, image):
121+
docker_cmd = python_on_whales.docker
122+
try:
123+
docker_cmd.image.pull(image, quiet=True)
124+
except Exception as e:
125+
logger.error(f"Failed pulling image. {e}")
126+
raise e
127+
128+
def get_manfiest_list_digest(self, image) -> Optional[str]:
129+
self.pull_image(image)
130+
131+
docker_cmd = python_on_whales.docker
132+
try:
133+
manifest = docker_cmd.image.inspect(image)
134+
return manifest.id
135+
except Exception as e:
136+
logger.error(f"Failed inspecting the image to get manifest list digest. {e}")
137+
raise e
138+
112139
def build_image(self, tags: list[str],
113140
dockerfile: str,
114141
path: str,
@@ -167,6 +194,13 @@ def check_if_image_exists(self, image_tag: str) -> bool:
167194
f"PodmanImageBuilder does not support checking if image exists remotely. Skipping check for {image_tag}.")
168195
return False
169196

197+
def get_manfiest_list_digest(self, image) -> Optional[str]:
198+
logger.warning(f"PodmanImageBuilder does not support getting digest for manifest list, returning empty digest.")
199+
return ""
200+
201+
def pull_image(self, image: str):
202+
logger.warning("PodmanImageBuilder does not support pulling image right now.")
203+
170204
def build_image(self, tags: list[str],
171205
dockerfile: str,
172206
path: str,

scripts/release/release_info.py

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import json
33
import os
44

5+
from lib.base_logger import logger
56
from scripts.release.build.build_info import (
67
AGENT_IMAGE,
78
DATABASE_IMAGE,
@@ -16,12 +17,16 @@
1617
load_build_info,
1718
)
1819
from scripts.release.build.build_scenario import BuildScenario
20+
from scripts.release.build.image_build_process import (
21+
DockerImageBuilder,
22+
)
1923
from scripts.release.kubectl_mongodb.utils import (
2024
upload_assets_to_github_release,
2125
)
2226

2327
SEARCH_IMAGE = "search"
2428
SEARCH_IMAGE_REPOSITORY = "quay.io/mongodb/mongodb-search"
29+
AGENT_IMAGE_REPOSITORY = "quay.io/mongodb/mongodb-agent"
2530

2631
RELEASE_INFO_IMAGES_ORDERED = [
2732
OPERATOR_IMAGE, # mongodb-kubernetes
@@ -52,14 +57,14 @@ def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) -
5257
images = {name: build_info.images[name] for name in RELEASE_INFO_IMAGES_ORDERED}
5358

5459
for name, image in images.items():
55-
add_image_info(release_info_output, name, image.repositories, image.platforms, operator_version)
60+
add_image_info(release_info_output, name, image.repositories[0], image.platforms, operator_version)
5661

5762
# add OPS manager image info
5863
om_build_info = build_info.images[OPS_MANAGER_IMAGE]
5964
add_image_info(
6065
release_info_output,
6166
OPS_MANAGER_IMAGE,
62-
om_build_info.repositories,
67+
om_build_info.repositories[0],
6368
om_build_info.platforms,
6469
latest_om_version(release_data),
6570
)
@@ -69,7 +74,7 @@ def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) -
6974
add_image_info(
7075
release_info_output,
7176
AGENT_IMAGE,
72-
agent_build_info.repositories,
77+
AGENT_IMAGE_REPOSITORY,
7378
agent_build_info.platforms,
7479
latest_agent_version(release_data),
7580
)
@@ -79,7 +84,7 @@ def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) -
7984
add_image_info(
8085
release_info_output,
8186
UPGRADE_HOOK_IMAGE,
82-
upgradehook_build_info.repositories,
87+
upgradehook_build_info.repositories[0],
8388
upgradehook_build_info.platforms,
8489
latest_upgrade_hook_version(release_data),
8590
)
@@ -89,7 +94,7 @@ def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) -
8994
add_image_info(
9095
release_info_output,
9196
READINESS_PROBE_IMAGE,
92-
readiness_build_info.repositories,
97+
readiness_build_info.repositories[0],
9398
readiness_build_info.platforms,
9499
latest_readiness_version(release_data),
95100
)
@@ -108,8 +113,14 @@ def convert_to_release_info_json(build_info: BuildInfo, operator_version: str) -
108113
return release_info_output
109114

110115

111-
def add_image_info(release_info_output, name, repositories, platforms, version):
112-
release_info_output["images"][name] = {"repositories": repositories, "platforms": platforms, "version": version}
116+
def add_image_info(release_info_output, name, repository: str, platforms, version):
117+
digest = manifest_list_digest_for_image(f"{repository}:{version}")
118+
release_info_output["images"][name] = {
119+
"repoURL": repository,
120+
"platforms": platforms,
121+
"tag": version,
122+
"digest": digest,
123+
}
113124

114125

115126
def add_om_agent_mappings(release_data, output):
@@ -143,6 +154,19 @@ def latest_search_version(release_data):
143154
return release_data["search"]["version"]
144155

145156

157+
# manifest_list_digest_for_image returns manifest list digest for the passed image. Returns
158+
# empty string if there was an error figuring that out.
159+
def manifest_list_digest_for_image(image: str) -> str:
160+
builder = DockerImageBuilder()
161+
try:
162+
digest = builder.get_manfiest_list_digest(image)
163+
except Exception as e:
164+
logger.error(f"There was an error, figuring out manifest list digest for image {image}. Error: {e}")
165+
return ""
166+
167+
return digest
168+
169+
146170
if __name__ == "__main__":
147171
parser = argparse.ArgumentParser(
148172
description="Create relevant release artifacts information in JSON format.",

0 commit comments

Comments
 (0)