This repository has been archived on 2026-11-08. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
platform-ci/tests/test_docker_environment.py
forge-recoveryandClaude Sonnet 5.5 84c6f19438
KofTwentyTwo/ci-policy: ci / fork-guard (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / go-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / go-nix-1 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / gradle-2 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / gradle-3 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / java-docker-4 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / java-maven-5 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / manifests-6 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / nix-7 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / node-8 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / python-9 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / rust-10 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / rust-11 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / rust-12 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / source-config-13 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / source-config-14 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-1 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-2 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-3 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-4 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-5 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-6 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / image-build-7 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / not-enrolled (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / content-validate-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / standards-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / node-matrix-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: ci / source-config-15 (pull_request) Blocked by required conditions
KofTwentyTwo/ci-policy: Shared source and config CI / verify (pull_request) Blocked by required conditions
KofTwentyTwo/ci-policy: Shared source and config CI / secrets (pull_request) Blocked by required conditions
KofTwentyTwo/ci-policy: Shared source and config CI / gate (pull_request) Waiting for needed jobs
KofTwentyTwo/ci-policy: ci / ci-result (pull_request) Waiting for needed jobs
KofTwentyTwo/ci-policy: native / fork-deny (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-macos-0 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-macos-1 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-macos-2 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-macos-3 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-windows-4 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-windows-5 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-windows-6 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / build-windows-7 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / dotnet-8 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / dotnet-9 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / dotnet-10 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / dotnet-11 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-12 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-13 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-14 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-15 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-16 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-17 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-18 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / swift-19 (pull_request) Skipped
KofTwentyTwo/ci-policy: native / native-result (pull_request) Canceled after 4s
feat(ci): advance shared pipeline capabilities
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-05 05:03:47 +00:00

78 lines
4.3 KiB
Python

"""The docker profile's fixed pool contract reaches the build process, and only for targets that require docker."""
import tempfile
import unittest
from collections.abc import Mapping, Sequence
from pathlib import Path
from typing import Any, cast
from platform_ci.build_tools import DOCKER_PROFILE_ENVIRONMENT
from platform_ci.execution import run_target_commands
from tests.test_pool_jobs import DOCKER_VARIABLES, JOBS
from tests.test_pool_jobs import _plan as pool_plan # pyright: ignore[reportPrivateUsage]
RELEASE_CREDENTIALS = {"GITEA_TOKEN": "x", "ACTIONS_RUNTIME_TOKEN": "x", "ACTIONS_ID_TOKEN_REQUEST_TOKEN": "x", "CI_RELEASE_TOKEN": "x", "MANAGER_PULL_AUTH": "x"}
def _environment_seen_by_build(profiles: Sequence[str], parent_extra: Mapping[str, str] | None = None) -> dict[str, str]:
"""Plan a Maven component with the profiles, run its commands with a recording runner and return the environment the build process received."""
(target,) = pool_plan(*profiles)["targets"]
seen: list[dict[str, str]] = []
def runner(_command: Sequence[str], _directory: Path, environment: Mapping[str, str]) -> int:
seen.append(dict(environment))
return 0
with tempfile.TemporaryDirectory() as directory:
source = Path(directory)
(source / "module").mkdir()
home = source / "home"
home.mkdir()
parent = {"HOME": str(home), "PATH": "/usr/bin", **RELEASE_CREDENTIALS, **(parent_extra or {})}
self_target = cast("Any", dict(target) | {"directory": "."})
self_target["commands"] = [["true"]]
self_target["build_tool"] = "maven"
assert run_target_commands(self_target, source, runner, parent)
return seen[0]
class DockerEnvironmentTest(unittest.TestCase):
"""Planned environment, allow-list filtering and the shared workflow job agree."""
def test_docker_targets_plan_and_receive_exactly_the_fixed_contract(self) -> None:
for profiles in (("docker",), ("browser", "docker")):
with self.subTest(profiles):
(target,) = pool_plan(*profiles)["targets"]
self.assertEqual({key: target["environment"][key] for key in DOCKER_VARIABLES}, dict(DOCKER_PROFILE_ENVIRONMENT))
received = _environment_seen_by_build(profiles)
self.assertEqual({key: received[key] for key in DOCKER_VARIABLES}, {"DOCKER_HOST": "unix:///run/test-docker.sock", "TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE": "/run/user/1002/docker.sock", "TESTCONTAINERS_HOST_OVERRIDE": "172.17.0.1"})
def test_plain_and_browser_only_targets_get_no_docker_variable(self) -> None:
for profiles in ((), ("browser",)):
with self.subTest(profiles):
(target,) = pool_plan(*profiles)["targets"]
self.assertTrue(set(DOCKER_VARIABLES).isdisjoint(target["environment"]))
self.assertTrue(set(DOCKER_VARIABLES).isdisjoint(_environment_seen_by_build(profiles)))
def test_the_runner_cannot_inject_docker_variables_into_a_target_that_does_not_require_docker(self) -> None:
injected = {"DOCKER_HOST": "unix:///var/run/docker.sock", "TESTCONTAINERS_HOST_OVERRIDE": "10.0.0.1", "DOCKER_CONFIG": "/root/.docker"}
for profiles in ((), ("browser",)):
with self.subTest(profiles):
self.assertTrue(set(injected).isdisjoint(_environment_seen_by_build(profiles, injected)))
def test_a_runner_value_never_overrides_the_planned_docker_contract(self) -> None:
received = _environment_seen_by_build(("docker",), {"DOCKER_HOST": "unix:///var/run/docker.sock", "DOCKER_CONFIG": "/root/.docker"})
self.assertEqual(received["DOCKER_HOST"], "unix:///run/test-docker.sock")
self.assertNotIn("DOCKER_CONFIG", received)
def test_release_and_manager_credentials_stay_filtered_for_every_profile(self) -> None:
for profiles in ((), ("browser",), ("docker",), ("browser", "docker")):
with self.subTest(profiles):
self.assertTrue(set(RELEASE_CREDENTIALS).isdisjoint(_environment_seen_by_build(profiles)))
def test_the_plan_contract_equals_what_the_shared_docker_pool_job_sets(self) -> None:
job_environment = JOBS["verify-pool-docker"]["env"]
self.assertEqual({key: job_environment[key] for key in DOCKER_VARIABLES}, dict(DOCKER_PROFILE_ENVIRONMENT))
self.assertTrue(set(DOCKER_VARIABLES).isdisjoint(JOBS["verify-pool"]["env"]))
self.assertTrue(set(DOCKER_VARIABLES).isdisjoint(JOBS["verify"].get("env", {})))