Three major improvements: 1. Rootless Docker refactor: Removes docker/binary modes, unifies to rootless Docker with per-runner system users. Each runner gets its own rootless Docker daemon, systemd user service, and isolated environment. Simplifies CLI (removes --mode option), Ansible role (single code path), and molecule scenarios (removes binary scenario). 2. Auto-merge fix: Fixes status check context mismatch in branch protection (was requiring "lint", "unit-tests", "molecule-tests" but actual contexts are "CI / quality", "CI / molecule-tests*"). Adds retry/wait logic to auto_merge.py that polls commit statuses for up to 15 minutes before attempting merge, eliminating the chicken-and-egg problem where auto-merge would fail because CI hadn't completed yet. 3. Molecule platform matrix: Adds OS platform matrix to CI — all 6 scenarios now run on all 4 supported OSes (ubuntu-2204, ubuntu-2404, debian-12, archlinux) = 24 test pairs distributed across 3 parallel runners. Updates distribute_molecule.py to distribute (scenario, platform) pairs. Updates Makefile with molecule-all target for local multi-platform testing. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
72 lines
1.8 KiB
Python
72 lines
1.8 KiB
Python
#!/usr/bin/env python3
|
|
"""Install checkmake if it is not already present.
|
|
|
|
Tries to install via Go if available, otherwise downloads the latest
|
|
pre-built Linux binary from the official GitHub releases.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import platform
|
|
import shutil
|
|
import subprocess # nosec B404
|
|
import urllib.request
|
|
from pathlib import Path
|
|
|
|
import click
|
|
|
|
CHECKMAKE_VERSION = "0.3.2"
|
|
RELEASE_URL_TEMPLATE = (
|
|
"https://github.com/checkmake/checkmake/releases/download/"
|
|
f"v{CHECKMAKE_VERSION}/checkmake-v{CHECKMAKE_VERSION}.linux.{{arch}}"
|
|
)
|
|
TARGET_PATH = Path("/usr/local/bin/checkmake")
|
|
|
|
|
|
def _arch() -> str:
|
|
"""Return the architecture string used by checkmake releases."""
|
|
machine = platform.machine().lower()
|
|
if machine in {"x86_64", "amd64"}:
|
|
return "amd64"
|
|
if machine in {"aarch64", "arm64"}:
|
|
return "arm64"
|
|
raise click.ClickException(
|
|
f"Unsupported architecture: {machine}"
|
|
)
|
|
|
|
|
|
def _install_with_go() -> bool:
|
|
"""Install checkmake using go install if Go is available."""
|
|
go_bin = shutil.which("go")
|
|
if go_bin is None:
|
|
return False
|
|
subprocess.run( # nosec B603
|
|
[
|
|
go_bin,
|
|
"install",
|
|
"github.com/checkmake/checkmake/cmd/checkmake@latest",
|
|
],
|
|
check=True,
|
|
)
|
|
return True
|
|
|
|
|
|
def _download_binary() -> None:
|
|
"""Download the prebuilt checkmake binary for the current architecture."""
|
|
url = RELEASE_URL_TEMPLATE.format(arch=_arch())
|
|
urllib.request.urlretrieve(url, TARGET_PATH) # nosec B310
|
|
TARGET_PATH.chmod(0o755)
|
|
|
|
|
|
def main() -> None:
|
|
"""Install checkmake if not already present."""
|
|
if shutil.which("checkmake") is not None:
|
|
return
|
|
|
|
if not _install_with_go():
|
|
_download_binary()
|
|
|
|
|
|
if __name__ == "__main__": # pragma: no cover
|
|
main() # pragma: no cover
|