Skip to content

Commit cce9dd1

Browse files
authored
CLOUDP-295785 - add skip_if_exists flag to all releasable images (#528)
# Summary This PR configures all image release tasks to first check if image already exists and prevent overriding them. ## Proof of Work `skip_if_exists` is already configured for `version-upgrade-hook` and `readiness-probe` tasks and works. I've also added possibility to add `skip_if_exists` through `pipeline.py` args and tested it: >scripts/dev/run_python.sh scripts/release/pipeline.py agent --build-scenario patch --current-agents --skip-if-exists=True >... >Build configuration: ImageBuildConfiguration(scenario=<BuildScenario.PATCH: 'patch'>, version=None, latest_tag=False, olm_tag=False, registries=['268558157000.dkr.ecr.us-east-1.amazonaws.com/dev/mongodb-agent'], dockerfile_path='docker/mongodb-agent/Dockerfile', platforms=['linux/amd64'], sign=False, **skip_if_exists=True**, parallel=False, parallel_factor=0, all_agents=False, currently_used_agents=True) ## Checklist - [ ] Have you linked a jira ticket and/or is the ticket in the title? - [ ] Have you checked whether your jira ticket required DOCSP changes? - [ ] Have you added changelog file? - use `skip-changelog` label if not needed - refer to [Changelog files and Release Notes](https://github.com/mongodb/mongodb-kubernetes/blob/master/CONTRIBUTING.md#changelog-files-and-release-notes) section in CONTRIBUTING.md for more details
1 parent 2bb5e3c commit cce9dd1

File tree

5 files changed

+44
-18
lines changed

5 files changed

+44
-18
lines changed

build_info.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"release": {
2222
"sign": true,
2323
"olm-tag": true,
24+
"skip-if-exists": true,
2425
"repositories": ["quay.io/mongodb/mongodb-kubernetes"],
2526
"platforms": [
2627
"linux/arm64",
@@ -68,6 +69,7 @@
6869
"release": {
6970
"sign": true,
7071
"olm-tag": true,
72+
"skip-if-exists": true,
7173
"repositories": ["quay.io/mongodb/mongodb-kubernetes-init-database"],
7274
"platforms": [
7375
"linux/arm64",
@@ -99,6 +101,7 @@
99101
"release": {
100102
"sign": true,
101103
"olm-tag": true,
104+
"skip-if-exists": true,
102105
"repositories": ["quay.io/mongodb/mongodb-kubernetes-init-appdb"],
103106
"platforms": [
104107
"linux/arm64",
@@ -127,6 +130,7 @@
127130
"release": {
128131
"sign": true,
129132
"olm-tag": true,
133+
"skip-if-exists": true,
130134
"repositories": ["quay.io/mongodb/mongodb-kubernetes-init-ops-manager"],
131135
"platforms": [
132136
"linux/amd64"
@@ -155,6 +159,7 @@
155159
"release": {
156160
"sign": true,
157161
"olm-tag": true,
162+
"skip-if-exists": true,
158163
"repositories": ["quay.io/mongodb/mongodb-kubernetes-database"],
159164
"platforms": [
160165
"linux/arm64",
@@ -180,6 +185,7 @@
180185
]
181186
},
182187
"release": {
188+
"skip-if-exists": true,
183189
"repositories": ["quay.io/mongodb/mongodb-kubernetes-tests"],
184190
"platforms": [
185191
"linux/amd64"
@@ -280,6 +286,7 @@
280286
"manual_release": {
281287
"sign": true,
282288
"olm-tag": true,
289+
"skip-if-exists": true,
283290
"repositories": ["quay.io/mongodb/mongodb-agent-ubi", "quay.io/mongodb/mongodb-agent"],
284291
"platforms": [
285292
"linux/arm64",
@@ -307,6 +314,7 @@
307314
"manual_release": {
308315
"sign": true,
309316
"olm-tag": true,
317+
"skip-if-exists": true,
310318
"repositories": ["quay.io/mongodb/mongodb-enterprise-ops-manager-ubi"],
311319
"platforms": [
312320
"linux/amd64"

scripts/release/argparse_utils.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import argparse
2+
3+
4+
def str2bool(v):
5+
if isinstance(v, bool):
6+
return v
7+
if v.lower() in ("yes", "true", "t", "y", "1"):
8+
return True
9+
elif v.lower() in ("no", "false", "f", "n", "0"):
10+
return False
11+
else:
12+
raise argparse.ArgumentTypeError("Boolean value expected.")

scripts/release/check_changelog.py

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,10 @@
33

44
from git import Repo
55

6+
from scripts.release.argparse_utils import str2bool
67
from scripts.release.changelog import get_changelog_entries
78
from scripts.release.constants import DEFAULT_CHANGELOG_PATH, DEFAULT_REPOSITORY_PATH
89

9-
10-
def str2bool(v):
11-
if isinstance(v, bool):
12-
return v
13-
if v.lower() in ("yes", "true", "t", "y", "1"):
14-
return True
15-
elif v.lower() in ("no", "false", "f", "n", "0"):
16-
return False
17-
else:
18-
raise argparse.ArgumentTypeError("Boolean value expected.")
19-
20-
2110
if __name__ == "__main__":
2211
parser = argparse.ArgumentParser(
2312
description="Check if there are changelog entries",

scripts/release/pipeline.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from opentelemetry.trace import NonRecordingSpan, SpanContext, TraceFlags
1717

1818
from lib.base_logger import logger
19+
from scripts.release.argparse_utils import str2bool
1920
from scripts.release.atomic_pipeline import (
2021
build_agent,
2122
build_database_image,
@@ -100,25 +101,25 @@ def image_build_config_from_args(args) -> ImageBuildConfiguration:
100101

101102
build_scenario = get_scenario_from_arg(args.build_scenario)
102103
build_info = load_build_info(build_scenario)
103-
logger.info(f"image is {image}")
104-
logger.info(f"images are {build_info.images}")
104+
logger.debug(f"image is {image}")
105+
logger.debug(f"images are {build_info.images}")
105106
image_build_info = build_info.images.get(image)
106-
logger.info(f"image_build_info is {image_build_info}")
107+
logger.debug(f"image_build_info is {image_build_info}")
107108
if not image_build_info:
108109
raise ValueError(f"Image '{image}' is not defined in the build info for scenario '{build_scenario}'")
109110

110111
# Resolve final values with overrides
111112
version = args.version
113+
dockerfile_path = image_build_info.dockerfile_path
112114
latest_tag = image_build_info.latest_tag
113115
olm_tag = image_build_info.olm_tag
114116
if args.registry:
115117
registries = [args.registry]
116118
else:
117119
registries = image_build_info.repositories
118120
platforms = get_platforms_from_arg(args.platform) or image_build_info.platforms
119-
sign = args.sign or image_build_info.sign
120-
dockerfile_path = image_build_info.dockerfile_path
121-
skip_if_exists = image_build_info.skip_if_exists
121+
sign = args.sign if args.sign is not None else image_build_info.sign
122+
skip_if_exists = args.skip_if_exists if args.skip_if_exists is not None else image_build_info.skip_if_exists
122123

123124
# Validate version - only agent can have None version as the versions are managed by the agent
124125
# which are externally retrieved from release.json
@@ -250,6 +251,14 @@ def main():
250251
action="store_true",
251252
help="If set force image signing. Default is to infer from build scenario.",
252253
)
254+
parser.add_argument(
255+
"--skip-if-exists",
256+
metavar="",
257+
action="store",
258+
type=str2bool,
259+
nargs="?",
260+
help="Override skip_if_exists behavior instead of resolving from build scenario",
261+
)
253262
# For agent builds
254263
parser.add_argument(
255264
"--parallel",

scripts/release/tests/build_info_test.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,41 +290,47 @@ def test_load_build_info_release():
290290
repositories=["quay.io/mongodb/mongodb-kubernetes"],
291291
platforms=["linux/arm64", "linux/amd64", "linux/s390x", "linux/ppc64le"],
292292
dockerfile_path="docker/mongodb-kubernetes-operator/Dockerfile",
293+
skip_if_exists=True,
293294
olm_tag=True,
294295
sign=True,
295296
),
296297
"init-database": ImageInfo(
297298
repositories=["quay.io/mongodb/mongodb-kubernetes-init-database"],
298299
platforms=["linux/arm64", "linux/amd64", "linux/s390x", "linux/ppc64le"],
299300
dockerfile_path="docker/mongodb-kubernetes-init-database/Dockerfile",
301+
skip_if_exists=True,
300302
olm_tag=True,
301303
sign=True,
302304
),
303305
"init-appdb": ImageInfo(
304306
repositories=["quay.io/mongodb/mongodb-kubernetes-init-appdb"],
305307
platforms=["linux/arm64", "linux/amd64", "linux/s390x", "linux/ppc64le"],
306308
dockerfile_path="docker/mongodb-kubernetes-init-appdb/Dockerfile",
309+
skip_if_exists=True,
307310
olm_tag=True,
308311
sign=True,
309312
),
310313
"init-ops-manager": ImageInfo(
311314
repositories=["quay.io/mongodb/mongodb-kubernetes-init-ops-manager"],
312315
platforms=["linux/amd64"],
313316
dockerfile_path="docker/mongodb-kubernetes-init-ops-manager/Dockerfile",
317+
skip_if_exists=True,
314318
olm_tag=True,
315319
sign=True,
316320
),
317321
"database": ImageInfo(
318322
repositories=["quay.io/mongodb/mongodb-kubernetes-database"],
319323
platforms=["linux/arm64", "linux/amd64", "linux/s390x", "linux/ppc64le"],
320324
dockerfile_path="docker/mongodb-kubernetes-database/Dockerfile",
325+
skip_if_exists=True,
321326
olm_tag=True,
322327
sign=True,
323328
),
324329
"meko-tests": ImageInfo(
325330
repositories=["quay.io/mongodb/mongodb-kubernetes-tests"],
326331
platforms=["linux/amd64"],
327332
dockerfile_path="docker/mongodb-kubernetes-tests/Dockerfile",
333+
skip_if_exists=True,
328334
),
329335
"readiness-probe": ImageInfo(
330336
repositories=["quay.io/mongodb/mongodb-kubernetes-readinessprobe"],
@@ -370,13 +376,15 @@ def test_load_build_info_manual_release():
370376
repositories=["quay.io/mongodb/mongodb-agent-ubi", "quay.io/mongodb/mongodb-agent"],
371377
platforms=["linux/arm64", "linux/amd64", "linux/s390x", "linux/ppc64le"],
372378
dockerfile_path="docker/mongodb-agent/Dockerfile",
379+
skip_if_exists=True,
373380
olm_tag=True,
374381
sign=True,
375382
),
376383
"ops-manager": ImageInfo(
377384
repositories=["quay.io/mongodb/mongodb-enterprise-ops-manager-ubi"],
378385
platforms=["linux/amd64"],
379386
dockerfile_path="docker/mongodb-enterprise-ops-manager/Dockerfile",
387+
skip_if_exists=True,
380388
olm_tag=True,
381389
sign=True,
382390
),

0 commit comments

Comments
 (0)