From 76a691f33946a1395a9fe94ed88c3176848d4156 Mon Sep 17 00:00:00 2001 From: Matt Valentine-House Date: Fri, 11 Oct 2024 11:24:33 +0100 Subject: [PATCH] Separate Modular GC CI into it's own workflow --- .github/workflows/macos.yml | 27 ---- .github/workflows/sharedgc-macos.yml | 201 ++++++++++++++++++++++++++ .github/workflows/sharedgc-ubuntu.yml | 176 ++++++++++++++++++++++ .github/workflows/ubuntu.yml | 29 ---- 4 files changed, 377 insertions(+), 56 deletions(-) create mode 100644 .github/workflows/sharedgc-macos.yml create mode 100644 .github/workflows/sharedgc-ubuntu.yml diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index ea17dc6cab7708..0b4295aaaa497a 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -38,18 +38,6 @@ jobs: os: macos-12 - test_task: check os: macos-13 - - test_task: check - gc_name: 'mmtk' - build: 'debug' - shared_gc: true - configure: '--with-shared-gc=/Users/runner/ruby_gc' - os: macos-14 - - test_task: check - gc_name: 'mmtk' - build: 'release' - shared_gc: true - configure: '--with-shared-gc=/Users/runner/ruby_gc' - os: macos-14 fail-fast: false env: @@ -105,21 +93,6 @@ jobs: configure: ${{ matrix.configure }} ${ruby_configure_args} run: ../src/configure -C --disable-install-doc ${{ env.configure }} - - uses: actions-rust-lang/setup-rust-toolchain@v1 - - name: Build MMTK Ruby lib - run: | - cd ../src/gc/mmtk - cargo build ${{ matrix.build != 'debug' && format('--{0}', matrix.build) || format('') }} - echo "RUST_LOG=" >> $GITHUB_ENV - echo "EXCLUDES=../src/test/.excludes-mmtk" >> $GITHUB_ENV - if: ${{ matrix.shared_gc && matrix.gc_name == 'mmtk' }} - - - name: Build shared GC - run: | - echo "RUBY_GC_LIBRARY=librubygc.${{ matrix.gc_name }}.dylib" >> $GITHUB_ENV - make shared-gc SHARED_GC=${{ matrix.gc_name }} MMTK_BUILD=${{ matrix.build }} - if: ${{ matrix.shared_gc }} - - run: make prepare-gems if: ${{ matrix.test_task == 'test-bundled-gems' }} diff --git a/.github/workflows/sharedgc-macos.yml b/.github/workflows/sharedgc-macos.yml new file mode 100644 index 00000000000000..816203d4026471 --- /dev/null +++ b/.github/workflows/sharedgc-macos.yml @@ -0,0 +1,201 @@ +name: macOS +on: + push: + paths-ignore: + - 'doc/**' + - '**/man/*' + - '**.md' + - '**.rdoc' + - '**/.document' + - '.*.yml' + pull_request: + # Do not use paths-ignore for required status checks + # https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/troubleshooting-required-status-checks#handling-skipped-but-required-checks + merge_group: + +concurrency: + group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }} + cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }} + +permissions: + contents: read + +jobs: + make: + strategy: + matrix: + include: + - test_task: check + gc_name: 'mmtk' + build: 'debug' + configure: '--with-shared-gc=/Users/runner/ruby_gc' + os: macos-14 + - test_task: check + gc_name: 'mmtk' + build: 'release' + configure: '--with-shared-gc=/Users/runner/ruby_gc' + os: macos-14 + fail-fast: false + + env: + GITPULLOPTIONS: --no-tags origin ${{ github.ref }} + + runs-on: ${{ matrix.os }} + + if: >- + ${{!(false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') + || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') + )}} + + steps: + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 + with: + sparse-checkout-cone-mode: false + sparse-checkout: /.github + + - name: Install libraries + uses: ./.github/actions/setup/macos + + - uses: ./.github/actions/setup/directories + with: + srcdir: src + builddir: build + makeup: true + clean: true + dummy-files: ${{ matrix.test_task == 'check' }} + # Set fetch-depth: 0 so that Launchable can receive commits information. + fetch-depth: 10 + + - name: make sure that kern.coredump=1 + run: | + sysctl -n kern.coredump + sudo sysctl -w kern.coredump=1 + sudo chmod -R +rwx /cores/ + + - name: Delete unused SDKs + # To free up disk space to not run out during the run + run: | + sudo rm -rf ~/.dotnet + sudo rm -rf /Library/Android + sudo rm -rf /Library/Developer/CoreSimulator + continue-on-error: true + + - name: Run configure + env: + configure: ${{ matrix.configure }} ${ruby_configure_args} + run: ../src/configure -C --disable-install-doc ${{ env.configure }} + + - uses: actions-rust-lang/setup-rust-toolchain@v1 + - name: Build MMTK Ruby lib + run: | + cd ../src/gc/mmtk + cargo build ${{ matrix.build != 'debug' && format('--{0}', matrix.build) || format('') }} + echo "RUST_LOG=" >> $GITHUB_ENV + echo "EXCLUDES=../src/test/.excludes-mmtk" >> $GITHUB_ENV + if: ${{ matrix.gc_name == 'mmtk' }} + + - name: Build shared GC + run: | + echo "RUBY_GC_LIBRARY=librubygc.${{ matrix.gc_name }}.dylib" >> $GITHUB_ENV + make shared-gc SHARED_GC=${{ matrix.gc_name }} MMTK_BUILD=${{ matrix.build }} + + - run: make prepare-gems + if: ${{ matrix.test_task == 'test-bundled-gems' }} + + - run: make + + - run: | + make golf + case "${{ matrix.configure }}" in + *'--enable-shared'*) + make runnable + ./bin/goruby -veh + ;; + *) + ./goruby -veh + ;; + esac + + - name: Set test options for skipped tests + run: | + set -x + TESTS="$(echo "${{ matrix.skipped_tests }}" | sed 's| |$$/ -n!/|g;s|^|-n!/|;s|$|$$/|')" + echo "TESTS=${TESTS}" >> $GITHUB_ENV + if: ${{ matrix.test_task == 'check' && matrix.skipped_tests }} + + - name: Set up Launchable + uses: ./.github/actions/launchable/setup + with: + os: ${{ matrix.os }} + test-opts: ${{ matrix.test_opts }} + launchable-token: ${{ secrets.LAUNCHABLE_TOKEN }} + builddir: build + srcdir: src + continue-on-error: true + + - name: Set extra test options + run: | + echo "TESTS=$TESTS ${{ matrix.test_opts }}" >> $GITHUB_ENV + echo "RUBY_TEST_TIMEOUT_SCALE=10" >> $GITHUB_ENV # With --repeat-count=2, flaky test by timeout occurs frequently for some reason + if: matrix.test_opts + + - name: make ${{ matrix.test_task }} + run: | + ulimit -c unlimited + make -s ${{ matrix.test_task }} ${TESTS:+TESTS="$TESTS"} + timeout-minutes: 60 + env: + RUBY_TESTOPTS: '-q --tty=no' + TEST_BUNDLED_GEMS_ALLOW_FAILURES: 'typeprof' + PRECHECK_BUNDLED_GEMS: 'no' + + - name: make skipped tests + run: | + make -s test-all TESTS="${TESTS//-n!\//-n/}" + env: + GNUMAKEFLAGS: '' + RUBY_TESTOPTS: '-v --tty=no' + PRECHECK_BUNDLED_GEMS: 'no' + if: ${{ matrix.test_task == 'check' && matrix.skipped_tests }} + continue-on-error: ${{ matrix.continue-on-skipped_tests || false }} + + - uses: ./.github/actions/slack + with: + label: ${{ matrix.os }} / ${{ matrix.test_task }} + SLACK_WEBHOOK_URL: ${{ secrets.SIMPLER_ALERTS_URL }} # ruby-lang slack: ruby/simpler-alerts-bot + if: ${{ failure() }} + + - name: Resolve job ID + id: job_id + uses: actions/github-script@main + env: + matrix: ${{ toJson(matrix) }} + with: + script: | + const { data: workflow_run } = await github.rest.actions.listJobsForWorkflowRun({ + owner: context.repo.owner, + repo: context.repo.repo, + run_id: context.runId + }); + const matrix = JSON.parse(process.env.matrix); + const job_name = `${context.job}${matrix ? ` (${Object.values(matrix).join(", ")})` : ""}`; + return workflow_run.jobs.find((job) => job.name === job_name).id; + + result: + if: ${{ always() }} + name: ${{ github.workflow }} result + runs-on: macos-latest + needs: [make] + steps: + - run: exit 1 + working-directory: + if: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }} + +defaults: + run: + working-directory: build diff --git a/.github/workflows/sharedgc-ubuntu.yml b/.github/workflows/sharedgc-ubuntu.yml new file mode 100644 index 00000000000000..49a838c9654dc5 --- /dev/null +++ b/.github/workflows/sharedgc-ubuntu.yml @@ -0,0 +1,176 @@ +name: Ubuntu +on: + push: + paths-ignore: + - 'doc/**' + - '**/man/*' + - '**.md' + - '**.rdoc' + - '**/.document' + - '.*.yml' + pull_request: + # Do not use paths-ignore for required status checks + # https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/troubleshooting-required-status-checks#handling-skipped-but-required-checks + merge_group: + +concurrency: + group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }} + cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }} + +permissions: + contents: read + +jobs: + make: + strategy: + matrix: + include: + - test_task: check + gc_name: 'default' + configure: '--with-shared-gc=/home/runner/ruby_gc' + - test_task: check + gc_name: 'mmtk' + build: 'debug' + configure: '--with-shared-gc=/home/runner/ruby_gc' + - test_task: check + gc_name: 'mmtk' + build: 'release' + configure: '--with-shared-gc=/home/runner/ruby_gc' + fail-fast: false + + env: + GITPULLOPTIONS: --no-tags origin ${{ github.ref }} + RUBY_DEBUG: ci + + runs-on: ${{ matrix.os || 'ubuntu-22.04' }} + + if: >- + ${{!(false + || contains(github.event.head_commit.message, '[DOC]') + || contains(github.event.head_commit.message, 'Document') + || contains(github.event.pull_request.title, '[DOC]') + || contains(github.event.pull_request.title, 'Document') + || contains(github.event.pull_request.labels.*.name, 'Documentation') + || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') + )}} + + steps: + - uses: actions/checkout@d632683dd7b4114ad314bca15554477dd762a938 # v4.2.0 + with: + sparse-checkout-cone-mode: false + sparse-checkout: /.github + + - uses: ./.github/actions/setup/ubuntu + with: + arch: ${{ matrix.arch }} + + - uses: ruby/setup-ruby@a6e6f86333f0a2523ece813039b8b4be04560854 # v1.190.0 + with: + ruby-version: '3.0' + bundler: none + + - uses: ./.github/actions/setup/directories + with: + srcdir: src + builddir: build + makeup: true + clean: true + dummy-files: ${{ matrix.test_task == 'check' }} + # Set fetch-depth: 10 so that Launchable can receive commits information. + fetch-depth: 10 + + - name: Run configure + env: + arch: ${{ matrix.arch }} + configure: ${{ matrix.configure }} + run: >- + $SETARCH ../src/configure -C --disable-install-doc ${configure:-cppflags=-DRUBY_DEBUG} + ${arch:+--target=$arch-$OSTYPE --host=$arch-$OSTYPE} + + - run: $SETARCH make prepare-gems + if: ${{ matrix.test_task == 'test-bundled-gems' }} + + - uses: actions-rust-lang/setup-rust-toolchain@v1 + - name: Build MMTK Ruby lib + run: | + cd ../src/gc/mmtk + cargo build ${{ matrix.build != 'debug' && format('--{0}', matrix.build) || format('') }} + echo "RUST_LOG=" >> $GITHUB_ENV + echo "EXCLUDES=../src/test/.excludes-mmtk" >> $GITHUB_ENV + if: ${{ matrix.gc_name == 'mmtk' }} + + - name: Build shared GC + run: | + echo "RUBY_GC_LIBRARY=librubygc.${{ matrix.gc_name }}.so" >> $GITHUB_ENV + make shared-gc SHARED_GC=${{ matrix.gc_name }} MMTK_BUILD=${{ matrix.build }} + + - run: $SETARCH make + + - run: | + $SETARCH make golf + case "${{ matrix.configure }}" in + *'--enable-shared'*) + $SETARCH make runnable + ./bin/goruby -veh + ;; + *) + ./goruby -veh + ;; + esac + + - name: Set test options for skipped tests + run: | + set -x + TESTS="$(echo "${{ matrix.skipped_tests }}" | sed 's| |$$/ -n!/|g;s|^|-n!/|;s|$|$$/|')" + echo "TESTS=${TESTS}" >> $GITHUB_ENV + if: ${{ matrix.test_task == 'check' && matrix.skipped_tests }} + + - name: Set up Launchable + uses: ./.github/actions/launchable/setup + with: + os: ${{ matrix.os || 'ubuntu-22.04' }} + test-opts: ${{ matrix.configure }} + launchable-token: ${{ secrets.LAUNCHABLE_TOKEN }} + builddir: build + srcdir: src + continue-on-error: true + + - name: make ${{ matrix.test_task }} + run: >- + $SETARCH make -s ${{ matrix.test_task }} + ${TESTS:+TESTS="$TESTS"} + ${{ !contains(matrix.test_task, 'bundle') && 'RUBYOPT=-w' || '' }} + timeout-minutes: ${{ matrix.timeout || 40 }} + env: + RUBY_TESTOPTS: '-q --tty=no' + TEST_BUNDLED_GEMS_ALLOW_FAILURES: 'typeprof' + PRECHECK_BUNDLED_GEMS: 'no' + + - name: make skipped tests + run: | + $SETARCH make -s test-all TESTS="${TESTS//-n!\//-n/}" + env: + GNUMAKEFLAGS: '' + RUBY_TESTOPTS: '-v --tty=no' + if: ${{ matrix.test_task == 'check' && matrix.skipped_tests }} + continue-on-error: ${{ matrix.continue-on-skipped_tests || false }} + + - uses: ./.github/actions/slack + with: + label: ${{ matrix.test_task }} ${{ matrix.configure }}${{ matrix.arch }} + SLACK_WEBHOOK_URL: ${{ secrets.SIMPLER_ALERTS_URL }} # ruby-lang slack: ruby/simpler-alerts-bot + if: ${{ failure() }} + + result: + if: ${{ always() }} + name: ${{ github.workflow }} result + runs-on: ubuntu-latest + needs: [make] + steps: + - run: exit 1 + working-directory: + if: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }} + +defaults: + run: + working-directory: build diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml index 729c9641f25bf7..38c9e697456b32 100644 --- a/.github/workflows/ubuntu.yml +++ b/.github/workflows/ubuntu.yml @@ -33,20 +33,6 @@ jobs: configure: '--disable-yjit' - test_task: check configure: '--enable-shared --enable-load-relative' - - test_task: check - gc_name: 'default' - shared_gc: true - configure: '--with-shared-gc=/home/runner/ruby_gc' - - test_task: check - gc_name: 'mmtk' - build: 'debug' - shared_gc: true - configure: '--with-shared-gc=/home/runner/ruby_gc' - - test_task: check - gc_name: 'mmtk' - build: 'release' - shared_gc: true - configure: '--with-shared-gc=/home/runner/ruby_gc' - test_task: test-bundler-parallel timeout: 50 - test_task: test-bundled-gems @@ -108,21 +94,6 @@ jobs: - run: $SETARCH make prepare-gems if: ${{ matrix.test_task == 'test-bundled-gems' }} - - uses: actions-rust-lang/setup-rust-toolchain@v1 - - name: Build MMTK Ruby lib - run: | - cd ../src/gc/mmtk - cargo build ${{ matrix.build != 'debug' && format('--{0}', matrix.build) || format('') }} - echo "RUST_LOG=" >> $GITHUB_ENV - echo "EXCLUDES=../src/test/.excludes-mmtk" >> $GITHUB_ENV - if: ${{ matrix.shared_gc && matrix.gc_name == 'mmtk' }} - - - name: Build shared GC - run: | - echo "RUBY_GC_LIBRARY=librubygc.${{ matrix.gc_name }}.so" >> $GITHUB_ENV - make shared-gc SHARED_GC=${{ matrix.gc_name }} MMTK_BUILD=${{ matrix.build }} - if: ${{ matrix.shared_gc }} - - run: $SETARCH make - run: |