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-24.04 strategy: matrix: node-version: [22] steps: - name: Checkout uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 with: submodules: 'recursive' - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6 with: node-version: ${{ matrix.node-version }} - name: Install pnpm uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4 id: pnpm-install with: run_install: false - name: Checkout client-config uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 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 - name: Upload Client Artifact uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: name: client-artifact path: client/public - name: Upload Webpack Stats uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: name: webpack-stats path: client/public/stats.json build-api: name: Build API (Container) runs-on: ubuntu-24.04 steps: - name: Checkout Source Files uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 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@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 with: name: api-artifact path: api-artifact.tar playwright-run: name: Run Playwright Tests runs-on: ubuntu-24.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@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6 - name: Download Client Artifact uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 with: name: client-artifact path: client/public - name: Download Api Artifact uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 with: name: api-artifact path: api-artifact - 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@6044e13b5dc448c55e2357c09f80417699197238 # v6 with: node-version: ${{ matrix.node-version }} - name: Install pnpm uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # 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 turbo compile pnpm run build:curriculum - name: Start apps run: | docker compose -f docker/docker-compose.yml -f docker/docker-compose.e2e.yml 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: pnpm run playwright:run --project=${{ matrix.browsers }} --grep-invert 'third-party-donation.spec.ts' - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6 if: ${{ !cancelled() }} with: name: playwright-report-${{ matrix.browsers }} path: playwright/reporter retention-days: 7