name: CI - E2E - Playwright on: workflow_dispatch: workflow_run: workflows: ['CI - Node.js'] types: - completed # TODO: refactor with a workflow_call pull_request: branches: - 'main' - 'temp-**' # Temporary branches allowed on Upstream concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.event.workflow_run.head_branch || github.ref }} cancel-in-progress: ${{ !contains(github.ref, 'main') && !contains(github.ref, 'prod-') }} jobs: build-client: name: Build Client runs-on: ubuntu-22.04 strategy: matrix: node-version: [22] steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: submodules: 'recursive' - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 with: node-version: ${{ matrix.node-version }} - name: Install pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4 id: pnpm-install with: run_install: false - name: Checkout client-config uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: repository: freeCodeCamp/client-config path: client-config - name: Set freeCodeCamp Environment Variables run: | cp sample.env .env - name: Install and Build run: | pnpm install pnpm run build - name: Move serve.json to Public Folder run: cp client-config/serve.json client/public/serve.json # We tar them for performance reasons - uploading a lot of files is slow. - name: Tar Files run: tar -cf client-artifact.tar client/public - name: Upload Client Artifact uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: client-artifact path: client-artifact.tar - name: Upload Webpack Stats uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: webpack-stats path: client/public/stats.json build-api: name: Build API (Container) runs-on: ubuntu-22.04 steps: - name: Checkout Source Files uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 with: submodules: 'recursive' - name: Create Image run: | docker build \ -t fcc-api \ -f docker/api/Dockerfile . - name: Save Image run: docker save fcc-api > api-artifact.tar - name: Upload API Artifact uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # v4.3.1 with: name: api-artifact path: api-artifact.tar playwright-run: name: Run Playwright Tests runs-on: ubuntu-22.04 needs: [build-client, build-api] strategy: fail-fast: false matrix: # Extend this to include firefox and webkit once chromium is working. browsers: [chromium] node-version: [22] steps: - name: Set Action Environment Variables run: | echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV - name: Checkout Source Files uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - name: Download All Artifacts uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 - name: Unpack Client Artifact run: | tar -xf client-artifact/client-artifact.tar rm client-artifact/client-artifact.tar - name: Load API Image run: | docker load < api-artifact/api-artifact.tar rm api-artifact/api-artifact.tar - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 with: node-version: ${{ matrix.node-version }} - name: Install pnpm uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4 id: pnpm-install with: run_install: false - name: Install Dependencies run: pnpm install - name: Set freeCodeCamp Environment Variables (needed by api) run: | cp sample.env .env - name: Install playwright dependencies run: npx playwright install --with-deps - name: Install and Build run: | pnpm install pnpm run create:shared pnpm run build:curriculum - name: Start apps run: | docker compose up -d pnpm run serve:client-ci & sleep 10 - name: Seed Database with Certified User run: pnpm run seed:certified-user - name: Run playwright tests run: npx playwright test --project=${{ matrix.browsers }} --grep-invert 'third-party-donation.spec.ts' - uses: actions/upload-artifact@v4 if: ${{ !cancelled() }} with: name: playwright-report-${{ matrix.browsers }} path: playwright/reporter retention-days: 7