name: Validate Docker Compose on: push: branches: [main] paths: - "ods/docker-compose*.yml" - "ods/installers/**/*compose*.yml" - "ods/extensions/services/**/compose*.yaml" - "ods/scripts/resolve-compose-stack.sh" - ".github/workflows/validate-compose.yml" pull_request: branches: [main] paths: - "ods/docker-compose*.yml" - "ods/installers/**/*compose*.yml" - "ods/extensions/services/**/compose*.yaml" - "ods/scripts/resolve-compose-stack.sh" - ".github/workflows/validate-compose.yml" permissions: contents: read jobs: validate-compose: name: Validate Docker Compose files runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 - name: Validate main docker-compose.base.yml env: WEBUI_SECRET: ci-placeholder run: | echo "Validating ods/docker-compose.base.yml" docker compose -f ods/docker-compose.base.yml config --quiet - name: Validate installer compose overlays (base + overlay) env: WEBUI_SECRET: ci-placeholder run: | compose_files=$(find ods/installers -name '*compose*.yml' -type f 2>/dev/null || true) if [ -z "$compose_files" ]; then echo "No installer compose files found under ods/installers/" exit 0 fi echo "Found installer compose overlays:" echo "$compose_files" echo "" failed=0 for f in $compose_files; do echo "Validating $f (merged with docker-compose.base.yml) ..." if docker compose -f ods/docker-compose.base.yml -f "$f" config --quiet 2>&1; then echo " OK" else echo " FAILED" failed=1 fi done if [ "$failed" -ne 0 ]; then echo "" echo "One or more installer compose overlays failed validation." exit 1 fi echo "" echo "All installer compose overlays validated successfully." - name: Validate GPU overlay stacks (base + backend) env: WEBUI_SECRET: ci-placeholder SEARXNG_SECRET: ci-placeholder N8N_USER: ci@example.com N8N_PASS: ci-placeholder LITELLM_KEY: ci-placeholder OPENCLAW_TOKEN: ci-placeholder working-directory: ods run: | set -e failed=0 for overlay in docker-compose.nvidia.yml docker-compose.amd.yml docker-compose.apple.yml docker-compose.cpu.yml; do if [ ! -f "$overlay" ]; then echo "SKIP: $overlay not present" continue fi echo "Validating base + $overlay" if ! docker compose -f docker-compose.base.yml -f "$overlay" config --quiet; then echo " FAILED: base + $overlay" failed=1 fi done exit "$failed" - name: Validate multi-GPU overlay stacks env: WEBUI_SECRET: ci-placeholder SEARXNG_SECRET: ci-placeholder N8N_USER: ci@example.com N8N_PASS: ci-placeholder LITELLM_KEY: ci-placeholder OPENCLAW_TOKEN: ci-placeholder GPU_COUNT: "2" LLAMA_SERVER_GPU_INDICES: "0,1" LLAMA_SERVER_GPU_UUIDS: "GPU-ci-a,GPU-ci-b" LLAMA_ARG_SPLIT_MODE: "layer" LLAMA_ARG_TENSOR_SPLIT: "" working-directory: ods run: | set -e failed=0 # NVIDIA multi-GPU if [ -f docker-compose.multigpu-nvidia.yml ]; then echo "Validating base + nvidia + multigpu-nvidia" docker compose -f docker-compose.base.yml \ -f docker-compose.nvidia.yml \ -f docker-compose.multigpu-nvidia.yml \ config --quiet || failed=1 fi # AMD multi-GPU if [ -f docker-compose.multigpu-amd.yml ]; then echo "Validating base + amd + multigpu-amd" docker compose -f docker-compose.base.yml \ -f docker-compose.amd.yml \ -f docker-compose.multigpu-amd.yml \ config --quiet || failed=1 fi exit "$failed" - name: Validate resolver output for AMD multi-GPU working-directory: ods run: | set -e flags=$(bash scripts/resolve-compose-stack.sh \ --script-dir "$PWD" \ --tier "3" \ --gpu-backend amd \ --gpu-count 2) echo "Resolver produced: $flags" case "$flags" in *docker-compose.multigpu-amd.yml*) echo "OK: multigpu-amd overlay resolved" ;; *) echo "FAIL: resolver did not include docker-compose.multigpu-amd.yml"; exit 1 ;; esac