name: "Frontend Build CI (unit tests, linting & sanity checks)" on: push: branches: - "master" - "[0-9].[0-9]*" pull_request: types: [synchronize, opened, reopened, ready_for_review] # cancel previous workflow jobs for PRs concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }} cancel-in-progress: true env: TAG: apache/superset:GHA-${{ github.run_id }} jobs: frontend-build: runs-on: ubuntu-24.04 outputs: should-run: ${{ steps.check.outputs.frontend }} steps: - name: Checkout Code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: persist-credentials: false fetch-depth: 0 ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} - name: Check for File Changes id: check uses: ./.github/actions/change-detector/ with: token: ${{ secrets.GITHUB_TOKEN }} - name: Build Docker Image if: steps.check.outputs.frontend shell: bash env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | echo "git rev-parse --short HEAD" git rev-parse --short HEAD echo "git show -s --format=raw HEAD" git show -s --format=raw HEAD docker buildx build \ -t $TAG \ --cache-from=type=registry,ref=apache/superset-cache:3.10-slim-trixie \ --target superset-node-ci \ . - name: Save Docker Image as Artifact if: steps.check.outputs.frontend run: | docker save $TAG | zstd -3 --threads=0 > docker-image.tar.zst - name: Upload Docker Image Artifact if: steps.check.outputs.frontend uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 with: name: docker-image path: docker-image.tar.zst sharded-jest-tests: needs: frontend-build if: needs.frontend-build.outputs.should-run == 'true' strategy: matrix: shard: [1, 2, 3, 4, 5, 6, 7, 8] fail-fast: false runs-on: ubuntu-24.04 steps: - name: Download Docker Image Artifact uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 with: name: docker-image - name: Load Docker Image run: | zstd -d < docker-image.tar.zst | docker load - name: npm run test with coverage run: | mkdir -p ${{ github.workspace }}/superset-frontend/coverage docker run \ -v ${{ github.workspace }}/superset-frontend/coverage:/app/superset-frontend/coverage \ --rm $TAG \ bash -c \ "npm run test -- --coverage --shard=${{ matrix.shard }}/8 --coverageReporters=json" - name: Upload Coverage Artifact uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7 with: name: coverage-artifacts-${{ matrix.shard }} path: superset-frontend/coverage report-coverage: needs: [sharded-jest-tests] if: needs.frontend-build.outputs.should-run == 'true' runs-on: ubuntu-24.04 permissions: id-token: write steps: - name: Checkout Code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: persist-credentials: false fetch-depth: 0 ref: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} - name: Download Coverage Artifacts uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 with: pattern: coverage-artifacts-* path: coverage/ - name: Reorganize test result reports run: | find coverage/ for i in {1..8}; do mv coverage/coverage-artifacts-${i}/coverage-final.json coverage/coverage-shard-${i}.json done shell: bash - name: Merge Code Coverage run: npx nyc merge coverage/ merged-output/coverage-summary.json - name: Upload Code Coverage uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v5 with: flags: javascript use_oidc: true verbose: true disable_search: true files: merged-output/coverage-summary.json slug: apache/superset lint-frontend: needs: frontend-build if: needs.frontend-build.outputs.should-run == 'true' runs-on: ubuntu-24.04 steps: - name: Download Docker Image Artifact uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 with: name: docker-image - name: Load Docker Image run: | zstd -d < docker-image.tar.zst | docker load - name: lint run: | docker run --rm $TAG bash -c \ "npm i && npm run lint" - name: tsc run: | docker run --rm $TAG bash -c \ "npm i && npm run plugins:build && npm run type" validate-frontend: needs: frontend-build if: needs.frontend-build.outputs.should-run == 'true' runs-on: ubuntu-24.04 steps: - name: Download Docker Image Artifact uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 with: name: docker-image - name: Load Docker Image run: | zstd -d < docker-image.tar.zst | docker load - name: Build Plugins Packages run: | docker run --rm $TAG bash -c \ "npm run plugins:build" test-storybook: needs: frontend-build if: needs.frontend-build.outputs.should-run == 'true' runs-on: ubuntu-24.04 steps: - name: Download Docker Image Artifact uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 with: name: docker-image - name: Load Docker Image run: | zstd -d < docker-image.tar.zst | docker load - name: Build Storybook and Run Tests run: | docker run --rm $TAG bash -c \ "npm run build-storybook && npx playwright install-deps && npx playwright install chromium && npm run test-storybook:ci"