|
3 | 3 | # Distributed under the MIT software license, see the accompanying |
4 | 4 | # file COPYING or https://opensource.org/license/mit/. |
5 | 5 |
|
| 6 | +from pathlib import Path |
6 | 7 | import os |
7 | 8 | import shlex |
8 | 9 | import subprocess |
@@ -71,6 +72,79 @@ def main(): |
71 | 72 | time.sleep(3) |
72 | 73 | run(cmd_build) |
73 | 74 |
|
| 75 | + for suffix in ["ccache", "depends", "depends_sources", "previous_releases"]: |
| 76 | + run(["docker", "volume", "create", f"{os.environ['CONTAINER_NAME']}_{suffix}"], check=False) |
| 77 | + |
| 78 | + CI_CCACHE_MOUNT = f"type=volume,src={os.environ['CONTAINER_NAME']}_ccache,dst={os.environ['CCACHE_DIR']}" |
| 79 | + CI_DEPENDS_MOUNT = f"type=volume,src={os.environ['CONTAINER_NAME']}_depends,dst={os.environ['DEPENDS_DIR']}/built" |
| 80 | + CI_DEPENDS_SOURCES_MOUNT = f"type=volume,src={os.environ['CONTAINER_NAME']}_depends_sources,dst={os.environ['DEPENDS_DIR']}/sources" |
| 81 | + CI_PREVIOUS_RELEASES_MOUNT = f"type=volume,src={os.environ['CONTAINER_NAME']}_previous_releases,dst={os.environ['PREVIOUS_RELEASES_DIR']}" |
| 82 | + CI_BUILD_MOUNT = [] |
| 83 | + |
| 84 | + if os.getenv("DANGER_CI_ON_HOST_FOLDERS"): |
| 85 | + # ensure the directories exist |
| 86 | + for create_dir in [ |
| 87 | + os.environ["CCACHE_DIR"], |
| 88 | + f"{os.environ['DEPENDS_DIR']}/built", |
| 89 | + f"{os.environ['DEPENDS_DIR']}/sources", |
| 90 | + os.environ["PREVIOUS_RELEASES_DIR"], |
| 91 | + os.environ["BASE_BUILD_DIR"], # Unset by default, must be defined externally |
| 92 | + ]: |
| 93 | + Path(create_dir).mkdir(parents=True, exist_ok=True) |
| 94 | + |
| 95 | + CI_CCACHE_MOUNT = f"type=bind,src={os.environ['CCACHE_DIR']},dst={os.environ['CCACHE_DIR']}" |
| 96 | + CI_DEPENDS_MOUNT = f"type=bind,src={os.environ['DEPENDS_DIR']}/built,dst={os.environ['DEPENDS_DIR']}/built" |
| 97 | + CI_DEPENDS_SOURCES_MOUNT = f"type=bind,src={os.environ['DEPENDS_DIR']}/sources,dst={os.environ['DEPENDS_DIR']}/sources" |
| 98 | + CI_PREVIOUS_RELEASES_MOUNT = f"type=bind,src={os.environ['PREVIOUS_RELEASES_DIR']},dst={os.environ['PREVIOUS_RELEASES_DIR']}" |
| 99 | + CI_BUILD_MOUNT = [f"--mount=type=bind,src={os.environ['BASE_BUILD_DIR']},dst={os.environ['BASE_BUILD_DIR']}"] |
| 100 | + |
| 101 | + if os.getenv("DANGER_CI_ON_HOST_CCACHE_FOLDER"): |
| 102 | + if not os.path.isdir(os.environ["CCACHE_DIR"]): |
| 103 | + print(f"Error: Directory '{os.environ['CCACHE_DIR']}' must be created in advance.") |
| 104 | + sys.exit(1) |
| 105 | + CI_CCACHE_MOUNT = f"type=bind,src={os.environ['CCACHE_DIR']},dst={os.environ['CCACHE_DIR']}" |
| 106 | + |
| 107 | + run(["docker", "network", "create", "--ipv6", "--subnet", "1111:1111::/112", "ci-ip6net"], check=False) |
| 108 | + |
| 109 | + if os.getenv("RESTART_CI_DOCKER_BEFORE_RUN"): |
| 110 | + print("Restart docker before run to stop and clear all containers started with --rm") |
| 111 | + run(["podman", "container", "rm", "--force", "--all"]) # Similar to "systemctl restart docker" |
| 112 | + |
| 113 | + # Still prune everything in case the filtered pruning doesn't work, or if labels were not set |
| 114 | + # on a previous run. Belt and suspenders approach, should be fine to remove in the future. |
| 115 | + # Prune images used by --external containers (e.g. build containers) when |
| 116 | + # using podman. |
| 117 | + print("Prune all dangling images") |
| 118 | + run(["podman", "image", "prune", "--force", "--external"]) |
| 119 | + |
| 120 | + print(f"Prune all dangling {CI_IMAGE_LABEL} images") |
| 121 | + # When detecting podman-docker, `--external` should be added. |
| 122 | + run(["docker", "image", "prune", "--force", "--filter", f"label={CI_IMAGE_LABEL}"]) |
| 123 | + |
| 124 | + cmd_run = ["docker", "run", "--rm", "--interactive", "--detach", "--tty"] |
| 125 | + cmd_run += [ |
| 126 | + "--cap-add=LINUX_IMMUTABLE", |
| 127 | + *shlex.split(os.getenv("CI_CONTAINER_CAP", "")), |
| 128 | + f"--mount=type=bind,src={os.environ['BASE_READ_ONLY_DIR']},dst={os.environ['BASE_READ_ONLY_DIR']},readonly", |
| 129 | + f"--mount={CI_CCACHE_MOUNT}", |
| 130 | + f"--mount={CI_DEPENDS_MOUNT}", |
| 131 | + f"--mount={CI_DEPENDS_SOURCES_MOUNT}", |
| 132 | + f"--mount={CI_PREVIOUS_RELEASES_MOUNT}", |
| 133 | + *CI_BUILD_MOUNT, |
| 134 | + f"--env-file={env_file}", |
| 135 | + f"--name={os.environ['CONTAINER_NAME']}", |
| 136 | + "--network=ci-ip6net", |
| 137 | + f"--platform={os.environ['CI_IMAGE_PLATFORM']}", |
| 138 | + os.environ["CONTAINER_NAME"], |
| 139 | + ] |
| 140 | + |
| 141 | + container_id = run( |
| 142 | + cmd_run, |
| 143 | + stdout=subprocess.PIPE, |
| 144 | + text=True, |
| 145 | + ).stdout.strip() |
| 146 | + os.environ["CI_CONTAINER_ID"] = container_id |
| 147 | + |
74 | 148 | run(["./ci/test/02_run_container.sh"]) # run the remainder |
75 | 149 |
|
76 | 150 |
|
|
0 commit comments