From c22c81cbc1eebff1521a3cdefceb4c287fa8dfe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ber=C3=A1nek?= Date: Thu, 4 Apr 2024 14:27:38 +0200 Subject: [PATCH] Generate CI job matrix for PR jobs in Python --- .github/workflows/ci.yml | 28 ++++++++-------- src/ci/github-actions/ci.yml | 27 ++++++++------- src/ci/github-actions/jobs.yml | 46 ++++++++++++++++++++++++++ src/ci/scripts/calculate-job-matrix.py | 25 ++++++++++++++ 4 files changed, 98 insertions(+), 28 deletions(-) create mode 100644 src/ci/github-actions/jobs.yml create mode 100755 src/ci/scripts/calculate-job-matrix.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1c87b0a76e..cfeb6b985ba 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,8 +36,21 @@ concurrency: group: "${{ github.workflow }}-${{ ((github.ref == 'refs/heads/try' || github.ref == 'refs/heads/try-perf') && github.sha) || github.ref }}" cancel-in-progress: true jobs: + calculate_matrix: + name: Calculate job matrix + runs-on: ubuntu-latest + outputs: + jobs: "${{ steps.jobs.outputs.jobs }}" + steps: + - name: Checkout the source code + uses: actions/checkout@v4 + - name: Calculate the CI job matrix + run: python3 src/ci/scripts/calculate-job-matrix.py >> $GITHUB_OUTPUT + id: jobs pr: name: "PR - ${{ matrix.name }}" + needs: + - calculate_matrix env: PR_CI_JOB: 1 CI_JOB_NAME: "${{ matrix.name }}" @@ -51,20 +64,7 @@ jobs: continue-on-error: "${{ matrix.name == 'mingw-check-tidy' }}" strategy: matrix: - include: - - name: mingw-check - os: ubuntu-20.04-4core-16gb - env: {} - - name: mingw-check-tidy - os: ubuntu-20.04-4core-16gb - env: {} - - name: x86_64-gnu-llvm-17 - env: - ENABLE_GCC_CODEGEN: "1" - os: ubuntu-20.04-16core-64gb - - name: x86_64-gnu-tools - os: ubuntu-20.04-16core-64gb - env: {} + include: "${{ fromJSON(needs.calculate_matrix.outputs.jobs) }}" defaults: run: shell: "${{ contains(matrix.os, 'windows') && 'msys2 {0}' || 'bash' }}" diff --git a/src/ci/github-actions/ci.yml b/src/ci/github-actions/ci.yml index 80e23574404..8f8b10ab90e 100644 --- a/src/ci/github-actions/ci.yml +++ b/src/ci/github-actions/ci.yml @@ -340,9 +340,21 @@ concurrency: cancel-in-progress: true jobs: + calculate_matrix: + name: Calculate job matrix + runs-on: ubuntu-latest + outputs: + jobs: ${{ steps.jobs.outputs.jobs }} + steps: + - name: Checkout the source code + uses: actions/checkout@v4 + - name: Calculate the CI job matrix + run: python3 src/ci/scripts/calculate-job-matrix.py >> $GITHUB_OUTPUT + id: jobs pr: <<: *base-ci-job name: PR - ${{ matrix.name }} + needs: [ calculate_matrix ] env: <<: [*shared-ci-variables, *public-variables] PR_CI_JOB: 1 @@ -350,20 +362,7 @@ jobs: continue-on-error: ${{ matrix.name == 'mingw-check-tidy' }} strategy: matrix: - include: - - name: mingw-check - <<: *job-linux-4c - - - name: mingw-check-tidy - <<: *job-linux-4c - - - name: x86_64-gnu-llvm-17 - env: - ENABLE_GCC_CODEGEN: "1" - <<: *job-linux-16c - - - name: x86_64-gnu-tools - <<: *job-linux-16c + include: ${{ fromJSON(needs.calculate_matrix.outputs.jobs) }} auto: <<: *base-ci-job diff --git a/src/ci/github-actions/jobs.yml b/src/ci/github-actions/jobs.yml new file mode 100644 index 00000000000..5b0140053d6 --- /dev/null +++ b/src/ci/github-actions/jobs.yml @@ -0,0 +1,46 @@ +x--expand-yaml-anchors--remove: + - &base-job + env: { } + + - &job-linux-4c + os: ubuntu-20.04-4core-16gb + <<: *base-job + + - &job-linux-8c + os: ubuntu-20.04-8core-32gb + <<: *base-job + + - &job-linux-16c + os: ubuntu-20.04-16core-64gb + <<: *base-job + + - &job-macos-xl + os: macos-13 # We use the standard runner for now + <<: *base-job + + - &job-macos-m1 + os: macos-14 + <<: *base-job + + - &job-windows-8c + os: windows-2019-8core-32gb + <<: *base-job + + - &job-windows-16c + os: windows-2019-16core-64gb + <<: *base-job + + - &job-aarch64-linux + os: [ self-hosted, ARM64, linux ] + +pr: + - name: mingw-check + <<: *job-linux-4c + - name: mingw-check-tidy + <<: *job-linux-4c + - name: x86_64-gnu-llvm-17 + env: + ENABLE_GCC_CODEGEN: "1" + <<: *job-linux-16c + - name: x86_64-gnu-tools + <<: *job-linux-16c diff --git a/src/ci/scripts/calculate-job-matrix.py b/src/ci/scripts/calculate-job-matrix.py new file mode 100755 index 00000000000..9b1e74c23c3 --- /dev/null +++ b/src/ci/scripts/calculate-job-matrix.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 + +""" +This script serves for generating a matrix of jobs that should +be executed on CI. + +It reads job definitions from `src/ci/github-actions/jobs.yml` +and filters them based on the event that happened on CI. + +Currently, it only supports PR builds. +""" + +import json +from pathlib import Path + +import yaml + +JOBS_YAML_PATH = Path(__file__).absolute().parent.parent / "github-actions" / "jobs.yml" + + +if __name__ == "__main__": + with open(JOBS_YAML_PATH) as f: + jobs = yaml.safe_load(f) + job_output = jobs["pr"] + print(f"jobs={json.dumps(job_output)}")