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: # We enumerate every job in matrix.include to save build time include: - test_task: check configure: 'cppflags=-DVM_CHECK_MODE' - test_task: check arch: i686 - test_task: check configure: '--disable-yjit' - test_task: check configure: '--enable-shared --enable-load-relative' - test_task: test-bundler-parallel timeout: 50 - test_task: test-bundled-gems - test_task: check os: ubuntu-24.04 extra_checks: [capi] # ubuntu-24.04-arm jobs don't start on ruby/ruby as of 2025-10-29 #- test_task: check # os: ubuntu-24.04-arm fail-fast: false env: &make-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.pull_request.title, '[DOC]') || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} steps: &make-steps - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: sparse-checkout-cone-mode: false sparse-checkout: /.github - uses: ./.github/actions/setup/ubuntu with: arch: ${{ matrix.arch }} - uses: ruby/setup-ruby@ab177d40ee5483edb974554986f56b33477e21d0 # v1.265.0 with: ruby-version: '3.1' bundler: none if: >- ${{ !endsWith(matrix.os, 'arm') && !endsWith(matrix.os, 'ppc64le') && !endsWith(matrix.os, 's390x') }} - 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' }} - run: $SETARCH make - run: $SETARCH make hello - name: runirb run: | echo IRB::VERSION | $SETARCH make runirb RUNOPT="-- -f" - 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 id: 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 timeout-minutes: 3 # Avoid possible test failures with the zlib applying the following patch # on s390x CPU architecture. # https://github.com/madler/zlib/pull/410 - name: Disable DFLTCC run: echo "DFLTCC=0" >> $GITHUB_ENV if: ${{ endsWith(matrix.os, 's390x') }} - name: make ${{ matrix.test_task }} run: | test -n "${LAUNCHABLE_STDOUT}" && exec 1> >(tee "${LAUNCHABLE_STDOUT}") test -n "${LAUNCHABLE_STDERR}" && exec 2> >(tee "${LAUNCHABLE_STDERR}") $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: '' PRECHECK_BUNDLED_GEMS: 'no' LAUNCHABLE_STDOUT: ${{ steps.launchable.outputs.stdout_report_path }} LAUNCHABLE_STDERR: ${{ steps.launchable.outputs.stderr_report_path }} - 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 }} - name: test-pc run: | DESTDIR=${RUNNER_TEMP-${TMPDIR-/tmp}}/installed $SETARCH make test-pc "DESTDIR=$DESTDIR" - name: CAPI extensions uses: ./.github/actions/capiext with: builddir: build make: '$SETARCH make' env: RUBY_TESTOPTS: '-v --tty=no' if: ${{ contains(matrix.extra_checks, 'capi') }} - uses: ./.github/actions/slack with: label: ${{ matrix.test_task }} ${{ matrix.configure }}${{ matrix.arch }}${{ matrix.os }} SLACK_WEBHOOK_URL: ${{ secrets.SIMPLER_ALERTS_URL }} # ruby-lang slack: ruby/simpler-alerts-bot if: ${{ failure() }} make-ibm: strategy: matrix: include: - test_task: check os: ubuntu-24.04-ppc64le - test_task: check os: ubuntu-24.04-s390x fail-fast: false env: *make-env runs-on: ${{ matrix.os }} if: >- ${{github.repository == 'ruby/ruby' && !(false || contains(github.event.head_commit.message, '[DOC]') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} steps: *make-steps # Separated from `make` job to avoid making it a required status check ruby-bench: strategy: matrix: include: # Using the same setup as ZJIT jobs - bench_opts: '--warmup=1 --bench=1' runs-on: ubuntu-24.04 if: >- ${{!(false || contains(github.event.head_commit.message, '[DOC]') || contains(github.event.pull_request.title, '[DOC]') || contains(github.event.pull_request.labels.*.name, 'Documentation') || (github.event_name == 'push' && github.event.pull_request.user.login == 'dependabot[bot]') )}} steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 - uses: ./.github/actions/setup/ubuntu - uses: ./.github/actions/setup/directories with: srcdir: src builddir: build makeup: true - name: Run configure run: ../src/configure -C --disable-install-doc --prefix="$(pwd)/install" - run: make install - name: Checkout ruby-bench uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 with: repository: ruby/ruby-bench path: ruby-bench # If you want to skip failing benchmark, consider using `--excludes`. # e.g. `bench_opts: '--warmup=1 --bench=1 --excludes=railsbench,lobsters'` - name: Run ruby-bench run: ruby run_benchmarks.rb -e "ruby::../build/install/bin/ruby" ${{ matrix.bench_opts }} working-directory: ruby-bench - uses: ./.github/actions/slack with: label: ruby-bench ${{ matrix.bench_opts }} ${{ matrix.ruby_opts }} 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