diff --git a/.evergreen-functions.yml b/.evergreen-functions.yml index 1abd6b451..48bd65806 100644 --- a/.evergreen-functions.yml +++ b/.evergreen-functions.yml @@ -524,7 +524,7 @@ functions: shell: bash <<: *e2e_include_expansions_in_env working_dir: src/github.com/mongodb/mongodb-kubernetes - binary: scripts/dev/run_python.sh scripts/release/pipeline_main.py --parallel ${image_name} ${all_agents} + binary: scripts/dev/run_python.sh scripts/release/pipeline_main.py --parallel ${image_name} ${all_agents} ${build_scenario} # TODO: CLOUDP-335471 ; once all image builds are made with the new atomic pipeline, remove the following function legacy_pipeline: diff --git a/.evergreen.yml b/.evergreen.yml index beadaa6c8..739f3e9fa 100644 --- a/.evergreen.yml +++ b/.evergreen.yml @@ -356,9 +356,10 @@ tasks: - func: setup_building_host - func: quay_login - func: setup_docker_sbom - - func: legacy_pipeline + - func: pipeline vars: image_name: agent + build_scenario: --build-scenario manual_release - name: run_precommit_and_push tags: ["patch-run"] @@ -543,10 +544,10 @@ tasks: - func: setup_building_host - func: quay_login - func: setup_docker_sbom - - func: legacy_pipeline + - func: pipeline vars: image_name: ops-manager - include_tags: release + build_scenario: --build-scenario manual_release - name: prepare_and_upload_openshift_bundles_for_e2e commands: diff --git a/build_info.json b/build_info.json index 286667428..cba13e6df 100644 --- a/build_info.json +++ b/build_info.json @@ -240,7 +240,7 @@ "linux/amd64" ] }, - "release": { + "manual_release": { "sign": true, "repository": "quay.io/mongodb/mongodb-agent-ubi", "platforms": [ @@ -266,8 +266,7 @@ "linux/amd64" ] }, - "release": { - "version": "om-version-from-release.json", + "manual_release": { "sign": true, "repository": "quay.io/mongodb/mongodb-enterprise-ops-manager", "platforms": [ diff --git a/scripts/release/build/build_info.py b/scripts/release/build/build_info.py index 1c6557473..05a695159 100644 --- a/scripts/release/build/build_info.py +++ b/scripts/release/build/build_info.py @@ -80,6 +80,7 @@ def load_build_info( initial_version = get_initial_version() version = scenario.get_version(repository_path, changelog_sub_path, initial_commit_sha, initial_version) + # For manual_release, version can be None and will be set by image-specific logic with open("build_info.json", "r") as f: build_info = json.load(f) @@ -98,7 +99,7 @@ def load_build_info( # Only update the image_version if it is not already set in the build_info.json file image_version = scenario_data.get("version") - if not image_version: + if not image_version and version is not None: image_version = version images[name] = ImageInfo( diff --git a/scripts/release/build/build_scenario.py b/scripts/release/build/build_scenario.py index aba2d5708..2fb27e173 100644 --- a/scripts/release/build/build_scenario.py +++ b/scripts/release/build/build_scenario.py @@ -11,6 +11,7 @@ class BuildScenario(StrEnum): RELEASE = "release" # Official release triggered by a git tag + MANUAL_RELEASE = "manual_release" # Manual release, not part of operator release cycle PATCH = "patch" # CI build for a patch/pull request STAGING = "staging" # CI build from a merge to the master DEVELOPMENT = "development" # Local build on a developer machine @@ -58,5 +59,9 @@ def get_version(self, repository_path: str, changelog_sub_path: str, initial_com return repo.head.object.hexsha[:COMMIT_SHA_LENGTH] case BuildScenario.RELEASE: return calculate_next_version(repo, changelog_sub_path, initial_commit_sha, initial_version) + case BuildScenario.MANUAL_RELEASE: + # For manual releases, version must be provided externally (e.g., for ops-manager via om_version env var, + # for agent via release.json). Return None to indicate version will be set by image-specific logic. + return None raise ValueError(f"Unknown build scenario: {self}") diff --git a/scripts/release/pipeline_main.py b/scripts/release/pipeline_main.py index b5fe22d9d..d7958db09 100644 --- a/scripts/release/pipeline_main.py +++ b/scripts/release/pipeline_main.py @@ -114,6 +114,11 @@ def image_build_config_from_args(args) -> ImageBuildConfiguration: sign = args.sign or image_build_info.sign dockerfile_path = image_build_info.dockerfile_path + # Validate version - only ops-manager and agent can have None version as the versions are managed by the agent + # and om methods themselves, which are externally retrieved - om_version env var and release.json respectively + if version is None and image not in ["ops-manager", "agent"]: + raise ValueError(f"Version cannot be empty for {image}.") + return ImageBuildConfiguration( scenario=build_scenario, version=version, diff --git a/scripts/release/tests/build_info_test.py b/scripts/release/tests/build_info_test.py index bef97173d..32f3ecadb 100644 --- a/scripts/release/tests/build_info_test.py +++ b/scripts/release/tests/build_info_test.py @@ -408,20 +408,6 @@ def test_load_build_info_release( dockerfile_path="docker/mongodb-kubernetes-upgrade-hook/Dockerfile.atomic", sign=True, ), - "agent": ImageInfo( - repository="quay.io/mongodb/mongodb-agent-ubi", - platforms=["linux/arm64", "linux/amd64"], - version=version, - dockerfile_path="docker/mongodb-agent/Dockerfile.atomic", - sign=True, - ), - "ops-manager": ImageInfo( - repository="quay.io/mongodb/mongodb-enterprise-ops-manager", - platforms=["linux/amd64"], - version="om-version-from-release.json", - dockerfile_path="docker/mongodb-enterprise-ops-manager/Dockerfile.atomic", - sign=True, - ), }, binaries={ "kubectl-mongodb": BinaryInfo( @@ -443,3 +429,33 @@ def test_load_build_info_release( build_info = load_build_info(BuildScenario.RELEASE, git_repo.working_dir) assert build_info == expected_build_info + + +def test_load_build_info_manual_release(git_repo: Repo): + version = "1.2.0" + git_repo.git.checkout(version) + + expected_build_info = BuildInfo( + images={ + "agent": ImageInfo( + repository="quay.io/mongodb/mongodb-agent-ubi", + platforms=["linux/arm64", "linux/amd64"], + version=None, # Version is None for manual_release scenario + dockerfile_path="docker/mongodb-agent/Dockerfile.atomic", + sign=True, + ), + "ops-manager": ImageInfo( + repository="quay.io/mongodb/mongodb-enterprise-ops-manager", + platforms=["linux/amd64"], + version=None, # Version is None for manual_release scenario + dockerfile_path="docker/mongodb-enterprise-ops-manager/Dockerfile.atomic", + sign=True, + ), + }, + binaries={}, + helm_charts={}, + ) + + build_info = load_build_info(BuildScenario.MANUAL_RELEASE, git_repo.working_dir) + + assert build_info == expected_build_info