Skip to content

Restructure monorepo with two top-level product directories #4979

Restructure monorepo with two top-level product directories

Restructure monorepo with two top-level product directories #4979

name: Lint JS and Ruby
on:
push:
branches:
- 'master'
# Always trigger on master; docs-only detection handles skipping heavy jobs
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:
permissions:
contents: read
actions: read
runs-on: ubuntu-22.04
outputs:
docs_only: ${{ steps.detect.outputs.docs_only }}
run_lint: ${{ steps.detect.outputs.run_lint }}
run_js_tests: ${{ steps.detect.outputs.run_js_tests }}
run_ruby_tests: ${{ steps.detect.outputs.run_ruby_tests }}
run_dummy_tests: ${{ steps.detect.outputs.run_dummy_tests }}
run_generators: ${{ steps.detect.outputs.run_generators }}
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
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_lint=true" >> "$GITHUB_OUTPUT"
echo "run_js_tests=true" >> "$GITHUB_OUTPUT"
echo "run_ruby_tests=true" >> "$GITHUB_OUTPUT"
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' }}"
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:
needs: detect-changes
# Skip only if: master push AND docs-only changes
# Otherwise run if: on master OR lint needed
# This allows docs-only commits to skip linting while ensuring full CI on master for code changes
if: |
!(
github.event_name == 'push' &&
github.ref == 'refs/heads/master' &&
needs.detect-changes.outputs.docs_only == 'true'
) && (
github.ref == 'refs/heads/master' ||
needs.detect-changes.outputs.run_lint == 'true'
)
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
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: 3
bundler: 2.5.9
- name: Setup Node
uses: ./.github/actions/setup-node-with-retry
with:
# Pin to 22.11.0 (LTS) to avoid V8 bug in 22.21.0
# https://github.com/nodejs/node/issues/56010
node-version: '22.11.0'
cache: yarn
cache-dependency-path: '**/yarn.lock'
- 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 "Yarn version: "; yarn --version
echo "Bundler version: "; bundle --version
- name: Save root ruby gems to cache
uses: actions/cache@v4
with:
path: react_on_rails/vendor/bundle
key: package-app-gem-cache-${{ hashFiles('react_on_rails/Gemfile.lock') }}-lint
- name: Install Node modules with Yarn for renderer package
run: |
yarn install --no-progress --no-emoji --frozen-lockfile
sudo yarn global add yalc
- name: yalc publish for react-on-rails
run: cd packages/react-on-rails && yalc publish
- name: yalc add react-on-rails
run: cd react_on_rails/spec/dummy && yalc add react-on-rails
- name: Install Node modules with Yarn for dummy app
run: cd react_on_rails/spec/dummy && yarn install --no-progress --no-emoji
- name: Install Ruby Gems for package
run: cd react_on_rails && bundle check --path=vendor/bundle || bundle _2.5.9_ install --path=vendor/bundle --jobs=4 --retry=3
- name: Lint Ruby
run: cd react_on_rails && bundle exec rubocop
- name: Validate RBS type signatures
run: cd react_on_rails && bundle exec rake rbs:validate
# TODO: Re-enable Steep once RBS signatures are complete for all checked files
# Currently disabled because 374 type errors need to be fixed first
# - name: Run Steep type checker
# run: bundle exec rake rbs:steep
- name: Save dummy app ruby gems to cache
uses: actions/cache@v4
with:
path: react_on_rails/spec/dummy/vendor/bundle
key: dummy-app-gem-cache-${{ hashFiles('react_on_rails/spec/dummy/Gemfile.lock') }}-lint
- name: Install Ruby Gems for dummy app
run: |
cd react_on_rails/spec/dummy
bundle lock --add-platform 'x86_64-linux'
if ! bundle check --path=vendor/bundle; then
bundle _2.5.9_ install --path=vendor/bundle --jobs=4 --retry=3
fi
- name: generate file system-based packs
run: cd react_on_rails/spec/dummy && RAILS_ENV="test" bundle exec rake react_on_rails:generate_packs
- name: Detect dead code
run: |
yarn run knip --exclude binaries
yarn run knip --production --exclude binaries
- name: Lint JS
run: yarn run eslint --report-unused-disable-directives
- name: Check formatting
run: yarn start format.listDifferent
- name: Lint SCSS with stylelint
run: yarn run lint:scss
- name: Type-check TypeScript
run: yarn run type-check
- name: Pack for attw and publint
run: cd packages/react-on-rails && yarn pack -f react-on-rails.tgz
- name: Lint package types
# our package is ESM-only
# Exclude internal exports used for react-on-rails-pro communication
run: yarn run attw packages/react-on-rails/react-on-rails.tgz --profile esm-only --exclude-entrypoints reactApis ReactDOMServer
- name: Lint package publishing
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