name: (Runtime) Build and Test on: push: branches: [main] pull_request: paths-ignore: - compiler/** env: TZ: /usr/share/zoneinfo/America/Los_Angeles jobs: # ----- FLOW ----- discover_flow_inline_configs: name: Discover flow inline configs runs-on: ubuntu-latest outputs: matrix: ${{ steps.set-matrix.outputs.result }} steps: - uses: actions/checkout@v4 - uses: actions/github-script@v7 id: set-matrix with: script: | const inlinedHostConfigs = require('./scripts/shared/inlinedHostConfigs.js'); return inlinedHostConfigs.map(config => config.shortName); flow: name: Flow check ${{ matrix.flow_inline_config_shortname }} needs: discover_flow_inline_configs runs-on: ubuntu-latest continue-on-error: true strategy: matrix: flow_inline_config_shortname: ${{ fromJSON(needs.discover_flow_inline_configs.outputs.matrix) }} steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 18.20.1 cache: yarn cache-dependency-path: yarn.lock - name: Restore cached node_modules uses: actions/cache@v4 id: node_modules with: path: "**/node_modules" key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile - run: node ./scripts/tasks/flow-ci ${{ matrix.flow_inline_config_shortname }} # ----- FIZZ ----- check_generated_fizz_runtime: name: Confirm generated inline Fizz runtime is up to date runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 18.20.1 cache: yarn cache-dependency-path: yarn.lock - name: Restore cached node_modules uses: actions/cache@v4 id: node_modules with: path: "**/node_modules" key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile - run: | yarn generate-inline-fizz-runtime git diff --quiet || (echo "There was a change to the Fizz runtime. Run `yarn generate-inline-fizz-runtime` and check in the result." && false) # ----- FEATURE FLAGS ----- flags: name: Check flags runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 18.20.1 cache: yarn cache-dependency-path: yarn.lock - name: Restore cached node_modules uses: actions/cache@v4 id: node_modules with: path: "**/node_modules" key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile - run: yarn flags # ----- TESTS ----- test: name: yarn test ${{ matrix.params }} (Shard ${{ matrix.shard }}) runs-on: ubuntu-latest strategy: matrix: params: - "-r=stable --env=development" - "-r=stable --env=production" - "-r=experimental --env=development" - "-r=experimental --env=production" - "-r=www-classic --env=development --variant=false" - "-r=www-classic --env=production --variant=false" - "-r=www-classic --env=development --variant=true" - "-r=www-classic --env=production --variant=true" - "-r=www-modern --env=development --variant=false" - "-r=www-modern --env=production --variant=false" - "-r=www-modern --env=development --variant=true" - "-r=www-modern --env=production --variant=true" - "-r=xplat --env=development --variant=false" - "-r=xplat --env=development --variant=true" - "-r=xplat --env=production --variant=false" - "-r=xplat --env=production --variant=true" # TODO: Test more persistent configurations? - "-r=stable --env=development --persistent" - "-r=experimental --env=development --persistent" shard: - 1/5 - 2/5 - 3/5 - 4/5 - 5/5 continue-on-error: true steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 18.20.1 cache: yarn cache-dependency-path: yarn.lock - name: Restore cached node_modules uses: actions/cache@v4 id: node_modules with: path: "**/node_modules" key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile - run: yarn test ${{ matrix.params }} --ci=github --shard=${{ matrix.shard }} # ----- BUILD ----- build_and_lint: name: yarn build and lint runs-on: ubuntu-latest strategy: matrix: # yml is dumb. update the --total arg to yarn build if you change the number of workers worker_id: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19] release_channel: [stable, experimental] steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 18.20.1 cache: yarn cache-dependency-path: yarn.lock - uses: actions/setup-java@v4 with: distribution: temurin java-version: 11.0.22 - name: Restore cached node_modules uses: actions/cache@v4 id: node_modules with: path: "**/node_modules" key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile - run: yarn build --index=${{ matrix.worker_id }} --total=20 --r=${{ matrix.release_channel }} --ci=github env: CI: github RELEASE_CHANNEL: ${{ matrix.release_channel }} NODE_INDEX: ${{ matrix.worker_id }} - name: Lint build run: yarn lint-build - name: Display structure of build run: ls -R build - name: Archive build uses: actions/upload-artifact@v4 with: name: build_${{ matrix.worker_id }}_${{ matrix.release_channel }} path: | build test_build: name: yarn test-build needs: build_and_lint strategy: matrix: test_params: [ # Intentionally passing these as strings instead of creating a # separate parameter per CLI argument, since it's easier to # control/see which combinations we want to run. -r=stable --env=development, -r=stable --env=production, -r=experimental --env=development, -r=experimental --env=production, # Dev Tools --project=devtools -r=experimental, # TODO: Update test config to support www build tests # - "-r=www-classic --env=development --variant=false" # - "-r=www-classic --env=production --variant=false" # - "-r=www-classic --env=development --variant=true" # - "-r=www-classic --env=production --variant=true" # - "-r=www-modern --env=development --variant=false" # - "-r=www-modern --env=production --variant=false" # - "-r=www-modern --env=development --variant=true" # - "-r=www-modern --env=production --variant=true" # TODO: Update test config to support xplat build tests # - "-r=xplat --env=development --variant=false" # - "-r=xplat --env=development --variant=true" # - "-r=xplat --env=production --variant=false" # - "-r=xplat --env=production --variant=true" # TODO: Test more persistent configurations? ] shard: - 1/3 - 2/3 - 3/3 continue-on-error: true runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 18.20.1 cache: yarn cache-dependency-path: yarn.lock - name: Restore cached node_modules uses: actions/cache@v4 id: node_modules with: path: "**/node_modules" key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile - name: Restore archived build uses: actions/download-artifact@v4 with: path: build merge-multiple: true - name: Display structure of build run: ls -R build - run: yarn test --build ${{ matrix.test_params }} --shard=${{ matrix.shard }} --ci=github process_artifacts_combined: name: Process artifacts combined needs: build_and_lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 18.20.1 cache: yarn cache-dependency-path: yarn.lock - name: Restore cached node_modules uses: actions/cache@v4 id: node_modules with: path: "**/node_modules" key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile - name: Restore archived build uses: actions/download-artifact@v4 with: path: build merge-multiple: true - name: Display structure of build run: ls -R build - run: echo ${{ github.sha }} >> build/COMMIT_SHA - name: Scrape warning messages run: | mkdir -p ./build/__test_utils__ node ./scripts/print-warnings/print-warnings.js > build/__test_utils__/ReactAllWarnings.js # Compress build directory into a single tarball for easy download - run: tar -zcvf ./build.tgz ./build # TODO: Migrate scripts to use `build` directory instead of `build2` - run: cp ./build.tgz ./build2.tgz - name: Archive build artifacts uses: actions/upload-artifact@v4 with: name: combined_artifacts_${{ github.sha }} path: | ./build.tgz ./build2.tgz check_release_dependencies: name: Check release dependencies needs: build_and_lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 18.20.1 cache: yarn cache-dependency-path: yarn.lock - name: Restore cached node_modules uses: actions/cache@v4 id: node_modules with: path: "**/node_modules" key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile - name: Restore archived build uses: actions/download-artifact@v4 with: path: build merge-multiple: true - name: Display structure of build run: ls -R build - run: yarn check-release-dependencies # ----- DEVTOOLS ----- build_devtools_and_process_artifacts: name: Build DevTools and process artifacts needs: build_and_lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 18.20.1 cache: yarn cache-dependency-path: yarn.lock - name: Restore cached node_modules uses: actions/cache@v4 id: node_modules with: path: "**/node_modules" key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile - name: Restore archived build uses: actions/download-artifact@v4 with: path: build merge-multiple: true - run: ./scripts/circleci/pack_and_store_devtools_artifacts.sh env: RELEASE_CHANNEL: experimental - name: Display structure of build run: ls -R build - name: Archive devtools build uses: actions/upload-artifact@v4 with: name: react-devtools path: build/devtools.tgz # Simplifies getting the extension for local testing - name: Archive chrome extension uses: actions/upload-artifact@v4 with: name: react-devtools-chrome-extension path: build/devtools/chrome-extension.zip - name: Archive firefox extension uses: actions/upload-artifact@v4 with: name: react-devtools-firefox-extension path: build/devtools/firefox-extension.zip run_devtools_e2e_tests: name: Run DevTools e2e tests needs: build_devtools_and_process_artifacts runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 18.20.1 cache: yarn cache-dependency-path: yarn.lock - name: Restore cached node_modules uses: actions/cache@v4 id: node_modules with: path: "**/node_modules" key: ${{ runner.arch }}-${{ runner.os }}-modules-${{ hashFiles('yarn.lock') }} - run: yarn install --frozen-lockfile - name: Restore archived build uses: actions/download-artifact@v4 with: path: build merge-multiple: true - run: | npx playwright install sudo npx playwright install-deps - run: ./scripts/circleci/run_devtools_e2e_tests.js env: RELEASE_CHANNEL: experimental