diff --git a/.github/scripts/strategy-matrix/README.md b/.github/scripts/strategy-matrix/README.md index ae521b98f4..fc1ff9b2f2 100644 --- a/.github/scripts/strategy-matrix/README.md +++ b/.github/scripts/strategy-matrix/README.md @@ -63,15 +63,43 @@ and don't publish any packages or images. We have four triggers that can cause the workflow to run: -- `commit`: A commit is pushed to a pull request. +- `commit`: A commit is pushed to a branch for which a pull request is open. - `merge`: A pull request is merged. - `label`: A label is added to a pull request. - `schedule`: The workflow is run on a scheduled basis. The `label` trigger is currently not used, but it is reserved for future use. + The `schedule` trigger is used to run the workflow each weekday, and is also used for ad hoc testing via the `workflow_dispatch` event. +### Dependencies + +The pipeline that is run for the `schedule` trigger will recompile and upload +all Conan packages to the remote for each configuration that is enabled. In +case any dependencies were added or updated in a recently merged PR, they will +then be available in the remote for the following pipeline runs. It is therefore +important that all configurations that are enabled for the `commit`, `merge`, +and `label` triggers are also enabled for the `schedule` trigger. We run +additional configurations in the `schedule` trigger that are not run for the +other triggers, to get extra confidence that the codebase can compile and run on +all supported platforms. + +#### Caveats + +There is some nuance here in that certain options affect the compilation of the +dependencies, while others do not. This means that that same options need to be +enabled for the `schedule` trigger as for the other triggers to ensure any +dependency changes get cached in the Conan remote. + +- Build mode (`unity`): Does not affect the dependencies. +- Build option (`coverage`, `voidstar`): Does not affect the dependencies. +- Build option (`sanitizer asan`, `sanitizer tsan`): Affects the dependencies. +- Build type (`debug`, `release`): Affects the dependencies. +- Build type (`publish`): Same effect as `release` on the dependencies. +- Test option (`reference fee`): Does not affect the dependencies. +- Publish option (`package`, `image`): Does not affect the dependencies. + ## Usage Our GitHub CI pipeline uses the `generate.py` script to generate the matrix for diff --git a/.github/scripts/strategy-matrix/helpers/enums.py b/.github/scripts/strategy-matrix/helpers/enums.py index 73822219b3..0eb0a0693a 100755 --- a/.github/scripts/strategy-matrix/helpers/enums.py +++ b/.github/scripts/strategy-matrix/helpers/enums.py @@ -31,14 +31,12 @@ class BuildOption(StrEnum): VOIDSTAR = auto() -class TestOption(StrEnum): - """Represents test options to enable, specifically the reference fee to use.""" +class BuildType(StrEnum): + """Represents the build type to use.""" - __test__ = False # Tell pytest to not consider this as a test class. - - NONE = "" # Use the default reference fee of 10. - REFERENCE_FEE_500 = "500" - REFERENCE_FEE_1000 = "1000" + DEBUG = auto() + RELEASE = auto() + PUBLISH = auto() # Release build without assertions. class PublishOption(StrEnum): @@ -50,12 +48,14 @@ class PublishOption(StrEnum): PACKAGE_AND_IMAGE = auto() -class BuildType(StrEnum): - """Represents the build type to use.""" +class TestOption(StrEnum): + """Represents test options to enable, specifically the reference fee to use.""" - DEBUG = auto() - RELEASE = auto() - PUBLISH = auto() # Release build without assertions. + __test__ = False # Tell pytest to not consider this as a test class. + + NONE = "" # Use the default reference fee of 10. + REFERENCE_FEE_500 = "500" + REFERENCE_FEE_1000 = "1000" class Platform(StrEnum): diff --git a/.github/scripts/strategy-matrix/helpers/unique.py b/.github/scripts/strategy-matrix/helpers/unique.py index 01d68837eb..469f60f839 100644 --- a/.github/scripts/strategy-matrix/helpers/unique.py +++ b/.github/scripts/strategy-matrix/helpers/unique.py @@ -1,5 +1,5 @@ -from dataclasses import asdict, _is_dataclass_instance import json +from dataclasses import _is_dataclass_instance, asdict from typing import Any diff --git a/.github/scripts/strategy-matrix/helpers/unique_test.py b/.github/scripts/strategy-matrix/helpers/unique_test.py index 94a629d7a7..bd8ee3e11e 100644 --- a/.github/scripts/strategy-matrix/helpers/unique_test.py +++ b/.github/scripts/strategy-matrix/helpers/unique_test.py @@ -1,6 +1,7 @@ -import pytest from dataclasses import dataclass +import pytest + from helpers.unique import * diff --git a/.github/scripts/strategy-matrix/linux.py b/.github/scripts/strategy-matrix/linux.py index b70425d131..bcee2045a6 100755 --- a/.github/scripts/strategy-matrix/linux.py +++ b/.github/scripts/strategy-matrix/linux.py @@ -8,31 +8,18 @@ DEBIAN_SHA = "sha-ca4517d" RHEL_SHA = "sha-ca4517d" UBUNTU_SHA = "sha-84afd81" +# We only build a selection of configurations for the various triggers to reduce +# pipeline runtime. Across all three operating systems we aim to cover all GCC +# and Clang versions, while not duplicating configurations too much. See also +# the README for more details. + +# The Debian distros to build configurations for. +# +# We have the following distros available: +# - Debian Bullseye: GCC 12-15 +# - Debian Bookworm: GCC 13-15, Clang 16-20 +# - Debian Trixie: GCC 14-15, Clang 20-21 DEBIAN_DISTROS = [ - Distro( - os_name="debian", - os_version="bullseye", - compiler_name="gcc", - compiler_version="12", - image_sha=DEBIAN_SHA, - specs=[ - Spec( - triggers=[Trigger.SCHEDULE], - ), - ], - ), - Distro( - os_name="debian", - os_version="bullseye", - compiler_name="gcc", - compiler_version="13", - image_sha=DEBIAN_SHA, - specs=[ - Spec( - triggers=[Trigger.SCHEDULE], - ), - ], - ), Distro( os_name="debian", os_version="bullseye", @@ -76,30 +63,6 @@ DEBIAN_DISTROS = [ ), ], ), - Distro( - os_name="debian", - os_version="bookworm", - compiler_name="gcc", - compiler_version="13", - image_sha=DEBIAN_SHA, - specs=[ - Spec( - triggers=[Trigger.SCHEDULE], - ), - ], - ), - Distro( - os_name="debian", - os_version="bookworm", - compiler_name="gcc", - compiler_version="14", - image_sha=DEBIAN_SHA, - specs=[ - Spec( - triggers=[Trigger.SCHEDULE], - ), - ], - ), Distro( os_name="debian", os_version="bookworm", @@ -108,6 +71,7 @@ DEBIAN_DISTROS = [ image_sha=DEBIAN_SHA, specs=[ Spec( + archs=[Arch.LINUX_AMD64], triggers=[Trigger.SCHEDULE], ), ], @@ -146,6 +110,7 @@ DEBIAN_DISTROS = [ image_sha=DEBIAN_SHA, specs=[ Spec( + archs=[Arch.LINUX_AMD64], triggers=[Trigger.SCHEDULE], ), ], @@ -158,6 +123,7 @@ DEBIAN_DISTROS = [ image_sha=DEBIAN_SHA, specs=[ Spec( + archs=[Arch.LINUX_ARM64], triggers=[Trigger.SCHEDULE], ), ], @@ -170,30 +136,7 @@ DEBIAN_DISTROS = [ image_sha=DEBIAN_SHA, specs=[ Spec( - triggers=[Trigger.SCHEDULE], - ), - ], - ), - Distro( - os_name="debian", - os_version="bookworm", - compiler_name="clang", - compiler_version="20", - image_sha=DEBIAN_SHA, - specs=[ - Spec( - triggers=[Trigger.SCHEDULE], - ), - ], - ), - Distro( - os_name="debian", - os_version="trixie", - compiler_name="gcc", - compiler_version="14", - image_sha=DEBIAN_SHA, - specs=[ - Spec( + archs=[Arch.LINUX_AMD64], triggers=[Trigger.SCHEDULE], ), ], @@ -206,19 +149,7 @@ DEBIAN_DISTROS = [ image_sha=DEBIAN_SHA, specs=[ Spec( - triggers=[Trigger.SCHEDULE], - ), - ], - ), - Distro( - os_name="debian", - os_version="trixie", - compiler_name="clang", - compiler_version="20", - image_sha=DEBIAN_SHA, - specs=[ - Spec( - archs=[Arch.LINUX_AMD64], + archs=[Arch.LINUX_ARM64], triggers=[Trigger.SCHEDULE], ), ], @@ -243,9 +174,13 @@ DEBIAN_DISTROS = [ ], ), ] -# The Debian distros to build for. -# The RHEL distros to build for. +# The RHEL distros to build configurations for. +# +# We have the following distros available: +# - RHEL 8: GCC 14, Clang "any" +# - RHEL 9: GCC 12-14, Clang "any" +# - RHEL 10: GCC 14, Clang "any" RHEL_DISTROS = [ Distro( os_name="rhel", @@ -311,45 +246,6 @@ RHEL_DISTROS = [ ), ], ), - Distro( - os_name="rhel", - os_version="9", - compiler_name="gcc", - compiler_version="14", - image_sha=RHEL_SHA, - specs=[ - Spec( - archs=[Arch.LINUX_AMD64], - triggers=[Trigger.SCHEDULE], - ), - ], - ), - Distro( - os_name="rhel", - os_version="9", - compiler_name="clang", - compiler_version="any", - image_sha=RHEL_SHA, - specs=[ - Spec( - archs=[Arch.LINUX_AMD64], - triggers=[Trigger.SCHEDULE], - ), - ], - ), - Distro( - os_name="rhel", - os_version="10", - compiler_name="gcc", - compiler_version="14", - image_sha=RHEL_SHA, - specs=[ - Spec( - archs=[Arch.LINUX_AMD64], - triggers=[Trigger.SCHEDULE], - ), - ], - ), Distro( os_name="rhel", os_version="10", @@ -365,7 +261,11 @@ RHEL_DISTROS = [ ), ] -# The Ubuntu distros to build for. +# The Ubuntu distros to build configurations for. +# +# We have the following distros available: +# - Ubuntu Jammy (22.04): GCC 12 +# - Ubuntu Noble (24.04): GCC 13-14, Clang 16-20 UBUNTU_DISTROS = [ Distro( os_name="ubuntu", @@ -375,6 +275,7 @@ UBUNTU_DISTROS = [ image_sha=UBUNTU_SHA, specs=[ Spec( + archs=[Arch.LINUX_ARM64], triggers=[Trigger.SCHEDULE], ), ], @@ -393,6 +294,7 @@ UBUNTU_DISTROS = [ triggers=[Trigger.MERGE], ), Spec( + archs=[Arch.LINUX_ARM64], triggers=[Trigger.SCHEDULE], ), ], @@ -405,18 +307,7 @@ UBUNTU_DISTROS = [ image_sha=UBUNTU_SHA, specs=[ Spec( - triggers=[Trigger.SCHEDULE], - ), - ], - ), - Distro( - os_name="ubuntu", - os_version="noble", - compiler_name="clang", - compiler_version="16", - image_sha=UBUNTU_SHA, - specs=[ - Spec( + archs=[Arch.LINUX_ARM64], triggers=[Trigger.SCHEDULE], ), ], @@ -435,6 +326,7 @@ UBUNTU_DISTROS = [ triggers=[Trigger.MERGE], ), Spec( + archs=[Arch.LINUX_ARM64], triggers=[Trigger.SCHEDULE], ), ], @@ -447,6 +339,7 @@ UBUNTU_DISTROS = [ image_sha=UBUNTU_SHA, specs=[ Spec( + archs=[Arch.LINUX_AMD64], triggers=[Trigger.SCHEDULE], ), ], @@ -459,6 +352,7 @@ UBUNTU_DISTROS = [ image_sha=UBUNTU_SHA, specs=[ Spec( + archs=[Arch.LINUX_ARM64], triggers=[Trigger.SCHEDULE], ), ], diff --git a/.github/workflows/on-pr.yml b/.github/workflows/on-pr.yml index 1b87eb10dd..683adbb89a 100644 --- a/.github/workflows/on-pr.yml +++ b/.github/workflows/on-pr.yml @@ -115,7 +115,7 @@ jobs: platform: [linux, macos, windows] with: platform: ${{ matrix.platform }} - trigger: schedule + trigger: commit secrets: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/reusable-build-test-config.yml b/.github/workflows/reusable-build-test-config.yml index 38d3432423..9aa61ae8a3 100644 --- a/.github/workflows/reusable-build-test-config.yml +++ b/.github/workflows/reusable-build-test-config.yml @@ -187,7 +187,7 @@ jobs: ./xrpld --unittest --unittest-jobs "${BUILD_NPROC}" - name: Debug failure (Linux) - if: ${{ failure() && runner.os == 'Linux' && inputs.enable_tests }} + if: ${{ (failure() || cancelled()) && runner.os == 'Linux' && inputs.enable_tests }} run: | echo "IPv4 local port range:" cat /proc/sys/net/ipv4/ip_local_port_range