From d9c202cc3bd086b1bca54f15d35f5e0240507704 Mon Sep 17 00:00:00 2001 From: Hans Lemuet Date: Thu, 6 Jan 2022 11:03:37 +0100 Subject: [PATCH] Use Appraisal in CI Appraisal allows us to test with different versions of gems. In addition to GitHub Actions' matrix functionality, we can use this to test against different combinations of Ruby and Rails versions. As part of this, we've also made the following changes to our CI pipeline: Rename Appraisal rails-head to rails-main Loosen version constraints to minor versions Use setup-ruby's caching mechanism Means we don't need to configure vendor/bundle as the path here. We should probably do this for other workflows too. Don't trigger CI twice on PRs Co-authored-by: Simon Fish --- .github/workflows/ci.yml | 75 ++++++++----------- Appraisals | 8 +- Gemfile | 4 + Gemfile.lock | 2 +- docs/CHANGELOG.md | 4 + gemfiles/rails_5.2.gemfile | 19 +++++ gemfiles/rails_6.0.gemfile | 20 +++++ gemfiles/rails_6.1.gemfile | 15 ++-- gemfiles/rails_7.0.gemfile | 12 ++- gemfiles/rails_7.1.gemfile | 12 ++- ...{rails_head.gemfile => rails_main.gemfile} | 10 ++- lib/view_component/test_helpers.rb | 3 + 12 files changed, 126 insertions(+), 58 deletions(-) create mode 100644 gemfiles/rails_5.2.gemfile create mode 100644 gemfiles/rails_6.0.gemfile rename gemfiles/{rails_head.gemfile => rails_main.gemfile} (61%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0434336b9..1143826aa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,10 @@ name: CI -on: [push, pull_request] +on: + pull_request: + push: + branches: + - main jobs: benchmark: @@ -22,65 +26,50 @@ jobs: bundle exec rake partial_benchmark bundle exec rake translatable_benchmark test: + name: test (${{ matrix.rails_version }}, ${{ matrix.ruby_version }}, ${{ matrix.mode }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: + rails_version: ["6.1", "7.0", "7.1", "main"] + ruby_version: ["3.1", "3.2", "3.3"] + mode: ["capture_patch_enabled", "capture_patch_disabled"] include: - - rails_version: "6.1.4.4" - ruby_version: "3.0" + # Run against all previously supported Rails versions for Ruby 3.0 + - ruby_version: "3.0" + rails_version: "6.1" mode: "capture_patch_enabled" - - rails_version: "7.0.2.3" - ruby_version: "3.0" - mode: "capture_patch_enabled" - - rails_version: "main" - ruby_version: "3.1" - mode: "capture_patch_enabled" - - rails_version: "7.1.1" - ruby_version: "3.2" - mode: "capture_patch_enabled" - - rails_version: "main" - ruby_version: "3.2" - mode: "capture_patch_enabled" - - rails_version: "6.1.4.4" - ruby_version: "3.0" - mode: "capture_patch_disabled" - - rails_version: "7.0.2.3" - ruby_version: "3.0" - mode: "capture_patch_disabled" - - rails_version: "main" - ruby_version: "3.1" - mode: "capture_patch_disabled" - - rails_version: "7.1.1" - ruby_version: "3.2" - mode: "capture_patch_disabled" - - rails_version: "main" - ruby_version: "3.2" + - ruby_version: "3.0" + rails_version: "6.1" mode: "capture_patch_disabled" - - rails_version: "7.1.1" - ruby_version: "3.3" + - ruby_version: "3.0" + rails_version: "7.0" + mode: "capture_patch_enabled" + - ruby_version: "3.0" + rails_version: "7.0" mode: "capture_patch_disabled" - - rails_version: "main" - ruby_version: "3.3" + - ruby_version: "3.0" + rails_version: "7.1" + mode: "capture_patch_enabled" + - ruby_version: "3.0" + rails_version: "7.1" mode: "capture_patch_disabled" + env: + BUNDLE_GEMFILE: gemfiles/rails_${{ matrix.rails_version }}.gemfile steps: - uses: actions/checkout@v4.1.1 - name: Setup Ruby uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby_version }} - - uses: actions/cache@v3 - with: - path: vendor/bundle - key: gems-build-rails-${{ matrix.rails_version }}-ruby-${{ matrix.ruby_version }}-${{ hashFiles('**/Gemfile.lock') }} + bundler-cache: true - name: Build and test with Rake + # Code-reloading isn't compatible with simplecov, so we need to run once + # to collect coverage, and again to test reloads. run: | - bundle config path vendor/bundle - bundle update - # Code-reloading isn't compatible with simplecov, so we need to run once - # to collect coverage, and again to test reloads. - MEASURE_COVERAGE=true bundle exec rake test spec - ENABLE_RELOADING=true bundle exec rake test spec + bundle exec appraisal rails-${{ matrix.rails_version }} bundle + MEASURE_COVERAGE=true bundle exec appraisal rails-${{ matrix.rails_version }} rake + ENABLE_RELOADING=true bundle exec appraisal rails-${{ matrix.rails_version }} rake env: RAISE_ON_WARNING: 1 RAILS_VERSION: ${{ matrix.rails_version }} diff --git a/Appraisals b/Appraisals index 02dfc4ebc..31446f8f7 100644 --- a/Appraisals +++ b/Appraisals @@ -1,7 +1,7 @@ # frozen_string_literal: true appraise "rails-6.1" do - gem "rails", "~> 6.1.0" + gem "rails", "~> 6.1" gem "tailwindcss-rails", "~> 2.0" # Required for Ruby 3.1.0 @@ -11,16 +11,16 @@ appraise "rails-6.1" do end appraise "rails-7.0" do - gem "rails", "~> 7.0.0" + gem "rails", "~> 7.0" gem "tailwindcss-rails", "~> 2.0" end appraise "rails-7.1" do - gem "rails", "~> 7.1.0" + gem "rails", "~> 7.1" gem "tailwindcss-rails", "~> 2.0" end -appraise "rails-head" do +appraise "rails-main" do gem "rails", github: "rails/rails", branch: "main" gem "tailwindcss-rails", "~> 2.0" end diff --git a/Gemfile b/Gemfile index 32791882e..fdced803c 100644 --- a/Gemfile +++ b/Gemfile @@ -18,6 +18,10 @@ group :test do gem "selenium-webdriver", "4.9.0" # 4.9.1 requires Ruby 3+ end +group :development, :test do + gem "appraisal", "~> 2.5" +end + if RUBY_VERSION >= "3.1" gem "net-imap", require: false gem "net-pop", require: false diff --git a/Gemfile.lock b/Gemfile.lock index bdbfbf6d4..826a8cf57 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -326,7 +326,7 @@ PLATFORMS ruby DEPENDENCIES - appraisal (~> 2.4) + appraisal (~> 2.5) benchmark-ips (~> 2.13.0) better_html bundler (~> 2) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 07a6a6454..5f1b01e01 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -10,6 +10,10 @@ nav_order: 5 ## main +* Update CI configuration to use `Appraisal`. + + *Hans Lemuet, Simon Fish* + ## 3.9.0 * Don’t break `rails stats` if ViewComponent path is missing. diff --git a/gemfiles/rails_5.2.gemfile b/gemfiles/rails_5.2.gemfile new file mode 100644 index 000000000..383c30848 --- /dev/null +++ b/gemfiles/rails_5.2.gemfile @@ -0,0 +1,19 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "capybara", "~> 3" +gem "rails", "~> 5.2.0" +gem "rspec-rails", "~> 5" + +group :test do + gem "cuprite", "~> 0.8" + gem "puma", "~> 5" + gem "selenium-webdriver", "~> 4" +end + +group :development, :test do + gem "appraisal", github: "thoughtbot/appraisal" +end + +gemspec path: "../" diff --git a/gemfiles/rails_6.0.gemfile b/gemfiles/rails_6.0.gemfile new file mode 100644 index 000000000..77de2ea0c --- /dev/null +++ b/gemfiles/rails_6.0.gemfile @@ -0,0 +1,20 @@ +# This file was generated by Appraisal + +source "https://rubygems.org" + +gem "capybara", "~> 3" +gem "rails", "~> 6.0.0" +gem "rspec-rails", "~> 5" +gem "tailwindcss-rails", "~> 2.0" + +group :test do + gem "cuprite", "~> 0.8" + gem "puma", "~> 5" + gem "selenium-webdriver", "~> 4" +end + +group :development, :test do + gem "appraisal", github: "thoughtbot/appraisal" +end + +gemspec path: "../" diff --git a/gemfiles/rails_6.1.gemfile b/gemfiles/rails_6.1.gemfile index 8c7e7c768..a86ad344d 100644 --- a/gemfiles/rails_6.1.gemfile +++ b/gemfiles/rails_6.1.gemfile @@ -3,18 +3,23 @@ source "https://rubygems.org" gem "capybara", "~> 3" -gem "rails", "~> 6.1.0" +gem "rails", "~> 6.1" gem "rspec-rails", "~> 5" -gem "debug" -gem "tailwindcss-rails", "~> 2.0" -gem "net-smtp", require: false gem "net-imap", require: false gem "net-pop", require: false +gem "net-smtp", require: false +gem "debug" +gem "tailwindcss-rails", "~> 2.0" group :test do - gem "cuprite", "~> 0.8" + gem "cuprite", "~> 0.15" gem "puma", "~> 6" + gem "warning" gem "selenium-webdriver", "4.9.0" end +group :development, :test do + gem "appraisal", "~> 2.5" +end + gemspec path: "../" diff --git a/gemfiles/rails_7.0.gemfile b/gemfiles/rails_7.0.gemfile index d08c4f8e2..b525dc286 100644 --- a/gemfiles/rails_7.0.gemfile +++ b/gemfiles/rails_7.0.gemfile @@ -3,15 +3,23 @@ source "https://rubygems.org" gem "capybara", "~> 3" -gem "rails", "~> 7.0.0" +gem "rails", "~> 7.0" gem "rspec-rails", "~> 5" +gem "net-imap", require: false +gem "net-pop", require: false +gem "net-smtp", require: false gem "debug" gem "tailwindcss-rails", "~> 2.0" group :test do - gem "cuprite", "~> 0.8" + gem "cuprite", "~> 0.15" gem "puma", "~> 6" + gem "warning" gem "selenium-webdriver", "4.9.0" end +group :development, :test do + gem "appraisal", "~> 2.5" +end + gemspec path: "../" diff --git a/gemfiles/rails_7.1.gemfile b/gemfiles/rails_7.1.gemfile index 28e79bf1e..99c1d70b3 100644 --- a/gemfiles/rails_7.1.gemfile +++ b/gemfiles/rails_7.1.gemfile @@ -3,15 +3,23 @@ source "https://rubygems.org" gem "capybara", "~> 3" -gem "rails", "~> 7.1.0" +gem "rails", "~> 7.1" gem "rspec-rails", "~> 5" +gem "net-imap", require: false +gem "net-pop", require: false +gem "net-smtp", require: false gem "debug" gem "tailwindcss-rails", "~> 2.0" group :test do - gem "cuprite", "~> 0.8" + gem "cuprite", "~> 0.15" gem "puma", "~> 6" + gem "warning" gem "selenium-webdriver", "4.9.0" end +group :development, :test do + gem "appraisal", "~> 2.5" +end + gemspec path: "../" diff --git a/gemfiles/rails_head.gemfile b/gemfiles/rails_main.gemfile similarity index 61% rename from gemfiles/rails_head.gemfile rename to gemfiles/rails_main.gemfile index 904c552a7..51d04f21f 100644 --- a/gemfiles/rails_head.gemfile +++ b/gemfiles/rails_main.gemfile @@ -5,13 +5,21 @@ source "https://rubygems.org" gem "capybara", "~> 3" gem "rails", github: "rails/rails", branch: "main" gem "rspec-rails", "~> 5" +gem "net-imap", require: false +gem "net-pop", require: false +gem "net-smtp", require: false gem "debug" gem "tailwindcss-rails", "~> 2.0" group :test do - gem "cuprite", "~> 0.8" + gem "cuprite", "~> 0.15" gem "puma", "~> 6" + gem "warning" gem "selenium-webdriver", "4.9.0" end +group :development, :test do + gem "appraisal", "~> 2.5" +end + gemspec path: "../" diff --git a/lib/view_component/test_helpers.rb b/lib/view_component/test_helpers.rb index ae182629c..c4368ff01 100644 --- a/lib/view_component/test_helpers.rb +++ b/lib/view_component/test_helpers.rb @@ -255,9 +255,11 @@ def __vc_test_helpers_build_controller(klass) def __vc_test_helpers_preview_class result = if respond_to?(:described_class) + # :nocov: raise "`render_preview` expected a described_class, but it is nil." if described_class.nil? "#{described_class}Preview" + # :nocov: else self.class.name.gsub("Test", "Preview") end @@ -265,5 +267,6 @@ def __vc_test_helpers_preview_class rescue NameError raise NameError, "`render_preview` expected to find #{result}, but it does not exist." end + # :nocov: end end