Skip to content

Commit

Permalink
Extract forward compatiblity checks and run on nightly schedule (#15437)
Browse files Browse the repository at this point in the history
Running compatibility checks with every Crystal release between the oldest forward-compatible (1.0.0) and latest is quite expensive. It currently takes 9:20 hours (14 * 0:35).
And they're not particularly useful. Checks for each individual release would just help discover an odd compatibility issue that only exists on a specific Crystal version. That's is not very common. In case there are any compatibility issues, they'll most likely affect the oldest release (1.0.0) as well. Testing for that should suffice to identify the vast majority of issues.
So we're pulling them out of the pre-merge checks and only run them on a schedule on master (or on demand).
This helps reduce unnecessary CI usage.
  • Loading branch information
straight-shoota authored Feb 12, 2025
1 parent 2a110b8 commit 8e4cfcd
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 14 deletions.
64 changes: 64 additions & 0 deletions .github/workflows/forward-compatibility.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: Forward Compatibility

on:
push:
paths:
- .github/workflows/forward-compatibility.yml
schedule:
- cron: '0 3 * * *'
workflow_dispatch:

permissions: {}

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}

env:
TRAVIS_OS_NAME: linux
SPEC_SPLIT_DOTS: 160

jobs:
# Test against *each* supported Crystal version for forward compatibility.
#
# This workflow runs on a nightly schedule on `master`.
# It can also be dispatched manually when necessary.
#
# We run a basic version of this test on every commit which covers only the earliest and latest supported versions in `linux.yml#x86_64-gnu-test`.
x86_64-gnu-test-forward_compatibility:
env:
ARCH: x86_64
ARCH_CMD: linux64
DOCKER_TEST_PREFIX: crystallang/crystal:${{ matrix.crystal_bootstrap_version }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
crystal_bootstrap_version: [1.7.3, 1.8.2, 1.9.2, 1.10.1, 1.11.2, 1.12.2, 1.13.3, 1.14.1]
flags: [""]
include:
# libffi is only available starting from the 1.2.2 build images
- crystal_bootstrap_version: 1.1.1
flags: "FLAGS=-Dwithout_ffi USE_PCRE1=true"
- crystal_bootstrap_version: 1.2.2
flags: "USE_PCRE1=true"
- crystal_bootstrap_version: 1.3.2
flags: "USE_PCRE1=true"
- crystal_bootstrap_version: 1.4.1
flags: "USE_PCRE1=true"
- crystal_bootstrap_version: 1.5.1
flags: "USE_PCRE1=true"
- crystal_bootstrap_version: 1.6.2
flags: "USE_PCRE1=true"
steps:
- name: Download Crystal source
uses: actions/checkout@v4

- name: Prepare System
run: bin/ci prepare_system

- name: Prepare Build
run: bin/ci prepare_build

- name: Test
run: ${{ matrix.flags }} bin/ci build
18 changes: 5 additions & 13 deletions .github/workflows/linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ env:
SPEC_SPLIT_DOTS: 160

jobs:
# Test against latest release and the earliest supported Crystal version for forward compatibility.
#
# A more advanced test which runs against *each* supported version is available in `forward-compatibility.yml` and
# runs regularly on a nightly schedule.
x86_64-gnu-test:
env:
ARCH: x86_64
Expand All @@ -22,24 +26,12 @@ jobs:
strategy:
fail-fast: false
matrix:
crystal_bootstrap_version: [1.7.3, 1.8.2, 1.9.2, 1.10.1, 1.11.2, 1.12.2, 1.13.3, 1.14.1, 1.15.1]
flags: [""]
include:
# libffi is only available starting from the 1.2.2 build images
- crystal_bootstrap_version: 1.0.0
flags: "FLAGS=-Dwithout_ffi USE_PCRE1=true"
- crystal_bootstrap_version: 1.1.1
flags: "FLAGS=-Dwithout_ffi USE_PCRE1=true"
- crystal_bootstrap_version: 1.2.2
flags: "USE_PCRE1=true"
- crystal_bootstrap_version: 1.3.2
flags: "USE_PCRE1=true"
- crystal_bootstrap_version: 1.4.1
flags: "USE_PCRE1=true"
- crystal_bootstrap_version: 1.5.1
flags: "USE_PCRE1=true"
- crystal_bootstrap_version: 1.6.2
flags: "USE_PCRE1=true"
- crystal_bootstrap_version: 1.15.1 # LATEST RELEASE
steps:
- name: Download Crystal source
uses: actions/checkout@v4
Expand Down
4 changes: 3 additions & 1 deletion scripts/release-update.sh
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@ sed -i -E "s|crystal-[0-9.]+-[0-9]|crystal-$CRYSTAL_VERSION-1|g" bin/ci

# Edit .github/workflows/*.yml to point to docker image
# Update the patch version of the latest entry if same minor version to have only one item per minor version
sed -i -E "/crystal_bootstrap_version:/ s/(, ${CRYSTAL_VERSION%.*}\.[0-9]*)?\]\$/, $CRYSTAL_VERSION]/" .github/workflows/linux.yml
previous_release=$(grep -o -P '(?<=crystal_bootstrap_version: ).*(?= # LATEST RELEASE)' .github/workflows/linux.yml)
sed -i -E "s/crystal_bootstrap_version: .+ # LATEST RELEASE/crystal_bootstrap_version: $CRYSTAL_VERSION # LATEST RELEASE/" .github/workflows/linux.yml
sed -i -E "/crystal_bootstrap_version:/ s/(, ${previous_release%.*}\.[0-9]*)?\]\$/, $previous_release]/" .github/workflows/forward-compatibility.yml
sed -i -E "s|crystallang/crystal:[0-9.]+|crystallang/crystal:$CRYSTAL_VERSION|g" .github/workflows/*.yml

# Edit .github/workflows/*.yml to update version for install-crystal action
Expand Down

0 comments on commit 8e4cfcd

Please sign in to comment.