name: ZJIT macOS on: push: branches: - master paths-ignore: - 'doc/**' - '**/man/*' - '**.md' - '**.rdoc' - '**/.document' - '.*.yml' pull_request: types: - opened - synchronize - reopened # 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: fail-fast: false matrix: include: - test_task: 'check' run_opts: '--zjit-call-threshold=1' specopts: '-T --zjit-call-threshold=1' configure: '--enable-zjit=dev' - test_task: 'check' run_opts: '--zjit-disable-hir-opt --zjit-call-threshold=1' specopts: '-T --zjit-disable-hir-opt -T --zjit-call-threshold=1' configure: '--enable-zjit=dev' - test_task: 'zjit-check' # zjit-test + quick feedback of test_zjit.rb configure: '--enable-yjit=dev --enable-zjit' rust_version: "1.85.0" - test_task: 'ruby' hint: 'combo build test' configure: '--enable-yjit --enable-zjit' env: GITPULLOPTIONS: --no-tags origin ${{ github.ref }} RUN_OPTS: ${{ matrix.run_opts }} SPECOPTS: ${{ matrix.specopts }} TESTOPTS: ${{ matrix.testopts }} ZJIT_RB_BUG: 1 runs-on: macos-14 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 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 dummy-files: ${{ matrix.test_task == 'check' }} # Set fetch-depth: 10 so that Launchable can receive commits information. fetch-depth: 10 - name: Install Rust if: ${{ matrix.rust_version }} run: | rustup install ${{ matrix.rust_version }} --profile minimal rustup default ${{ matrix.rust_version }} - uses: taiki-e/install-action@v2 with: tool: nextest@0.9 if: ${{ matrix.test_task == 'zjit-check' }} - name: Run configure run: ../src/configure -C --disable-install-doc ${{ matrix.configure }} - run: make - name: Verify that --zjit-dump-disasm works run: | ./miniruby --zjit-call-threshold=1 --zjit-dump-disasm -e0 | \ wc -l | \ ruby -ne 'raise "Disassembly seems broken in dev build (output has too few lines)" unless $_.to_i > 10' if: ${{ contains(matrix.configure, 'jit=dev') }} - name: Set ENV for ZJIT run: | echo "RUBY_CRASH_REPORT=$(pwd)/rb_crash_%p.txt" >> $GITHUB_ENV - name: make ${{ matrix.test_task }} run: | set -x make -s ${{ matrix.test_task }} ${TESTS:+TESTS="$TESTS"} \ RUN_OPTS="$RUN_OPTS" \ SPECOPTS="$SPECOPTS" \ TESTOPTS="$TESTOPTS" timeout-minutes: 60 env: RUBY_TESTOPTS: '-q --tty=no' EXCLUDES: '../src/test/.excludes-zjit' TEST_BUNDLED_GEMS_ALLOW_FAILURES: '' SYNTAX_SUGGEST_TIMEOUT: '5' PRECHECK_BUNDLED_GEMS: 'no' continue-on-error: ${{ matrix.continue-on-test_task || false }} - name: Dump crash logs if: ${{ failure() }} continue-on-error: true run: | tail --verbose --lines=+1 rb_crash_*.txt exit 1 - uses: ./.github/actions/slack with: label: ${{ matrix.test_task }} ${{ matrix.configure }} 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: macos-14 needs: [make] steps: - run: exit 1 working-directory: if: ${{ contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') }} # Separated from `make` job to avoid making it a required status check for now ruby-bench: strategy: matrix: include: # Test --call-threshold=2 with 2 iterations in total - ruby_opts: '--zjit-call-threshold=2' bench_opts: '--warmup=1 --bench=1 --excludes=lobsters' configure: '--enable-zjit=dev_nodebug' # --enable-zjit=dev is too slow runs-on: macos-14 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/macos - 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" ${{ matrix.configure }} - run: make install # setup/directories set MAKEFLAGS=-j4 for macOS, which randomly fails sqlite3.gem builds - name: Unset MAKEFLAGS run: echo "MAKEFLAGS=" >> "$GITHUB_ENV" - 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 "zjit::../build/install/bin/ruby ${{ matrix.ruby_opts }}" ${{ 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() }} defaults: run: working-directory: build