Migrate from Yarn Classic to pnpm #1273
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: React on Rails Pro - Integration Tests | |
| on: | |
| push: | |
| branches: | |
| - 'master' | |
| # Always trigger on master; docs-only detection handles skipping heavy jobs | |
| pull_request: | |
| paths-ignore: | |
| - '**.md' | |
| - 'docs/**' | |
| - 'react_on_rails/lib/**' | |
| - 'react_on_rails/spec/**' | |
| - 'packages/react_on_rails/**' | |
| workflow_dispatch: | |
| inputs: | |
| force_run: | |
| description: 'Force run all jobs (bypass detect-changes)' | |
| required: false | |
| type: boolean | |
| default: false | |
| defaults: | |
| run: | |
| working-directory: react_on_rails_pro | |
| jobs: | |
| detect-changes: | |
| permissions: | |
| contents: read | |
| actions: read | |
| runs-on: ubuntu-22.04 | |
| outputs: | |
| docs_only: ${{ steps.detect.outputs.docs_only }} | |
| run_pro_lint: ${{ steps.detect.outputs.run_pro_lint }} | |
| run_pro_tests: ${{ steps.detect.outputs.run_pro_tests }} | |
| has_full_ci_label: ${{ steps.check-label.outputs.result }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| persist-credentials: false | |
| - name: Check for full-ci label | |
| id: check-label | |
| uses: ./.github/actions/check-full-ci-label | |
| - name: Detect relevant changes | |
| id: detect | |
| working-directory: . | |
| run: | | |
| # If force_run is true OR full-ci label is present, run everything | |
| if [ "${{ inputs.force_run }}" = "true" ] || [ "${{ steps.check-label.outputs.result }}" = "true" ]; then | |
| echo "run_pro_lint=true" >> "$GITHUB_OUTPUT" | |
| echo "run_pro_tests=true" >> "$GITHUB_OUTPUT" | |
| echo "docs_only=false" >> "$GITHUB_OUTPUT" | |
| exit 0 | |
| fi | |
| BASE_REF="${{ github.event.pull_request.base.sha || github.event.before || 'origin/master' }}" | |
| script/ci-changes-detector "$BASE_REF" | |
| shell: bash | |
| - name: Guard docs-only master pushes | |
| if: github.event_name == 'push' && github.ref == 'refs/heads/master' | |
| uses: ./.github/actions/ensure-master-docs-safety | |
| with: | |
| docs-only: ${{ steps.detect.outputs.docs_only }} | |
| previous-sha: ${{ github.event.before }} | |
| # Build webpack test bundles for dummy app | |
| build-dummy-app-webpack-test-bundles: | |
| needs: detect-changes | |
| if: | | |
| !( | |
| github.event_name == 'push' && | |
| github.ref == 'refs/heads/master' && | |
| needs.detect-changes.outputs.docs_only == 'true' | |
| ) && ( | |
| github.ref == 'refs/heads/master' || | |
| github.event_name == 'workflow_dispatch' || | |
| needs.detect-changes.outputs.run_pro_tests == 'true' | |
| ) | |
| runs-on: ubuntu-22.04 | |
| env: | |
| REACT_ON_RAILS_PRO_LICENSE: ${{ secrets.REACT_ON_RAILS_PRO_LICENSE_V2 }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| persist-credentials: false | |
| - name: Setup Ruby | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: 3.3.7 | |
| bundler: 2.5.4 | |
| - name: Setup Node | |
| uses: ./.github/actions/setup-node-with-retry | |
| with: | |
| # Pin to 22.12.x (LTS) - V8 bug from issue #56010 was fixed in 22.12.0 | |
| # https://github.com/nodejs/node/issues/56010 | |
| node-version: '22.12.x' | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| - name: Get pnpm store directory | |
| shell: bash | |
| run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV | |
| - name: Setup pnpm cache | |
| uses: actions/cache@v4 | |
| with: | |
| path: ${{ env.STORE_PATH }} | |
| key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} | |
| restore-keys: | | |
| ${{ runner.os }}-pnpm-store- | |
| - name: Print system information | |
| run: | | |
| echo "Linux release: "; cat /etc/issue | |
| echo "Current user: "; whoami | |
| echo "Current directory: "; pwd | |
| echo "Ruby version: "; ruby -v | |
| echo "Node version: "; node -v | |
| echo "pnpm version: "; pnpm --version | |
| echo "Bundler version: "; bundle --version | |
| - name: Cache Pro dummy app Ruby gems | |
| uses: actions/cache@v4 | |
| with: | |
| path: react_on_rails_pro/spec/dummy/vendor/bundle | |
| key: v4-pro-dummy-app-gem-cache-${{ hashFiles('react_on_rails_pro/spec/dummy/Gemfile.lock') }} | |
| - name: Install Node modules with pnpm for Pro package | |
| run: | | |
| pnpm add -g yalc | |
| pnpm install --frozen-lockfile | |
| - name: Install Node modules with pnpm for Pro dummy app | |
| # --ignore-workspace prevents pnpm from treating this as part of the parent workspace | |
| # The Pro dummy app has its own dependencies and uses yalc links | |
| run: cd spec/dummy && pnpm install --ignore-workspace | |
| - name: Install Ruby Gems for Pro dummy app | |
| run: | | |
| gem install bundler -v "2.5.4" | |
| cd spec/dummy | |
| bundle lock --add-platform 'x86_64-linux' | |
| bundle _2.5.4_ check || bundle _2.5.4_ install --jobs=4 --retry=3 | |
| - name: Generate file-system based entrypoints | |
| run: cd spec/dummy && bundle exec rake react_on_rails:generate_packs | |
| - name: Build test bundles for Pro dummy app | |
| run: cd spec/dummy && pnpm run build:test | |
| - id: get-sha | |
| run: echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" | |
| - name: Save test webpack bundles to cache | |
| uses: actions/cache/save@v4 | |
| with: | |
| path: | | |
| react_on_rails_pro/spec/dummy/public/webpack/test | |
| react_on_rails_pro/spec/dummy/ssr-generated | |
| key: v4-pro-dummy-app-webpack-bundle-${{ steps.get-sha.outputs.sha }} | |
| # RSpec integration tests with Node renderer | |
| rspec-dummy-app-node-renderer: | |
| needs: | |
| - detect-changes | |
| - build-dummy-app-webpack-test-bundles | |
| if: | | |
| !( | |
| github.event_name == 'push' && | |
| github.ref == 'refs/heads/master' && | |
| needs.detect-changes.outputs.docs_only == 'true' | |
| ) && ( | |
| github.ref == 'refs/heads/master' || | |
| github.event_name == 'workflow_dispatch' || | |
| needs.detect-changes.outputs.run_pro_tests == 'true' | |
| ) | |
| runs-on: ubuntu-22.04 | |
| env: | |
| REACT_ON_RAILS_PRO_LICENSE: ${{ secrets.REACT_ON_RAILS_PRO_LICENSE_V2 }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| persist-credentials: false | |
| - name: Setup Ruby | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: 3.3.7 | |
| bundler: 2.5.4 | |
| - name: Setup Node | |
| uses: ./.github/actions/setup-node-with-retry | |
| with: | |
| # Pin to 22.12.x (LTS) - V8 bug from issue #56010 was fixed in 22.12.0 | |
| # https://github.com/nodejs/node/issues/56010 | |
| node-version: '22.12.x' | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| - name: Get pnpm store directory | |
| shell: bash | |
| run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV | |
| - name: Setup pnpm cache | |
| uses: actions/cache@v4 | |
| with: | |
| path: ${{ env.STORE_PATH }} | |
| key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} | |
| restore-keys: | | |
| ${{ runner.os }}-pnpm-store- | |
| - name: Print system information | |
| run: | | |
| echo "Linux release: "; cat /etc/issue | |
| echo "Current user: "; whoami | |
| echo "Current directory: "; pwd | |
| echo "Ruby version: "; ruby -v | |
| echo "Node version: "; node -v | |
| echo "pnpm version: "; pnpm --version | |
| echo "Bundler version: "; bundle --version | |
| - name: Cache Pro package Ruby gems | |
| uses: actions/cache@v4 | |
| with: | |
| path: react_on_rails_pro/vendor/bundle | |
| key: v4-pro-package-gem-cache-${{ hashFiles('react_on_rails_pro/react_on_rails_pro.gemspec') }} | |
| - name: Cache Pro dummy app Ruby gems | |
| uses: actions/cache@v4 | |
| with: | |
| path: react_on_rails_pro/spec/dummy/vendor/bundle | |
| key: v4-pro-dummy-app-gem-cache-${{ hashFiles('react_on_rails_pro/spec/dummy/Gemfile.lock') }} | |
| - name: Remove old webpack bundles | |
| run: | | |
| rm -rf spec/dummy/public/webpack | |
| rm -rf spec/dummy/ssr-generated | |
| - id: get-sha | |
| run: echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" | |
| - name: Restore test webpack bundles from cache | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| react_on_rails_pro/spec/dummy/public/webpack/test | |
| react_on_rails_pro/spec/dummy/ssr-generated | |
| key: v4-pro-dummy-app-webpack-bundle-${{ steps.get-sha.outputs.sha }} | |
| - name: Install Ruby Gems for Pro dummy app | |
| run: | | |
| gem install bundler -v "2.5.4" | |
| cd spec/dummy | |
| bundle lock --add-platform 'x86_64-linux' | |
| bundle _2.5.4_ check || bundle _2.5.4_ install --jobs=4 --retry=3 | |
| - name: Install Node modules with pnpm for Pro package | |
| run: | | |
| pnpm add -g yalc | |
| pnpm install --frozen-lockfile | |
| - name: Install Node modules with pnpm for Pro dummy app | |
| # --ignore-workspace prevents pnpm from treating this as part of the parent workspace | |
| # The Pro dummy app has its own dependencies and uses yalc links | |
| run: cd spec/dummy && pnpm install --ignore-workspace | |
| - name: Ensure minimum required Chrome version | |
| run: | | |
| echo -e "Installed $(google-chrome --version)\n" | |
| MINIMUM_REQUIRED_CHROME_VERSION=75 | |
| INSTALLED_CHROME_MAJOR_VERSION="$(google-chrome --version | tr ' .' '\t' | cut -f3)" | |
| if [[ $INSTALLED_CHROME_MAJOR_VERSION -lt $MINIMUM_REQUIRED_CHROME_VERSION ]]; then | |
| wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - | |
| sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' | |
| sudo apt-get update | |
| sudo apt-get install google-chrome-stable | |
| echo -e "\nInstalled $(google-chrome --version)" | |
| fi | |
| - name: Generate file-system based entrypoints | |
| run: cd spec/dummy && bundle exec rake react_on_rails:generate_packs | |
| - name: Run Pro Node renderer in background | |
| run: | | |
| cd spec/dummy | |
| pnpm run node-renderer & | |
| - name: Run Rails server in background | |
| run: | | |
| cd spec/dummy | |
| RAILS_ENV="test" rails server & | |
| - name: Wait for Rails server to start | |
| run: | | |
| timeout=60 | |
| elapsed=0 | |
| while ! curl -s http://localhost:3000 > /dev/null; do | |
| sleep 1 | |
| elapsed=$((elapsed + 1)) | |
| if [ $elapsed -ge $timeout ]; then | |
| echo "Timeout waiting for Rails server to start after ${timeout}s" | |
| exit 1 | |
| fi | |
| done | |
| echo "Rails server started after ${elapsed}s" | |
| - name: Run RSpec tests for Pro dummy app | |
| run: | | |
| cd spec/dummy | |
| bundle exec rspec \ | |
| --profile 10 \ | |
| --format progress \ | |
| --format RspecJunitFormatter \ | |
| --out ~/rspec/rspec.xml \ | |
| --format documentation | |
| - name: Store test results | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: pro-rspec-integration-results | |
| path: ~/rspec | |
| - name: Store screenshots | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: pro-rspec-screenshots | |
| path: react_on_rails_pro/spec/dummy/tmp/screenshots | |
| - name: Store Capybara artifacts | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: pro-rspec-capybara | |
| path: react_on_rails_pro/spec/dummy/tmp/capybara | |
| - name: Store test log | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: pro-rspec-test-log | |
| path: react_on_rails_pro/spec/dummy/log/test.log | |
| - name: Store pnpm debug log | |
| uses: actions/upload-artifact@v4 | |
| if: failure() | |
| with: | |
| name: pro-rspec-pnpm-debug-log | |
| path: react_on_rails_pro/spec/dummy/pnpm-debug.log | |
| # Playwright E2E tests with Redis service | |
| dummy-app-node-renderer-e2e-tests: | |
| needs: | |
| - detect-changes | |
| - build-dummy-app-webpack-test-bundles | |
| if: | | |
| !( | |
| github.event_name == 'push' && | |
| github.ref == 'refs/heads/master' && | |
| needs.detect-changes.outputs.docs_only == 'true' | |
| ) && ( | |
| github.ref == 'refs/heads/master' || | |
| github.event_name == 'workflow_dispatch' || | |
| needs.detect-changes.outputs.run_pro_tests == 'true' | |
| ) | |
| runs-on: ubuntu-22.04 | |
| env: | |
| REACT_ON_RAILS_PRO_LICENSE: ${{ secrets.REACT_ON_RAILS_PRO_LICENSE_V2 }} | |
| # Redis service container | |
| services: | |
| redis: | |
| image: cimg/redis:6.2.6 | |
| ports: | |
| - 6379:6379 | |
| options: >- | |
| --health-cmd "redis-cli ping" | |
| --health-interval 10s | |
| --health-timeout 5s | |
| --health-retries 5 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| persist-credentials: false | |
| - name: Setup Ruby | |
| uses: ruby/setup-ruby@v1 | |
| with: | |
| ruby-version: 3.3.7 | |
| bundler: 2.5.4 | |
| - name: Setup Node | |
| uses: ./.github/actions/setup-node-with-retry | |
| with: | |
| # Pin to 22.12.x (LTS) - V8 bug from issue #56010 was fixed in 22.12.0 | |
| # https://github.com/nodejs/node/issues/56010 | |
| node-version: '22.12.x' | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| - name: Get pnpm store directory | |
| shell: bash | |
| run: echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV | |
| - name: Setup pnpm cache | |
| uses: actions/cache@v4 | |
| with: | |
| path: ${{ env.STORE_PATH }} | |
| key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} | |
| restore-keys: | | |
| ${{ runner.os }}-pnpm-store- | |
| - name: Print system information | |
| run: | | |
| echo "Linux release: "; cat /etc/issue | |
| echo "Current user: "; whoami | |
| echo "Current directory: "; pwd | |
| echo "Ruby version: "; ruby -v | |
| echo "Node version: "; node -v | |
| echo "pnpm version: "; pnpm --version | |
| echo "Bundler version: "; bundle --version | |
| - name: Cache Pro package Ruby gems | |
| uses: actions/cache@v4 | |
| with: | |
| path: react_on_rails_pro/vendor/bundle | |
| key: v4-pro-package-gem-cache-${{ hashFiles('react_on_rails_pro/react_on_rails_pro.gemspec') }} | |
| - name: Cache Pro dummy app Ruby gems | |
| uses: actions/cache@v4 | |
| with: | |
| path: react_on_rails_pro/spec/dummy/vendor/bundle | |
| key: v4-pro-dummy-app-gem-cache-${{ hashFiles('react_on_rails_pro/spec/dummy/Gemfile.lock') }} | |
| - name: Remove old webpack bundles | |
| run: | | |
| rm -rf spec/dummy/public/webpack | |
| rm -rf spec/dummy/ssr-generated | |
| - id: get-sha | |
| run: echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" | |
| - name: Restore test webpack bundles from cache | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| react_on_rails_pro/spec/dummy/public/webpack/test | |
| react_on_rails_pro/spec/dummy/ssr-generated | |
| key: v4-pro-dummy-app-webpack-bundle-${{ steps.get-sha.outputs.sha }} | |
| - name: Install Ruby Gems for Pro dummy app | |
| run: | | |
| gem install bundler -v "2.5.4" | |
| cd spec/dummy | |
| bundle lock --add-platform 'x86_64-linux' | |
| bundle _2.5.4_ check || bundle _2.5.4_ install --jobs=4 --retry=3 | |
| - name: Install Node modules with pnpm for Pro package | |
| run: | | |
| pnpm add -g yalc | |
| pnpm install --frozen-lockfile | |
| - name: Install Node modules with pnpm for Pro dummy app | |
| # --ignore-workspace prevents pnpm from treating this as part of the parent workspace | |
| # The Pro dummy app has its own dependencies and uses yalc links | |
| run: cd spec/dummy && pnpm install --ignore-workspace | |
| - name: Ensure minimum required Chrome version | |
| run: | | |
| echo -e "Installed $(google-chrome --version)\n" | |
| MINIMUM_REQUIRED_CHROME_VERSION=75 | |
| INSTALLED_CHROME_MAJOR_VERSION="$(google-chrome --version | tr ' .' '\t' | cut -f3)" | |
| if [[ $INSTALLED_CHROME_MAJOR_VERSION -lt $MINIMUM_REQUIRED_CHROME_VERSION ]]; then | |
| wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add - | |
| sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list' | |
| sudo apt-get update | |
| sudo apt-get install google-chrome-stable | |
| echo -e "\nInstalled $(google-chrome --version)" | |
| fi | |
| - name: Generate file-system based entrypoints | |
| run: cd spec/dummy && bundle exec rake react_on_rails:generate_packs | |
| - name: Run Pro Node renderer in background | |
| run: | | |
| cd spec/dummy | |
| pnpm run node-renderer & | |
| - name: Run Rails server in background | |
| run: | | |
| cd spec/dummy | |
| RAILS_ENV="test" rails server & | |
| - name: Wait for Rails server to start | |
| run: | | |
| timeout=300 | |
| elapsed=0 | |
| while ! curl -s http://localhost:3000 > /dev/null; do | |
| sleep 1 | |
| elapsed=$((elapsed + 1)) | |
| if [ $elapsed -ge $timeout ]; then | |
| echo "Timeout waiting for Rails server to start after ${timeout}s" | |
| exit 1 | |
| fi | |
| done | |
| echo "Rails server started after ${elapsed}s" | |
| - name: Install Playwright dependencies | |
| run: cd spec/dummy && pnpm playwright install --with-deps | |
| - name: Run Playwright E2E tests for Pro dummy app | |
| run: cd spec/dummy && pnpm e2e-test | |
| - name: Store test results | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: pro-playwright-test-results | |
| path: react_on_rails_pro/spec/dummy/test-results/results.xml | |
| - name: Store Playwright report | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: pro-playwright-report | |
| path: react_on_rails_pro/spec/dummy/playwright-report |