diff --git a/.github/workflows/ssh-debug.yml b/.github/workflows/ssh-debug.yml index 212e31c3e57..2decf646fe6 100644 --- a/.github/workflows/ssh-debug.yml +++ b/.github/workflows/ssh-debug.yml @@ -30,6 +30,20 @@ jobs: environment: ci steps: + - name: Set up Python 3.10 + uses: actions/setup-python@v5 + with: + python-version: 3.10 + + - name: Setup Python Tools Scripts + uses: ./.github/actions/setup-python-tools-scripts + + - name: Install Nox + run: | + python3 -m pip install 'nox==2022.8.7' + env: + PIP_INDEX_URL: https://pypi.org/simple + - name: Checkout Source Code uses: actions/checkout@v4 diff --git a/tools/__init__.py b/tools/__init__.py index af50a06ef47..9fc43adbf12 100644 --- a/tools/__init__.py +++ b/tools/__init__.py @@ -31,6 +31,7 @@ RELEASE_VENV_CONFIG = VirtualEnvPipConfig( ptscripts.set_default_config(DEFAULT_REQS_CONFIG) ptscripts.register_tools_module("tools.changelog") ptscripts.register_tools_module("tools.ci") +ptscripts.register_tools_module("tools.container") ptscripts.register_tools_module("tools.docs") ptscripts.register_tools_module("tools.gh") ptscripts.register_tools_module("tools.pkg") diff --git a/tools/container.py b/tools/container.py new file mode 100644 index 00000000000..8fbef761d62 --- /dev/null +++ b/tools/container.py @@ -0,0 +1,106 @@ +import os + +from ptscripts import Context, command_group + +cmd = command_group(name="container", help="Container Commands", description=__doc__) + + +def has_network(ctx, name): + p = ctx.run("docker", "network", "ls", capture=True) + return name in p.stdout.decode() + + +def create_network(ctx, name): + p = ctx.run( + "docker", + "network", + "create", + "-o", + "com.docker.network.driver.mtu=1500", + "--ipv6", + "--subnet", + "2001:db8::/64", + name, + ) + if p.returncode != 0: + raise RuntimeError(f"docker network create returned {p.returncode}") + + +@cmd.command( + name="create", + arguments={ + "image": {"help": "Name the container image to use."}, + "name": {"help": "Name the container being created.", "default": ""}, + }, +) +def create(ctx: Context, image: str, name: str = ""): + onci = "GITHUB_WORKFLOW" in os.environ + workdir = "/salt" + home = "/root" + network = "ip6net" + if not has_network(ctx, network): + ctx.info(f"Creating docker network: {network}") + create_network(ctx, network) + if onci: + workdir = "/__w/salt/salt" + home = "/github/home" + env = { + "HOME": home, + "SKIP_REQUIREMENTS_INSTALL": "1", + "PRINT_TEST_SELECTION": "0", + "PRINT_TEST_PLAN_ONLY": "0", + "PRINT_SYSTEM_INFO": "0", + "RERUN_FEAILURES": "0", + "SKIP_INITIAL_ONEDIR_FAILURES": "1", + "SKIP_INITIAL_GH_ACTIONS_FAILURES": "1", + "RAISE_DEPRECATIONS_RUNTIME_ERRORS": "1", + "LANG": "en_US.UTF-8", + "SHELL": "/bin/bash", + } + for var in [ + "PIP_INDEX_URL", + "PIP_EXTRA_INDEX_URL", + "PIP_TRUSTED_HOST", + "PIP_DISABLE_PIP_VERSION_CHECK", + "SALT_TRANSPORT", + # Are both of these really needed? + "GITHUB_ACTIONS", + "GITHUB_ACTIONS_PIPELINE", + "CI", + "SKIP_CODE_COVERAGE", + "COVERAGE_CONTEXT", + "RERUN_FEAILURES", + ]: + if var in os.environ: + env[var] = os.environ[var] + cmd = [ + "/usr/bin/docker", + "create", + "--privileged", + # "--ulimit", + # "\"nofile=262144:262144\"", + f"--workdir={workdir}", + "-v", + "/tmp/:/var/lib/docker", + ] + for key in env: + cmd.extend(["-e", f"{key}={env[key]}"]) + if onci: + cmd.extend(["-v", "/home/runner/work:/__w"]) + else: + cmd.extend(["-v", f"{os.getcwd()}:/salt"]) + if name: + cmd.extend(["--name", name]) + cmd.extend( + [ + "--entrypoint", + "/usr/lib/systemd/systemd", + image, + "--systemd", + "--unit", + "rescue.target", + ], + ) + ret = ctx.run(*cmd, capture=True, check=False) + if ret.returncode != 0: + ctx.warn(ret.stderr.decode())