diff --git a/.github/scripts/strategy-matrix/generate.py b/.github/scripts/strategy-matrix/generate.py index 27eb60c005..a6b10d84a3 100755 --- a/.github/scripts/strategy-matrix/generate.py +++ b/.github/scripts/strategy-matrix/generate.py @@ -32,10 +32,13 @@ We will further set additional CMake arguments as follows: """ -def generate_strategy_matrix(all: bool, config: Config) -> list: +def generate_strategy_matrix(all: bool, config: Config, distro: str = "") -> list: configurations = [] + os_entries = config.os + if distro: + os_entries = [o for o in os_entries if o["distro_name"] == distro] for architecture, os, build_type, cmake_args in itertools.product( - config.architecture, config.os, config.build_type, config.cmake_args + config.architecture, os_entries, config.build_type, config.cmake_args ): # The default CMake target is 'all' for Linux and MacOS and 'install' # for Windows, but it can get overridden for certain configurations. @@ -223,7 +226,7 @@ def generate_strategy_matrix(all: bool, config: Config) -> list: if (n := os["compiler_version"]) != "": config_name += f"-{n}" config_name += ( - f"-{architecture['platform'][architecture['platform'].find('/')+1:]}" + f"-{architecture['platform'][architecture['platform'].find('/') + 1 :]}" ) config_name += f"-{build_type.lower()}" if "-Dcoverage=ON" in cmake_args: @@ -313,21 +316,32 @@ if __name__ == "__main__": required=False, type=Path, ) + parser.add_argument( + "-d", + "--distro", + help="Filter OS entries to only include those with this distro_name (e.g. 'debian', 'rhel', 'ubuntu').", + required=False, + type=str, + default="", + ) args = parser.parse_args() matrix = [] if args.config is None or args.config == "": matrix += generate_strategy_matrix( - args.all, read_config(THIS_DIR / "linux.json") + args.all, read_config(THIS_DIR / "linux.json"), args.distro ) matrix += generate_strategy_matrix( - args.all, read_config(THIS_DIR / "macos.json") + args.all, read_config(THIS_DIR / "macos.json"), args.distro ) matrix += generate_strategy_matrix( - args.all, read_config(THIS_DIR / "windows.json") + args.all, read_config(THIS_DIR / "windows.json"), args.distro ) else: - matrix += generate_strategy_matrix(args.all, read_config(args.config)) + matrix += generate_strategy_matrix( + args.all, read_config(args.config), args.distro + ) # Generate the strategy matrix. - print(f"matrix={json.dumps({'include': matrix})}") + # print(f"matrix={json.dumps({'include': matrix})}") + print(json.dumps(matrix, indent=2)) diff --git a/.github/workflows/on-pr.yml b/.github/workflows/on-pr.yml index be6a92eea2..f2310ff50b 100644 --- a/.github/workflows/on-pr.yml +++ b/.github/workflows/on-pr.yml @@ -128,12 +128,23 @@ jobs: strategy: fail-fast: false matrix: - os: [linux, macos, windows] + include: + - os: linux + distro: debian + - os: linux + distro: rhel + - os: linux + distro: ubuntu + - os: macos + distro: "" + - os: windows + distro: "" with: # Enable ccache only for events targeting the XRPLF repository, since # other accounts will not have access to our remote cache storage. ccache_enabled: ${{ github.repository_owner == 'XRPLF' }} os: ${{ matrix.os }} + distro: ${{ matrix.distro }} secrets: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/on-trigger.yml b/.github/workflows/on-trigger.yml index c7e0e8c3aa..17a9dd54d6 100644 --- a/.github/workflows/on-trigger.yml +++ b/.github/workflows/on-trigger.yml @@ -77,7 +77,17 @@ jobs: strategy: fail-fast: ${{ github.event_name == 'merge_group' }} matrix: - os: [linux, macos, windows] + include: + - os: linux + distro: debian + - os: linux + distro: rhel + - os: linux + distro: ubuntu + - os: macos + distro: "" + - os: windows + distro: "" with: # Enable ccache only for events targeting the XRPLF repository, since # other accounts will not have access to our remote cache storage. @@ -86,6 +96,7 @@ jobs: # not identical to a regular compilation. ccache_enabled: ${{ github.repository_owner == 'XRPLF' && !startsWith(github.ref, 'refs/heads/release') }} os: ${{ matrix.os }} + distro: ${{ matrix.distro }} strategy_matrix: ${{ github.event_name == 'schedule' && 'all' || 'minimal' }} secrets: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/reusable-build-test.yml b/.github/workflows/reusable-build-test.yml index 0086cbbfb5..1c31fe2fbc 100644 --- a/.github/workflows/reusable-build-test.yml +++ b/.github/workflows/reusable-build-test.yml @@ -26,6 +26,12 @@ on: type: string default: "minimal" + distro: + description: 'Filter to only include configs for this distro (e.g. "debian", "rhel", "ubuntu"). Leave empty for no filtering.' + required: false + type: string + default: "" + secrets: CODECOV_TOKEN: description: "The Codecov token to use for uploading coverage reports." @@ -38,9 +44,11 @@ jobs: with: os: ${{ inputs.os }} strategy_matrix: ${{ inputs.strategy_matrix }} + distro: ${{ inputs.distro }} # Build and test the binary for each configuration. build-test-config: + name: ${{ matrix.config_name }} needs: - generate-matrix uses: ./.github/workflows/reusable-build-test-config.yml diff --git a/.github/workflows/reusable-strategy-matrix.yml b/.github/workflows/reusable-strategy-matrix.yml index b1232a138f..ea62a9fef3 100644 --- a/.github/workflows/reusable-strategy-matrix.yml +++ b/.github/workflows/reusable-strategy-matrix.yml @@ -13,6 +13,11 @@ on: required: false type: string default: "minimal" + distro: + description: 'Filter to only include configs for this distro (e.g. "debian", "rhel", "ubuntu"). Leave empty for no filtering.' + required: false + type: string + default: "" outputs: matrix: description: "The generated strategy matrix." @@ -42,4 +47,5 @@ jobs: env: GENERATE_CONFIG: ${{ inputs.os != '' && format('--config={0}.json', inputs.os) || '' }} GENERATE_OPTION: ${{ inputs.strategy_matrix == 'all' && '--all' || '' }} - run: ./generate.py ${GENERATE_OPTION} ${GENERATE_CONFIG} >> "${GITHUB_OUTPUT}" + GENERATE_DISTRO: ${{ inputs.distro != '' && format('--distro={0}', inputs.distro) || '' }} + run: ./generate.py ${GENERATE_OPTION} ${GENERATE_CONFIG} ${GENERATE_DISTRO} >> "${GITHUB_OUTPUT}"