summaryrefslogtreecommitdiff
path: root/.github/workflows/yjit-ubuntu.yml
blob: ae108d72a5bbbc31c94484760468140386d7107a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
name: YJIT Ubuntu
on:
  push:
    paths-ignore:
      - 'doc/**'
      - '**.md'
      - '**.rdoc'
      - '**/.document'
  pull_request:
    paths-ignore:
      - 'doc/**'
      - '**.md'
      - '**.rdoc'
      - '**/.document'

concurrency:
  group: ${{ github.workflow }} / ${{ startsWith(github.event_name, 'pull') && github.ref_name || github.sha }}
  cancel-in-progress: ${{ startsWith(github.event_name, 'pull') }}

jobs:
  cargo:
    name: Rust cargo test
    # GitHub Action's image seems to already contain a Rust 1.58.0.
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v3
      # For now we can't run cargo test --offline because it complains about the
      # capstone dependency, even though the dependency is optional
      #- run: cargo test --offline
      - run: RUST_BACKTRACE=1 cargo test
        working-directory: yjit
      # Also compile and test with all features enabled
      - run: RUST_BACKTRACE=1 cargo test --all-features
        working-directory: yjit
      # Check that we can build in release mode too
      - run: cargo build --release
        working-directory: yjit
  make:
    strategy:
      fail-fast: false
      matrix:
        include:
          - test_task: "check-yjit-bindings"
            configure: "--with-gcc=clang-12 --enable-yjit=dev"

          - test_task: "check"
            configure: "--enable-yjit RUSTC='rustc +1.58.1'" # release build
            rust_version: "1.58.1"

          - test_task: "check"
            configure: "--enable-yjit=dev"

          - test_task: "check"
            configure: "--enable-yjit=dev"
            yjit_opts: "--yjit-call-threshold=1"

          - test_task: "test-all TESTS=--repeat-count=2"
            configure: "--enable-yjit=dev"

          - test_task: "test-bundled-gems"
            configure: "--enable-yjit=dev"

          - test_task: "yjit-bench"
            configure: "--enable-yjit=dev"
            yjit_bench_opts: "--yjit-stats"
    env:
      GITPULLOPTIONS: --no-tags origin ${{github.ref}}
      RUN_OPTS: ${{ matrix.yjit_opts }}
      YJIT_BENCH_OPTS: ${{ matrix.yjit_bench_opts }}
      RUBY_DEBUG: ci
      BUNDLE_JOBS: 8 # for yjit-bench
    runs-on: ubuntu-20.04
    if: ${{ !contains(github.event.head_commit.message, '[DOC]') && !contains(github.event.pull_request.labels.*.name, 'Documentation') }}
    steps:
      - run: mkdir build
        working-directory:
      - name: Install libraries
        run: |
          set -x
          sudo apt-get update -q || :
          sudo apt-get install --no-install-recommends -q -y build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev bison autoconf ruby
      - name: Install Rust
        if: ${{ matrix.rust_version }}
        run: rustup install ${{ matrix.rust_version }} --profile minimal
      - name: git config
        run: |
          git config --global advice.detachedHead 0
          git config --global init.defaultBranch garbage
      - uses: actions/checkout@v3
        with:
          path: src
      - uses: actions/cache@v3
        with:
          path: src/.downloaded-cache
          key: downloaded-cache
      - name: Fixed world writable dirs
        run: |
          chmod -v go-w $HOME $HOME/.config
          sudo chmod -R go-w /usr/share
          sudo bash -c 'IFS=:; for d in '"$PATH"'; do chmod -v go-w $d; done' || :
      - name: Set ENV
        run: |
          echo "GNUMAKEFLAGS=-j$((1 + $(nproc --all)))" >> $GITHUB_ENV
      - run: ./autogen.sh
        working-directory: src
      - name: Run configure
        run: ../src/configure -C --disable-install-doc --prefix=$(pwd)/install ${{ matrix.configure }}
      - run: make incs
      - run: make prepare-gems
        if: ${{ matrix.test_task == 'test-bundled-gems' }}
      - run: make -j
      - run: make leaked-globals
        if: ${{ matrix.test_task == 'check' }}
      - name: Create dummy files in build dir
        run: |
          ./miniruby -e '(("a".."z").to_a+("A".."Z").to_a+("0".."9").to_a+%w[foo bar test zzz]).each{|basename|File.write("#{basename}.rb", "raise %(do not load #{basename}.rb)")}'
        if: ${{ matrix.test_task == 'check' }}
      - name: Enable YJIT through ENV
        run: echo "RUBY_YJIT_ENABLE=1" >> $GITHUB_ENV
      - name: make ${{ matrix.test_task }}
        run: make -s -j ${{ matrix.test_task }} RUN_OPTS="$RUN_OPTS" YJIT_BENCH_OPTS="$YJIT_BENCH_OPTS"
        timeout-minutes: 60
        env:
          RUBY_TESTOPTS: "-q --tty=no"
          TEST_BUNDLED_GEMS_ALLOW_FAILURES: ""
          PRECHECK_BUNDLED_GEMS: "no"
        continue-on-error: ${{ matrix.test_task == 'yjit-bench' }}
      - name: Show ${{ github.event.pull_request.base.ref }} GitHub URL for yjit-bench comparison
        run: echo "https://github.com/${BASE_REPO}/commit/${BASE_SHA}"
        env:
          BASE_REPO: ${{ github.event.pull_request.base.repo.full_name }}
          BASE_SHA: ${{ github.event.pull_request.base.sha }}
        if: ${{ matrix.test_task == 'yjit-bench' && startsWith(github.event_name, 'pull') }}
      - uses: k0kubun/action-slack@v2.0.0
        with:
          payload: |
            {
              "ci": "GitHub Actions",
              "env": "${{ github.workflow }} / ${{ matrix.test_task }} ${{ matrix.configure }}",
              "url": "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}",
              "commit": "${{ github.sha }}",
              "branch": "${{ github.ref }}".split('/').reverse()[0]
            }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SIMPLER_ALERTS_URL }} # ruby-lang slack: ruby/simpler-alerts-bot
        if: ${{ failure() && github.event_name == 'push' }}

defaults:
  run:
    working-directory: build