Files
ansible-role-remote_users_fact/ci/build_matrix.py
T
fzarifian 54287ad9a0
CI / lint (push) Failing after 1m53s
CI / matrix (push) Failing after 12s
CI / test (push) Has been skipped
feat(ci): add multi-platform CI testing via Docker
Add CI infrastructure that tests the Ansible role on every distro
declared in meta/main.yml (EL 8/9, Debian bullseye/bookworm,
Ubuntu focal/jammy/noble) using Docker containers.

- ci/build_matrix.py: parse meta/main.yml platforms into JSON matrix
- ci/test_playbook.yml: test playbook (state=present + validate)
- ci/Dockerfile.el, ci/Dockerfile.debian: per-family Docker images
- Makefile: orchestrator (make test, make test-<slug>, make lint)
- .gitea/workflows/ci.yml: Gitea Actions with dynamic matrix
- .gitlab-ci.yml: GitLab CI pipeline
- Jenkinsfile: Jenkins pipeline with parallel stages
- .yamllint.yml: linter configuration
- .dockerignore: exclude .git and CI configs from Docker context
2026-04-14 00:17:42 +02:00

57 lines
1.7 KiB
Python

#!/usr/bin/env python3
"""Parse meta/main.yml platforms and output a Docker test matrix as JSON."""
import json
import sys
from pathlib import Path
try:
import yaml
except ImportError:
print("ERROR: PyYAML is required. Install with: pip install pyyaml", file=sys.stderr)
sys.exit(1)
# Mapping Galaxy platform name -> Docker image prefix
PLATFORM_IMAGE_MAP = {
"EL": "rockylinux",
"Debian": "debian",
"Ubuntu": "ubuntu",
}
def build_matrix(meta_path: str = "roles/remote_users_fact/meta/main.yml") -> list[dict]:
meta_file = Path(meta_path)
if not meta_file.exists():
print(f"ERROR: {meta_file} not found", file=sys.stderr)
sys.exit(1)
with open(meta_file) as f:
meta = yaml.safe_load(f)
platforms = meta.get("galaxy_info", {}).get("platforms", [])
if not platforms:
print("ERROR: No platforms found in meta/main.yml", file=sys.stderr)
sys.exit(1)
matrix = []
for platform in platforms:
name = platform["name"]
if name not in PLATFORM_IMAGE_MAP:
print(f"ERROR: Unknown platform '{name}'. Known: {list(PLATFORM_IMAGE_MAP.keys())}", file=sys.stderr)
sys.exit(1)
image_prefix = PLATFORM_IMAGE_MAP[name]
for version in platform.get("versions", []):
version_str = str(version)
slug = f"{name.lower()}{version_str}" if name == "EL" else f"{name.lower()}-{version_str}"
matrix.append({
"slug": slug,
"image": f"{image_prefix}:{version_str}",
"platform": name,
"version": version_str,
})
return matrix
if __name__ == "__main__":
print(json.dumps(build_matrix(), indent=2))