name: rake on: push: branches: [ master, main ] paths-ignore: - 'docs/**' - '**.adoc' - '**.md' - .github/workflows/alpine.yml - .github/workflows/release.yml pull_request: workflow_dispatch: concurrency: group: '${{ github.workflow }}-${{ github.job }}-${{ github.head_ref || github.ref_name }}' cancel-in-progress: true env: BUNDLER_VER: 2.4.22 # Forcing bundler version to ensure that it is consistent everywhere and # does not cause bundler gem reinstalls # bundler/rubygems 2.3.22 is a minimal requirement to support gnu/musl differentiation # https://github.com/rubygems/rubygems/pull/4488 jobs: rubocop: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Install Ruby uses: ruby/setup-ruby@master with: ruby-version: 3.1 bundler: ${{ env.BUNDLER_VER }} bundler-cache: true - name: Bundle run: bundle install --jobs 4 --retry 3 - name: Rubocop run: bundle exec rake rubocop rake: name: test on ruby-${{ matrix.ruby }} ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: ruby: [ '3.2', '3.1', '3.0', '2.7' ] os: [ ubuntu-latest, windows-latest, macos-latest ] steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Setup packages if: startsWith(matrix.os, 'macos') run: brew install autoconf automake libtool - name: Install Ruby uses: ruby/setup-ruby@master with: ruby-version: ${{ matrix.ruby }} bundler: ${{ env.BUNDLER_VER }} bundler-cache: true - name: Process cache uses: actions/cache@v3 id: cache with: path: lib/expressir/express/express_parser.* key: v4-${{ matrix.os }}-${{ matrix.ruby }}-${{ hashFiles('ext/express-parser/extconf.rb', 'ext/express-parser/antlrgen/**', 'ext/express-parser/express_parser.cpp', '.git/modules/ext/express-parser/antlr4-upstream/HEAD') }} - name: Build native extension if: steps.cache.outputs.cache-hit != 'true' run: bundle exec rake compile - name: Run tests run: | bundle exec rake cat .rspec_status # test release workflow pack-ruby: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Setup Ruby uses: ruby/setup-ruby@master with: ruby-version: '3.0' # bundler-cache: true important to not use cache because it leads to "cannot find -lrice" # more info https://github.com/lutaml/expressir/runs/2097658383?check_suite_focus=true#step:7:2126 bundler: ${{ env.BUNDLER_VER }} - name: Bundle run: bundle install --jobs 4 --retry 3 - name: Build gem without native extension run: gem build expressir.gemspec - name: Package gem without native extension uses: actions/upload-artifact@v3 with: name: pkg-ruby path: expressir-*.gem pack: runs-on: ubuntu-latest strategy: fail-fast: false matrix: platform: [ linux-gnu, windows, darwin ] steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Setup Ruby uses: ruby/setup-ruby@master with: ruby-version: '3.0' # bundler-cache: true important to not use cache because it leads to "cannot find -lrice" # more info https://github.com/lutaml/expressir/runs/2097658383?check_suite_focus=true#step:7:2126 bundler: ${{ env.BUNDLER_VER }} - name: Bundle run: bundle install --jobs 4 --retry 3 - name: Enable swap run: | sudo fallocate -l 15g /compile.swap sudo chmod 600 /compile.swap sudo mkswap /compile.swap sudo swapon /compile.swap sudo swapon --all --verbose - name: Build gem with native extension run: bundle exec rake gem:${{ matrix.platform }} - name: Package gem with native extension uses: actions/upload-artifact@v3 with: name: pkg-${{ matrix.platform }} path: pkg/*.gem verify-ruby: name: verify ruby gem on ruby-${{ matrix.ruby }} ${{ matrix.os }} needs: pack-ruby runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: ruby: [ '3.2', '3.1', '3.0', '2.7' ] os: [ ubuntu-latest, windows-latest, macos-latest ] steps: - name: Install Ruby uses: ruby/setup-ruby@master with: ruby-version: ${{ matrix.ruby }} bundler-cache: true bundler: ${{ env.BUNDLER_VER }} - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Bundle run: bundle install --jobs 4 --retry 3 - name: Download packaged gem uses: actions/download-artifact@v3 with: name: pkg-ruby path: pkg - name: Install gem run: gem install -l pkg/expressir-*.gem - name: Verify run: | cd $(ruby -e "puts RbConfig::TOPDIR + '\/lib\/ruby\/gems\/' + RbConfig::CONFIG['ruby_version'] + '\/gems\/expressir*'") ruby bin/rspec cat .rspec_status || echo ".rspec_status was not found" verify-darwin: name: verify MacOS binary gem on ruby-${{ matrix.ruby }} needs: pack runs-on: macos-latest strategy: fail-fast: false matrix: ruby: [ '3.2', '3.1', '3.0', '2.7' ] steps: - name: Install Ruby uses: ruby/setup-ruby@master with: ruby-version: ${{ matrix.ruby }} bundler-cache: true bundler: ${{ env.BUNDLER_VER }} - name: Checkout uses: actions/checkout@v4 - name: Bundle run: bundle install --jobs 4 --retry 3 - name: Download packaged gem uses: actions/download-artifact@v3 with: name: pkg-darwin path: pkg - name: Install binary gem run: gem install -l pkg/expressir-*-$(ruby -e "puts RUBY_PLATFORM.sub(/darwin\d{2}$/, 'darwin')").gem # MacOS with have something like x86_64-darwin19, others just x86_64-linux - name: Verify run: | cd $(ruby -e "puts RbConfig::TOPDIR + '\/lib\/ruby\/gems\/' + RbConfig::CONFIG['ruby_version'] + '\/gems\/expressir*'") ruby bin/rspec cat .rspec_status || echo ".rspec_status was not found" verify-linux-gnu: name: verify Linux (gnu) binary gem on ruby-${{ matrix.ruby }} needs: pack runs-on: ubuntu-latest strategy: fail-fast: false matrix: ruby: [ '3.2', '3.1', '3.0', '2.7' ] steps: - name: Install Ruby uses: ruby/setup-ruby@master with: ruby-version: ${{ matrix.ruby }} bundler-cache: true bundler: ${{ env.BUNDLER_VER }} - name: Checkout uses: actions/checkout@v4 - name: Bundle run: bundle install --jobs 4 --retry 3 - name: Download packaged gem uses: actions/download-artifact@v3 with: name: pkg-linux-gnu path: pkg - name: Install binary gem run: gem install -l pkg/expressir-*-$(ruby -e "puts RUBY_PLATFORM")-gnu.gem - name: Verify run: | cd $(ruby -e "puts RbConfig::TOPDIR + '\/lib\/ruby\/gems\/' + RbConfig::CONFIG['ruby_version'] + '\/gems\/expressir*'") ruby bin/rspec cat .rspec_status || echo ".rspec_status was not found" verify-windows: name: verify Windows binary gem on ruby-${{ matrix.ruby }} needs: pack continue-on-error: true runs-on: windows-latest strategy: fail-fast: false # Ruby 3.1 fails # https://github.com/lutaml/expressir/issues/103 matrix: ruby: [ '3.2', '3.1', '3.0', '2.7' ] steps: - name: Install Ruby uses: ruby/setup-ruby@master with: ruby-version: ${{ matrix.ruby }} bundler-cache: true bundler: ${{ env.BUNDLER_VER }} - name: Checkout uses: actions/checkout@v4 - name: Bundle run: bundle install --jobs 4 --retry 3 - name: Download packaged gem uses: actions/download-artifact@v3 with: name: pkg-windows path: pkg - name: Install binary gem run: gem install -l pkg/expressir-*-$(ruby -e "puts RUBY_PLATFORM").gem - name: Verify run: | cd $(ruby -e "puts RbConfig::TOPDIR + '\/lib\/ruby\/gems\/' + RbConfig::CONFIG['ruby_version'] + '\/gems\/expressir*'") ruby bin/rspec cat .rspec_status || echo ".rspec_status was not found"