diff --git a/.github/workflows/dotnet.yaml b/.github/workflows/dotnet.yaml index b83434b..12ff2e1 100644 --- a/.github/workflows/dotnet.yaml +++ b/.github/workflows/dotnet.yaml @@ -102,7 +102,12 @@ jobs: run: nix develop --command markdown-link-check README.md all-required-checks-complete: + if: ${{ always() }} needs: [check-dotnet-format, check-nix-format, build, shellcheck, linkcheck, run-app] runs-on: ubuntu-latest steps: - - run: echo "All required checks complete." + - uses: actions/checkout@v4 + - name: Check job statuses + env: + RESULTS: ${{ toJSON(needs) }} + run: python .github/workflows/required_checks.py diff --git a/.github/workflows/required_checks.py b/.github/workflows/required_checks.py new file mode 100644 index 0000000..092d59c --- /dev/null +++ b/.github/workflows/required_checks.py @@ -0,0 +1,40 @@ +import os +import json +import sys +from typing import Any + +results_json = os.environ.get('RESULTS', '{}') or sys.exit(1) + +try: + results = json.loads(results_json) +except json.JSONDecodeError: + print("Error: Unable to parse RESULTS as JSON") + exit(1) + +def process_job(job_name: str, job_data: dict[str, Any]) -> int: + """ + Returns 0 on success and 1 on error. + """ + status = job_data['result'] + print(f"Processing job: {job_name} with status: {status}") + + if status == "success": + print(f"Job {job_name} succeeded.") + return 0 + elif status in {"failure", "cancelled"}: + print(f"Job {job_name} failed: status {status}!") + return 1 + else: + print(f"Job {job_name} has unknown status: {status}!") + return 1 + +# Iterate over each job +exit_status = 0 +for job_name, job_data in results.items(): + if not isinstance(job_data, dict): + print(f"Unexpected shape at key {job_name}: {job_data}") + sys.exit(2) + exit_status += process_job(job_name, job_data) + +if exit_status > 0: + sys.exit(3)