From 453f02a19f2db84410b750f0a07ed45fefd87191 Mon Sep 17 00:00:00 2001 From: Judah Meek Date: Sat, 15 Nov 2025 19:10:49 -0600 Subject: [PATCH 01/12] empty commit From 27f640ead0e41b8e90daf8c3cc5d2ee388a2bdfe Mon Sep 17 00:00:00 2001 From: Judah Meek Date: Sat, 15 Nov 2025 20:55:28 -0600 Subject: [PATCH 02/12] universalize trigger settings for workflows --- .github/workflows/examples.yml | 2 +- .../workflows/{main.yml => integration-tests.yml} | 4 +++- .github/workflows/lint-js-and-ruby.yml | 8 ++++++++ .github/workflows/package-js-tests.yml | 8 ++++++++ .github/workflows/playwright.yml | 9 +++++++++ .../{pro-package-tests.yml => pro-gem-tests.yml} | 12 ++++++++++++ .github/workflows/pro-integration-tests.yml | 12 ++++++++++++ .github/workflows/pro-lint.yml | 12 ++++++++++++ ...rspec-package-specs.yml => rspec-gem-specs.yml} | 14 ++++++++++---- 9 files changed, 75 insertions(+), 6 deletions(-) rename .github/workflows/{main.yml => integration-tests.yml} (99%) rename .github/workflows/{pro-package-tests.yml => pro-gem-tests.yml} (97%) rename .github/workflows/{rspec-package-specs.yml => rspec-gem-specs.yml} (94%) diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml index 6a639a2b6b..3846462ea7 100644 --- a/.github/workflows/examples.yml +++ b/.github/workflows/examples.yml @@ -1,4 +1,4 @@ -name: Generator tests +name: Generator tests # TODO needs to be duplicated for RoR Pro on: push: diff --git a/.github/workflows/main.yml b/.github/workflows/integration-tests.yml similarity index 99% rename from .github/workflows/main.yml rename to .github/workflows/integration-tests.yml index 8983bbe9fd..d0b4c3497c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/integration-tests.yml @@ -1,4 +1,4 @@ -name: Main test +name: Integration Tests on: push: @@ -7,10 +7,12 @@ on: paths-ignore: - '**.md' - 'docs/**' + - 'react_on_rails_pro/**' pull_request: paths-ignore: - '**.md' - 'docs/**' + - 'react_on_rails_pro/**' workflow_dispatch: inputs: force_run: diff --git a/.github/workflows/lint-js-and-ruby.yml b/.github/workflows/lint-js-and-ruby.yml index f96ead86e9..45d904c932 100644 --- a/.github/workflows/lint-js-and-ruby.yml +++ b/.github/workflows/lint-js-and-ruby.yml @@ -7,11 +7,19 @@ on: paths-ignore: - '**.md' - 'docs/**' + - 'react_on_rails_pro/**' pull_request: paths-ignore: - '**.md' - 'docs/**' + - 'react_on_rails_pro/**' workflow_dispatch: + inputs: + force_run: + description: 'Force run all jobs (bypass detect-changes)' + required: false + type: boolean + default: false jobs: detect-changes: diff --git a/.github/workflows/package-js-tests.yml b/.github/workflows/package-js-tests.yml index 0b404fd1b1..d37b8ba4c9 100644 --- a/.github/workflows/package-js-tests.yml +++ b/.github/workflows/package-js-tests.yml @@ -9,13 +9,21 @@ on: - 'docs/**' - 'lib/**' - 'spec/react_on_rails/**' + - 'react_on_rails_pro/**' pull_request: paths-ignore: - '**.md' - 'docs/**' - 'lib/**' - 'spec/react_on_rails/**' + - 'react_on_rails_pro/**' workflow_dispatch: + inputs: + force_run: + description: 'Force run all jobs (bypass detect-changes)' + required: false + type: boolean + default: false jobs: detect-changes: diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index ddab0abce0..97f73a291f 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -3,7 +3,16 @@ name: Playwright E2E Tests on: push: branches: [master] + paths-ignore: + - '**.md' + - 'docs/**' workflow_dispatch: + inputs: + force_run: + description: 'Force run all jobs (bypass detect-changes)' + required: false + type: boolean + default: false jobs: playwright: diff --git a/.github/workflows/pro-package-tests.yml b/.github/workflows/pro-gem-tests.yml similarity index 97% rename from .github/workflows/pro-package-tests.yml rename to .github/workflows/pro-gem-tests.yml index 99afb186d3..4e4b12edd6 100644 --- a/.github/workflows/pro-package-tests.yml +++ b/.github/workflows/pro-gem-tests.yml @@ -4,7 +4,19 @@ on: push: branches: - 'master' + paths-ignore: + - '**.md' + - 'docs/**' + - 'lib/**' + - 'spec/**' + - 'packages/**' pull_request: + paths-ignore: + - '**.md' + - 'docs/**' + - 'lib/**' + - 'spec/**' + - 'packages/**' workflow_dispatch: inputs: force_run: diff --git a/.github/workflows/pro-integration-tests.yml b/.github/workflows/pro-integration-tests.yml index 05f58fff1a..f9e60521bf 100644 --- a/.github/workflows/pro-integration-tests.yml +++ b/.github/workflows/pro-integration-tests.yml @@ -4,7 +4,19 @@ on: push: branches: - 'master' + paths-ignore: + - '**.md' + - 'docs/**' + - 'lib/**' + - 'spec/**' + - 'packages/react_on_rails/**' pull_request: + paths-ignore: + - '**.md' + - 'docs/**' + - 'lib/**' + - 'spec/**' + - 'packages/react_on_rails/**' workflow_dispatch: inputs: force_run: diff --git a/.github/workflows/pro-lint.yml b/.github/workflows/pro-lint.yml index 4b75353562..1b236531cc 100644 --- a/.github/workflows/pro-lint.yml +++ b/.github/workflows/pro-lint.yml @@ -4,7 +4,19 @@ on: push: branches: - 'master' + paths-ignore: + - '**.md' + - 'docs/**' + - 'lib/**' + - 'spec/**' + - 'packages/react_on_rails/**' pull_request: + paths-ignore: + - '**.md' + - 'docs/**' + - 'lib/**' + - 'spec/**' + - 'packages/react_on_rails/**' workflow_dispatch: inputs: force_run: diff --git a/.github/workflows/rspec-package-specs.yml b/.github/workflows/rspec-gem-specs.yml similarity index 94% rename from .github/workflows/rspec-package-specs.yml rename to .github/workflows/rspec-gem-specs.yml index af91bb3ba9..7f56952121 100644 --- a/.github/workflows/rspec-package-specs.yml +++ b/.github/workflows/rspec-gem-specs.yml @@ -7,15 +7,21 @@ on: paths-ignore: - '**.md' - 'docs/**' - - 'packages/react-on-rails/src/**' - - 'node_package/src/**' + - 'packages/**' + - 'react_on_rails_pro/**' pull_request: paths-ignore: - '**.md' - 'docs/**' - - 'packages/react-on-rails/src/**' - - 'node_package/src/**' + - 'packages/**' + - 'react_on_rails_pro/**' workflow_dispatch: + inputs: + force_run: + description: 'Force run all jobs (bypass detect-changes)' + required: false + type: boolean + default: false jobs: detect-changes: From a8f30e9873c0ca7e16f50c1931c0136256124edf Mon Sep 17 00:00:00 2001 From: Judah Meek Date: Sat, 15 Nov 2025 21:03:28 -0600 Subject: [PATCH 03/12] add rakelib to change detection --- script/ci-changes-detector | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/ci-changes-detector b/script/ci-changes-detector index 16224aa652..c46d3d8c2e 100755 --- a/script/ci-changes-detector +++ b/script/ci-changes-detector @@ -114,7 +114,7 @@ while IFS= read -r file; do ;; # GitHub workflows - .github/workflows/*) + .github/workflows/*|rakelib/*) DOCS_ONLY=false WORKFLOWS_CHANGED=true ;; From bc9bfc81429080b782102f4015e3fe7b53b4ecaf Mon Sep 17 00:00:00 2001 From: Judah Meek Date: Sat, 15 Nov 2025 22:54:11 -0600 Subject: [PATCH 04/12] add more granular detection of rakelib & workflows --- .github/workflows/actionlint.yml | 64 +++++++++++++ .../{rspec-gem-specs.yml => gem-tests.yml} | 0 .github/workflows/lint-js-and-ruby.yml | 37 +------- .../{integration-tests.yml => main.yml} | 0 .github/workflows/pro-integration-tests.yml | 15 +-- .github/workflows/pro-lint.yml | 5 +- ...tests.yml => pro-test-package-and-gem.yml} | 10 +- script/ci-changes-detector | 93 +++++++++++-------- 8 files changed, 124 insertions(+), 100 deletions(-) create mode 100644 .github/workflows/actionlint.yml rename .github/workflows/{rspec-gem-specs.yml => gem-tests.yml} (100%) rename .github/workflows/{integration-tests.yml => main.yml} (100%) rename .github/workflows/{pro-gem-tests.yml => pro-test-package-and-gem.yml} (95%) diff --git a/.github/workflows/actionlint.yml b/.github/workflows/actionlint.yml new file mode 100644 index 0000000000..cf5e95764b --- /dev/null +++ b/.github/workflows/actionlint.yml @@ -0,0 +1,64 @@ +name: Lint JS and Ruby + +on: + push: + branches: + - 'master' + paths: + - '.github/workflows/**' + pull_request: + paths: + - '.github/workflows/**' + workflow_dispatch: + inputs: + force_run: + description: 'Force run all jobs (bypass detect-changes)' + required: false + type: boolean + default: false + +jobs: + actionlint: + env: + BUNDLE_FROZEN: true + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v4 + with: + # No need for history in lint job + fetch-depth: 1 + persist-credentials: false + # We only download and run Actionlint if there is any difference in GitHub Action workflows + # https://github.com/rhysd/actionlint/blob/main/docs/usage.md#on-github-actions + - name: Check GitHub Action changes + id: check-workflows + run: | + git fetch origin ${{ github.event.pull_request.base.sha }} + if git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }} | grep -q '^.github/workflows'; then + echo "changed=true" >> "$GITHUB_OUTPUT" + response=$(curl -sf https://api.github.com/repos/rhysd/actionlint/releases/latest) + if [ $? -eq 0 ]; then + actionlint_version=$(echo "$response" | jq -r .tag_name) + if [ -z "$actionlint_version" ]; then + echo "Failed to parse Actionlint version" + exit 1 + fi + echo "actionlint_version=\"$actionlint_version\"" >> "$GITHUB_OUTPUT" + fi + fi + - name: Setup Actionlint + if: steps.check-workflows.outputs.changed == 'true' + uses: actions/cache@v4 + id: cache-actionlint + with: + path: ./actionlint + key: ${{ runner.os }}-actionlint-${{ steps.check-workflows.outputs.actionlint_version }} + - name: Download Actionlint + if: steps.check-workflows.outputs.changed == 'true' && steps.cache-actionlint.outputs.cache-hit != 'true' + run: bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash) + - name: Lint GitHub Actions + if: steps.check-workflows.outputs.changed == 'true' + run: | + echo "::add-matcher::.github/actionlint-matcher.json" + SHELLCHECK_OPTS="-S warning" ./actionlint -color + shell: bash diff --git a/.github/workflows/rspec-gem-specs.yml b/.github/workflows/gem-tests.yml similarity index 100% rename from .github/workflows/rspec-gem-specs.yml rename to .github/workflows/gem-tests.yml diff --git a/.github/workflows/lint-js-and-ruby.yml b/.github/workflows/lint-js-and-ruby.yml index 45d904c932..18f4a95f8d 100644 --- a/.github/workflows/lint-js-and-ruby.yml +++ b/.github/workflows/lint-js-and-ruby.yml @@ -79,10 +79,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: 22 - # TODO: Re-enable cache when Node.js 22 V8 bug is fixed - # Disable cache for Node 22 due to V8 bug in 22.21.0 - # Track: https://github.com/nodejs/node/issues/56010 - cache: '' + cache: yarn cache-dependency-path: '**/yarn.lock' - name: Print system information run: | @@ -152,35 +149,3 @@ jobs: run: yarn run publint --strict packages/react-on-rails/react-on-rails.tgz # We only download and run Actionlint if there is any difference in GitHub Action workflows # https://github.com/rhysd/actionlint/blob/main/docs/usage.md#on-github-actions - - name: Check GitHub Action changes - id: check-workflows - run: | - git fetch origin ${{ github.event.pull_request.base.sha }} - if git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }} | grep -q '^.github/workflows'; then - echo "changed=true" >> "$GITHUB_OUTPUT" - response=$(curl -sf https://api.github.com/repos/rhysd/actionlint/releases/latest) - if [ $? -eq 0 ]; then - actionlint_version=$(echo "$response" | jq -r .tag_name) - if [ -z "$actionlint_version" ]; then - echo "Failed to parse Actionlint version" - exit 1 - fi - echo "actionlint_version=\"$actionlint_version\"" >> "$GITHUB_OUTPUT" - fi - fi - - name: Setup Actionlint - if: steps.check-workflows.outputs.changed == 'true' - uses: actions/cache@v4 - id: cache-actionlint - with: - path: ./actionlint - key: ${{ runner.os }}-actionlint-${{ steps.check-workflows.outputs.actionlint_version }} - - name: Download Actionlint - if: steps.check-workflows.outputs.changed == 'true' && steps.cache-actionlint.outputs.cache-hit != 'true' - run: bash <(curl https://raw.githubusercontent.com/rhysd/actionlint/main/scripts/download-actionlint.bash) - - name: Lint GitHub Actions - if: steps.check-workflows.outputs.changed == 'true' - run: | - echo "::add-matcher::.github/actionlint-matcher.json" - SHELLCHECK_OPTS="-S warning" ./actionlint -color - shell: bash diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/main.yml similarity index 100% rename from .github/workflows/integration-tests.yml rename to .github/workflows/main.yml diff --git a/.github/workflows/pro-integration-tests.yml b/.github/workflows/pro-integration-tests.yml index f9e60521bf..1c5cde1a4a 100644 --- a/.github/workflows/pro-integration-tests.yml +++ b/.github/workflows/pro-integration-tests.yml @@ -83,10 +83,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: 22 - # TODO: Re-enable cache when Node.js 22 V8 bug is fixed - # Disable cache for Node 22 due to V8 bug in 22.21.0 - # Track: https://github.com/nodejs/node/issues/56010 - cache: '' + cache: yarn cache-dependency-path: 'react_on_rails_pro/**/yarn.lock' - name: Print system information @@ -173,10 +170,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: 22 - # TODO: Re-enable cache when Node.js 22 V8 bug is fixed - # Disable cache for Node 22 due to V8 bug in 22.21.0 - # Track: https://github.com/nodejs/node/issues/56010 - cache: '' + cache: yarn cache-dependency-path: 'react_on_rails_pro/**/yarn.lock' - name: Print system information @@ -364,10 +358,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: 22 - # TODO: Re-enable cache when Node.js 22 V8 bug is fixed - # Disable cache for Node 22 due to V8 bug in 22.21.0 - # Track: https://github.com/nodejs/node/issues/56010 - cache: '' + cache: yarn cache-dependency-path: 'react_on_rails_pro/**/yarn.lock' - name: Print system information diff --git a/.github/workflows/pro-lint.yml b/.github/workflows/pro-lint.yml index 1b236531cc..907ba092cd 100644 --- a/.github/workflows/pro-lint.yml +++ b/.github/workflows/pro-lint.yml @@ -82,10 +82,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: 22 - # TODO: Re-enable cache when Node.js 22 V8 bug is fixed - # Disable cache for Node 22 due to V8 bug in 22.21.0 - # Track: https://github.com/nodejs/node/issues/56010 - cache: '' + cache: yarn cache-dependency-path: 'react_on_rails_pro/**/yarn.lock' - name: Print system information diff --git a/.github/workflows/pro-gem-tests.yml b/.github/workflows/pro-test-package-and-gem.yml similarity index 95% rename from .github/workflows/pro-gem-tests.yml rename to .github/workflows/pro-test-package-and-gem.yml index 4e4b12edd6..24b24aeeed 100644 --- a/.github/workflows/pro-gem-tests.yml +++ b/.github/workflows/pro-test-package-and-gem.yml @@ -83,10 +83,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: 22 - # TODO: Re-enable cache when Node.js 22 V8 bug is fixed - # Disable cache for Node 22 due to V8 bug in 22.21.0 - # Track: https://github.com/nodejs/node/issues/56010 - cache: '' + cache: yarn cache-dependency-path: 'react_on_rails_pro/**/yarn.lock' - name: Print system information @@ -178,10 +175,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: 22 - # TODO: Re-enable cache when Node.js 22 V8 bug is fixed - # Disable cache for Node 22 due to V8 bug in 22.21.0 - # Track: https://github.com/nodejs/node/issues/56010 - cache: '' + cache: yarn cache-dependency-path: 'react_on_rails_pro/**/yarn.lock' - name: Print system information diff --git a/script/ci-changes-detector b/script/ci-changes-detector index c46d3d8c2e..f8045b3e32 100755 --- a/script/ci-changes-detector +++ b/script/ci-changes-detector @@ -53,14 +53,16 @@ fi # Initialize flags DOCS_ONLY=true -RUBY_CHANGED=false -JS_CHANGED=false -GENERATORS_CHANGED=false -WORKFLOWS_CHANGED=false LINT_CONFIG_CHANGED=false -SPEC_DUMMY_CHANGED=false +PRO_LINT_CONFIG_CHANGED=false +RUBY_CHANGED=false RSPEC_CHANGED=false -PRO_CHANGED=false +SPEC_DUMMY_CHANGED=false +JS_CHANGED=false +GENERATORS_CHANGED=false # needs to be duplicated to pro +PRO_RUBY_CHANGED=false +PRO_RSPEC_CHANGED=false +PRO_JS_CHANGED=false PRO_DUMMY_CHANGED=false # Analyze each changed file @@ -72,69 +74,69 @@ while IFS= read -r file; do ;; # Ruby source code - lib/*.rb|lib/**/*.rb) + lib/*.rb|lib/**/*.rb|Gemfile|Gemfile.lock|rakelib/run_rspec.rake|rakelib/node_package.rake|rakelib/dummy_apps.rake) DOCS_ONLY=false RUBY_CHANGED=true ;; - # Ruby specs (except dummy app) - spec/react_on_rails/*|spec/react_on_rails/**/*) + # Ruby gem-specific specs + spec/react_on_rails/*|spec/react_on_rails/**/*|.github/workflows/gem-tests.yml) DOCS_ONLY=false - RUBY_CHANGED=true RSPEC_CHANGED=true ;; # Generators - lib/generators/*|lib/generators/**/*|rakelib/example_type.rb|rakelib/example_config.yml|rakelib/examples.rake) + lib/generators/*|lib/generators/**/*|rakelib/example_type.rb|rakelib/example_config.yml|rakelib/shakapacker_examples.rake|.github/workflows/examples.yml) DOCS_ONLY=false GENERATORS_CHANGED=true ;; # JavaScript/TypeScript source - packages/react-on-rails/src/*|packages/react-on-rails/src/**/*|node_package/src/*|node_package/src/**/*) + package.json|yarn.lock|packages/react-on-rails/src/*|packages/react-on-rails/src/**/*|.github/workflows/package-js-tests.yml) DOCS_ONLY=false JS_CHANGED=true ;; # Dummy app - spec/dummy/*) + spec/dummy/*|spec/dummy/**/*|.github/workflows/integration-tests.yml) DOCS_ONLY=false SPEC_DUMMY_CHANGED=true ;; - # React on Rails Pro package / dummy app - react_on_rails_pro/spec/dummy/*) + # React on Rails Pro source code + react_on_rails_pro/lib/*|react_on_rails_pro/lib/**/*) DOCS_ONLY=false - PRO_CHANGED=true - PRO_DUMMY_CHANGED=true + PRO_RUBY_CHANGED=true ;; - react_on_rails_pro/*|react_on_rails_pro/**/*) + + # JavaScript/TypeScript Pro source + packages/react-on-rails-pro/src/*|packages/react-on-rails-pro/src/**/*) DOCS_ONLY=false - PRO_CHANGED=true + PRO_JS_CHANGED=true ;; - # GitHub workflows - .github/workflows/*|rakelib/*) + # Ruby Pro gem-specific specs + react_on_rails_pro/spec/react_on_rails/*|react_on_rails_pro/spec/react_on_rails/**/*|.github/workflows/pro-gem-tests.yml) DOCS_ONLY=false - WORKFLOWS_CHANGED=true + PRO_RSPEC_CHANGED=true ;; - # Lint/format configuration - .rubocop.yml|.eslintrc*|.prettierrc*|tsconfig.json|.editorconfig) + # React on Rails Pro package / dummy app + react_on_rails_pro/spec/dummy/*|react_on_rails_pro/spec/dummy/**/*|.github/workflows/pro-integration-tests.yml) DOCS_ONLY=false - LINT_CONFIG_CHANGED=true + PRO_DUMMY_CHANGED=true ;; - # Gemfile, package.json, lockfiles - Gemfile|Gemfile.lock|package.json|yarn.lock|spec/dummy/Gemfile|spec/dummy/Gemfile.lock|spec/dummy/package.json|spec/dummy/yarn.lock) + # Lint/format configuration + .rubocop.yml|.eslintrc*|.prettierrc*|tsconfig.json|.editorconfig|.github/workflows/lint-js-and-ruby.yml) DOCS_ONLY=false - RUBY_CHANGED=true - JS_CHANGED=true + LINT_CONFIG_CHANGED=true ;; - # Anything else is considered a code change - *) + # Lint/format configuration + react_on_rails_pro/.rubocop.yml|react_on_rails_pro/.eslintrc*|react_on_rails_pro/.prettierrc*|react_on_rails_pro/tsconfig.json|react_on_rails_pro/.editorconfig|.github/workflows/pro-lint.yml) DOCS_ONLY=false + PRO_LINT_CONFIG_CHANGED=true ;; esac done <<< "$CHANGED_FILES" @@ -154,15 +156,19 @@ if [ "$DOCS_ONLY" = true ]; then exit 0 fi +# TODO: need to add node-renderer tests echo "Changed file categories:" [ "$RUBY_CHANGED" = true ] && echo -e "${YELLOW} • Ruby source code${NC}" [ "$JS_CHANGED" = true ] && echo -e "${YELLOW} • JavaScript/TypeScript code${NC}" -[ "$GENERATORS_CHANGED" = true ] && echo -e "${YELLOW} • Generators${NC}" [ "$RSPEC_CHANGED" = true ] && echo -e "${YELLOW} • RSpec tests${NC}" [ "$SPEC_DUMMY_CHANGED" = true ] && echo -e "${YELLOW} • Dummy app${NC}" -[ "$PRO_CHANGED" = true ] && echo -e "${YELLOW} • React on Rails Pro${NC}" -[ "$WORKFLOWS_CHANGED" = true ] && echo -e "${YELLOW} • GitHub workflows${NC}" +[ "$GENERATORS_CHANGED" = true ] && echo -e "${YELLOW} • Generators${NC}" +[ "$PRO_JS_CHANGED" = true ] && echo -e "${YELLOW} • React on Rails Pro JavaScript/TypeScript${NC}" +[ "$PRO_RSPEC_CHANGED" = true ] && echo -e "${YELLOW} • React on Rails Pro RSpec tests${NC}" +[ "$PRO_RUBY_CHANGED" = true ] && echo -e "${YELLOW} • React on Rails Pro Ruby source code${NC}" +[ "$PRO_DUMMY_CHANGED" = true ] && echo -e "${YELLOW} • React on Rails Pro Dummy app${NC}" [ "$LINT_CONFIG_CHANGED" = true ] && echo -e "${YELLOW} • Lint/format configuration${NC}" +[ "$PRO_LINT_CONFIG_CHANGED" = true ] && echo -e "${YELLOW} • React on Rails Pro lint/format configuration${NC}" echo "" echo "Recommended CI jobs:" @@ -175,8 +181,9 @@ RUN_DUMMY_TESTS=false RUN_GENERATORS=false RUN_PRO_LINT=false RUN_PRO_TESTS=false +RUN_PRO_DUMMY_TESTS=false -if [ "$LINT_CONFIG_CHANGED" = true ] || [ "$RUBY_CHANGED" = true ] || [ "$JS_CHANGED" = true ] || [ "$WORKFLOWS_CHANGED" = true ]; then +if [ "$LINT_CONFIG_CHANGED" = true ] || [ "$RUBY_CHANGED" = true ] || [ "$JS_CHANGED" = true ] || [ "$SPEC_DUMMY_CHANGED" = true ]; then RUN_LINT=true fi @@ -196,22 +203,26 @@ if [ "$GENERATORS_CHANGED" = true ]; then RUN_GENERATORS=true fi -if [ "$PRO_CHANGED" = true ]; then +if [ "$PRO_LINT_CONFIG_CHANGED" = true ] || [ "$PRO_RUBY_CHANGED" = true ] || [ "$PRO_JS_CHANGED" = true ] || [ "$PRO_DUMMY_CHANGED" = true ]; then RUN_PRO_LINT=true - RUN_PRO_TESTS=true fi -if [ "$PRO_DUMMY_CHANGED" = true ]; then +if [ "$PRO_RUBY_CHANGED" = true ] || [ "$PRO_RSPEC_CHANGED" = true ] || [ "$PRO_JS_CHANGED" = true ]; then RUN_PRO_TESTS=true fi +if [ "$PRO_DUMMY_CHANGED" = true ] || [ "$PRO_RUBY_CHANGED" = true ] || [ "$PRO_JS_CHANGED" = true ]; then + RUN_PRO_DUMMY_TESTS=true +fi + [ "$RUN_LINT" = true ] && echo " ✓ Lint (Ruby + JS)" [ "$RUN_RUBY_TESTS" = true ] && echo " ✓ RSpec gem tests" [ "$RUN_JS_TESTS" = true ] && echo " ✓ JS unit tests" [ "$RUN_DUMMY_TESTS" = true ] && echo " ✓ Dummy app integration tests" [ "$RUN_GENERATORS" = true ] && echo " ✓ Generator tests" -[ "$RUN_PRO_LINT" = true ] && echo " ✓ React on Rails Pro lint" -[ "$RUN_PRO_TESTS" = true ] && echo " ✓ React on Rails Pro tests" +[ "$RUN_PRO_LINT" = true ] && echo " ✓ React on Rails Pro Lint (Ruby + JS)" +[ "$RUN_PRO_TESTS" = true ] && echo " ✓ React on Rails Pro RSpec unit tests (Ruby + JS)" +[ "$RUN_PRO_DUMMY_TESTS" = true ] && echo " ✓ React on Rails Pro Dummy app integration tests" # Export as GitHub Actions outputs if running in CI if [ -n "${GITHUB_OUTPUT:-}" ]; then @@ -224,6 +235,7 @@ if [ -n "${GITHUB_OUTPUT:-}" ]; then echo "run_generators=$RUN_GENERATORS" echo "run_pro_lint=$RUN_PRO_LINT" echo "run_pro_tests=$RUN_PRO_TESTS" + echo "run_pro_dummy_tests=$RUN_PRO_DUMMY_TESTS" } >> "$GITHUB_OUTPUT" fi @@ -239,6 +251,7 @@ if [ "${CI_JSON_OUTPUT:-}" = "1" ]; then "run_generators": $RUN_GENERATORS, "run_pro_lint": $RUN_PRO_LINT, "run_pro_tests": $RUN_PRO_TESTS + "run_pro_dummy_tests": $RUN_PRO_DUMMY_TESTS } EOF fi From b9d243a6c68080fe8e11f04204b9d15ca77a41f7 Mon Sep 17 00:00:00 2001 From: Judah Meek Date: Sat, 15 Nov 2025 23:03:57 -0600 Subject: [PATCH 05/12] Update .github/workflows/actionlint.yml Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- .github/workflows/actionlint.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/actionlint.yml b/.github/workflows/actionlint.yml index cf5e95764b..33a1783356 100644 --- a/.github/workflows/actionlint.yml +++ b/.github/workflows/actionlint.yml @@ -33,8 +33,19 @@ jobs: - name: Check GitHub Action changes id: check-workflows run: | - git fetch origin ${{ github.event.pull_request.base.sha }} - if git diff --name-only ${{ github.event.pull_request.base.sha }} ${{ github.sha }} | grep -q '^.github/workflows'; then + BASE_SHA="${{ github.event.pull_request.base.sha || github.event.before }}" + if [ -n "$BASE_SHA" ]; then + git fetch origin "$BASE_SHA" 2>/dev/null || true + fi + + # For PRs, diff against base; for pushes, use before commit + if [ -n "${{ github.event.pull_request.base.sha }}" ]; then + DIFF_BASE="${{ github.event.pull_request.base.sha }}" + else + DIFF_BASE="${{ github.event.before }}" + fi + + if git diff --name-only "$DIFF_BASE" ${{ github.sha }} 2>/dev/null | grep -q '^.github/workflows'; then echo "changed=true" >> "$GITHUB_OUTPUT" response=$(curl -sf https://api.github.com/repos/rhysd/actionlint/releases/latest) if [ $? -eq 0 ]; then From 83e646816a6718f99c8131f3edb43d0b9d0f4f70 Mon Sep 17 00:00:00 2001 From: Judah Meek Date: Sat, 15 Nov 2025 23:07:26 -0600 Subject: [PATCH 06/12] add force_run references --- .github/workflows/actionlint.yml | 6 ------ .github/workflows/gem-tests.yml | 4 ++-- .github/workflows/lint-js-and-ruby.yml | 4 ++-- .github/workflows/package-js-tests.yml | 4 ++-- .github/workflows/playwright.yml | 6 ------ 5 files changed, 6 insertions(+), 18 deletions(-) diff --git a/.github/workflows/actionlint.yml b/.github/workflows/actionlint.yml index 33a1783356..23e25262a2 100644 --- a/.github/workflows/actionlint.yml +++ b/.github/workflows/actionlint.yml @@ -10,12 +10,6 @@ on: paths: - '.github/workflows/**' workflow_dispatch: - inputs: - force_run: - description: 'Force run all jobs (bypass detect-changes)' - required: false - type: boolean - default: false jobs: actionlint: diff --git a/.github/workflows/gem-tests.yml b/.github/workflows/gem-tests.yml index 7f56952121..62773d5bf2 100644 --- a/.github/workflows/gem-tests.yml +++ b/.github/workflows/gem-tests.yml @@ -46,8 +46,8 @@ jobs: - name: Detect relevant changes id: detect run: | - # If full-ci label is present, run everything - if [ "${{ steps.check-label.outputs.result }}" = "true" ]; then + # 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_lint=true" >> "$GITHUB_OUTPUT" echo "run_js_tests=true" >> "$GITHUB_OUTPUT" echo "run_ruby_tests=true" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/lint-js-and-ruby.yml b/.github/workflows/lint-js-and-ruby.yml index 18f4a95f8d..7d0a7329c6 100644 --- a/.github/workflows/lint-js-and-ruby.yml +++ b/.github/workflows/lint-js-and-ruby.yml @@ -43,8 +43,8 @@ jobs: - name: Detect relevant changes id: detect run: | - # If full-ci label is present, run everything - if [ "${{ steps.check-label.outputs.result }}" = "true" ]; then + # 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_lint=true" >> "$GITHUB_OUTPUT" echo "run_js_tests=true" >> "$GITHUB_OUTPUT" echo "run_ruby_tests=true" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/package-js-tests.yml b/.github/workflows/package-js-tests.yml index d37b8ba4c9..24bb2d0830 100644 --- a/.github/workflows/package-js-tests.yml +++ b/.github/workflows/package-js-tests.yml @@ -48,8 +48,8 @@ jobs: - name: Detect relevant changes id: detect run: | - # If full-ci label is present, run everything - if [ "${{ steps.check-label.outputs.result }}" = "true" ]; then + # 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_lint=true" >> "$GITHUB_OUTPUT" echo "run_js_tests=true" >> "$GITHUB_OUTPUT" echo "run_ruby_tests=true" >> "$GITHUB_OUTPUT" diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 97f73a291f..1616f6cde0 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -7,12 +7,6 @@ on: - '**.md' - 'docs/**' workflow_dispatch: - inputs: - force_run: - description: 'Force run all jobs (bypass detect-changes)' - required: false - type: boolean - default: false jobs: playwright: From a48a222f4afa3479b54fc37a6977fb6f2974c65b Mon Sep 17 00:00:00 2001 From: Judah Meek Date: Sat, 15 Nov 2025 23:10:47 -0600 Subject: [PATCH 07/12] misc --- .github/workflows/{main.yml => integration-tests.yml} | 0 .github/workflows/pro-test-package-and-gem.yml | 4 ++-- script/ci-changes-detector | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename .github/workflows/{main.yml => integration-tests.yml} (100%) diff --git a/.github/workflows/main.yml b/.github/workflows/integration-tests.yml similarity index 100% rename from .github/workflows/main.yml rename to .github/workflows/integration-tests.yml diff --git a/.github/workflows/pro-test-package-and-gem.yml b/.github/workflows/pro-test-package-and-gem.yml index 24b24aeeed..386d26c2cf 100644 --- a/.github/workflows/pro-test-package-and-gem.yml +++ b/.github/workflows/pro-test-package-and-gem.yml @@ -9,14 +9,14 @@ on: - 'docs/**' - 'lib/**' - 'spec/**' - - 'packages/**' + - 'packages/react_on_rails/**' pull_request: paths-ignore: - '**.md' - 'docs/**' - 'lib/**' - 'spec/**' - - 'packages/**' + - 'packages/react_on_rails/**' workflow_dispatch: inputs: force_run: diff --git a/script/ci-changes-detector b/script/ci-changes-detector index f8045b3e32..86a3bdeb31 100755 --- a/script/ci-changes-detector +++ b/script/ci-changes-detector @@ -250,7 +250,7 @@ if [ "${CI_JSON_OUTPUT:-}" = "1" ]; then "run_dummy_tests": $RUN_DUMMY_TESTS, "run_generators": $RUN_GENERATORS, "run_pro_lint": $RUN_PRO_LINT, - "run_pro_tests": $RUN_PRO_TESTS + "run_pro_tests": $RUN_PRO_TESTS, "run_pro_dummy_tests": $RUN_PRO_DUMMY_TESTS } EOF From 01fe3e4fc0b2f00207a699808fd338ef751d53e9 Mon Sep 17 00:00:00 2001 From: Judah Meek Date: Sat, 15 Nov 2025 23:29:00 -0600 Subject: [PATCH 08/12] per review --- .github/workflows/actionlint.yml | 5 +++++ script/ci-changes-detector | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/actionlint.yml b/.github/workflows/actionlint.yml index 23e25262a2..00196ca979 100644 --- a/.github/workflows/actionlint.yml +++ b/.github/workflows/actionlint.yml @@ -38,6 +38,11 @@ jobs: else DIFF_BASE="${{ github.event.before }}" fi + + # Handle initial commits where before SHA is all zeros + if [[ "$DIFF_BASE" =~ ^0+$ ]]; then + DIFF_BASE="origin/master" + fi if git diff --name-only "$DIFF_BASE" ${{ github.sha }} 2>/dev/null | grep -q '^.github/workflows'; then echo "changed=true" >> "$GITHUB_OUTPUT" diff --git a/script/ci-changes-detector b/script/ci-changes-detector index 86a3bdeb31..c9cfafbd81 100755 --- a/script/ci-changes-detector +++ b/script/ci-changes-detector @@ -86,7 +86,7 @@ while IFS= read -r file; do ;; # Generators - lib/generators/*|lib/generators/**/*|rakelib/example_type.rb|rakelib/example_config.yml|rakelib/shakapacker_examples.rake|.github/workflows/examples.yml) + lib/generators/*|lib/generators/**/*|rakelib/example_type.rb|rakelib/examples_config.yml|rakelib/shakapacker_examples.rake|.github/workflows/examples.yml) DOCS_ONLY=false GENERATORS_CHANGED=true ;; From a95a5284d6b2fbbde72ed1bb5b9463059215bab3 Mon Sep 17 00:00:00 2001 From: Judah Meek Date: Sun, 16 Nov 2025 00:26:51 -0600 Subject: [PATCH 09/12] matrix strategy requires an initial matrix --- .github/workflows/integration-tests.yml | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index d0b4c3497c..eb15b2d923 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -52,11 +52,10 @@ jobs: echo "run_dummy_tests=true" >> "$GITHUB_OUTPUT" echo "run_generators=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' }}" + else + BASE_REF="${{ github.event.pull_request.base.sha || github.event.before || 'origin/master' }}" script/ci-changes-detector "$BASE_REF" + fi shell: bash build-dummy-app-webpack-test-bundles: @@ -66,15 +65,9 @@ jobs: github.ref == 'refs/heads/master' || github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.run_dummy_tests == 'true' strategy: matrix: - include: - # Always run: Latest versions (fast feedback on PRs) - - ruby-version: '3.4' - node-version: '22' - dependency-level: 'latest' - # Master and workflow_dispatch: Minimum supported versions (full coverage) - - ruby-version: '3.2' - node-version: '20' - dependency-level: 'minimum' + ruby-version: ['3.4', '3.2'] + node-version: ['22', '20'] + dependency-level: ['latest', 'minimum'] exclude: # Skip minimum dependency matrix on regular PRs (run only on master/workflow_dispatch/force_run/full-ci label) - ruby-version: ${{ github.event_name == 'pull_request' && github.ref != 'refs/heads/master' && inputs.force_run != true && needs.detect-changes.outputs.has_full_ci_label != 'true' && '3.2' || '' }} From c57a7d52f12d831ad466e6f0213e84e5fa2ac72e Mon Sep 17 00:00:00 2001 From: Judah Meek Date: Sun, 16 Nov 2025 01:03:51 -0600 Subject: [PATCH 10/12] try using include instead of exclude --- .github/workflows/integration-tests.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index eb15b2d923..e951cc5d95 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -65,14 +65,14 @@ jobs: github.ref == 'refs/heads/master' || github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.run_dummy_tests == 'true' strategy: matrix: - ruby-version: ['3.4', '3.2'] - node-version: ['22', '20'] - dependency-level: ['latest', 'minimum'] - exclude: + ruby-version: ['3.4'] + node-version: ['22'] + dependency-level: ['latest'] + include: # Skip minimum dependency matrix on regular PRs (run only on master/workflow_dispatch/force_run/full-ci label) - - ruby-version: ${{ github.event_name == 'pull_request' && github.ref != 'refs/heads/master' && inputs.force_run != true && needs.detect-changes.outputs.has_full_ci_label != 'true' && '3.2' || '' }} - node-version: ${{ github.event_name == 'pull_request' && github.ref != 'refs/heads/master' && inputs.force_run != true && needs.detect-changes.outputs.has_full_ci_label != 'true' && '20' || '' }} - dependency-level: ${{ github.event_name == 'pull_request' && github.ref != 'refs/heads/master' && inputs.force_run != true && needs.detect-changes.outputs.has_full_ci_label != 'true' && 'minimum' || '' }} + - ruby-version: ${{ github.event_name == 'pull_request' && github.ref != 'refs/heads/master' && inputs.force_run != true && needs.detect-changes.outputs.has_full_ci_label != 'true' && '3.2'}} + node-version: ${{ github.event_name == 'pull_request' && github.ref != 'refs/heads/master' && inputs.force_run != true && needs.detect-changes.outputs.has_full_ci_label != 'true' && '20'}} + dependency-level: ${{ github.event_name == 'pull_request' && github.ref != 'refs/heads/master' && inputs.force_run != true && needs.detect-changes.outputs.has_full_ci_label != 'true' && 'minimum'}} runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 From 18c8ebb137518afcd97b12d4b7076c1358adfb7d Mon Sep 17 00:00:00 2001 From: Judah Meek Date: Sun, 16 Nov 2025 01:06:44 -0600 Subject: [PATCH 11/12] invert conditional logic --- .github/workflows/integration-tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index e951cc5d95..b3896841cf 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -70,9 +70,9 @@ jobs: dependency-level: ['latest'] include: # Skip minimum dependency matrix on regular PRs (run only on master/workflow_dispatch/force_run/full-ci label) - - ruby-version: ${{ github.event_name == 'pull_request' && github.ref != 'refs/heads/master' && inputs.force_run != true && needs.detect-changes.outputs.has_full_ci_label != 'true' && '3.2'}} - node-version: ${{ github.event_name == 'pull_request' && github.ref != 'refs/heads/master' && inputs.force_run != true && needs.detect-changes.outputs.has_full_ci_label != 'true' && '20'}} - dependency-level: ${{ github.event_name == 'pull_request' && github.ref != 'refs/heads/master' && inputs.force_run != true && needs.detect-changes.outputs.has_full_ci_label != 'true' && 'minimum'}} + - ruby-version: ${{ (github.event_name == 'pull_request' || github.ref == 'refs/heads/master' || inputs.force_run == true || needs.detect-changes.outputs.has_full_ci_label == 'true') && '3.2'}} + node-version: ${{ (github.event_name == 'pull_request' || github.ref == 'refs/heads/master' || inputs.force_run == true || needs.detect-changes.outputs.has_full_ci_label == 'true') && '20'}} + dependency-level: ${{ (github.event_name == 'pull_request' || github.ref == 'refs/heads/master' || inputs.force_run == true || needs.detect-changes.outputs.has_full_ci_label == 'true') && 'minimum'}} runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 From a84e85217ee903310c440585352f1f92c1f3fd71 Mon Sep 17 00:00:00 2001 From: Judah Meek Date: Sun, 16 Nov 2025 01:16:46 -0600 Subject: [PATCH 12/12] update dummy-app-integration-tests job matrix strategy --- .github/workflows/integration-tests.yml | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index b3896841cf..03231da3ca 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -70,9 +70,9 @@ jobs: dependency-level: ['latest'] include: # Skip minimum dependency matrix on regular PRs (run only on master/workflow_dispatch/force_run/full-ci label) - - ruby-version: ${{ (github.event_name == 'pull_request' || github.ref == 'refs/heads/master' || inputs.force_run == true || needs.detect-changes.outputs.has_full_ci_label == 'true') && '3.2'}} - node-version: ${{ (github.event_name == 'pull_request' || github.ref == 'refs/heads/master' || inputs.force_run == true || needs.detect-changes.outputs.has_full_ci_label == 'true') && '20'}} - dependency-level: ${{ (github.event_name == 'pull_request' || github.ref == 'refs/heads/master' || inputs.force_run == true || needs.detect-changes.outputs.has_full_ci_label == 'true') && 'minimum'}} + - ruby-version: ${{ (github.ref == 'refs/heads/master' || inputs.force_run == true || needs.detect-changes.outputs.has_full_ci_label == 'true') && '3.2'}} + node-version: ${{ (github.ref == 'refs/heads/master' || inputs.force_run == true || needs.detect-changes.outputs.has_full_ci_label == 'true') && '20'}} + dependency-level: ${{ (github.ref == 'refs/heads/master' || inputs.force_run == true || needs.detect-changes.outputs.has_full_ci_label == 'true') && 'minimum'}} runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 @@ -147,17 +147,15 @@ jobs: if: | github.ref == 'refs/heads/master' || github.event_name == 'workflow_dispatch' || needs.detect-changes.outputs.run_dummy_tests == 'true' strategy: - fail-fast: false matrix: + ruby-version: ['3.4'] + node-version: ['22'] + dependency-level: ['latest'] include: - # Always run: Latest versions (fast feedback on PRs) - - ruby-version: '3.4' - node-version: '22' - dependency-level: 'latest' - # Master and workflow_dispatch: Minimum supported versions (full coverage) - - ruby-version: '3.2' - node-version: '20' - dependency-level: 'minimum' + # Skip minimum dependency matrix on regular PRs (run only on master/workflow_dispatch/force_run/full-ci label) + - ruby-version: ${{ (github.ref == 'refs/heads/master' || inputs.force_run == true || needs.detect-changes.outputs.has_full_ci_label == 'true') && '3.2'}} + node-version: ${{ (github.ref == 'refs/heads/master' || inputs.force_run == true || needs.detect-changes.outputs.has_full_ci_label == 'true') && '20'}} + dependency-level: ${{ (github.ref == 'refs/heads/master' || inputs.force_run == true || needs.detect-changes.outputs.has_full_ci_label == 'true') && 'minimum'}} exclude: # Skip minimum dependency matrix on regular PRs (run only on master/workflow_dispatch/force_run/full-ci label) - ruby-version: ${{ github.event_name == 'pull_request' && github.ref != 'refs/heads/master' && inputs.force_run != true && needs.detect-changes.outputs.has_full_ci_label != 'true' && '3.2' || '' }}