name: CI - E2E - Playwright on: workflow_dispatch: workflow_run: workflows: ['CI - Node.js'] types: - completed # TODO: refactor with a workflow_call pull_request: paths-ignore: - 'docs/**' branches: - 'main' - 'next-**' - 'e2e-**' concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: build-client: name: Build Client runs-on: ubuntu-22.04 strategy: matrix: node-version: [20.x] steps: - name: Checkout Source Files uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: submodules: 'recursive' - name: Checkout client-config uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: repository: freeCodeCamp/client-config path: client-config - name: Setup pnpm uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d #v3.0.0 with: version: 9 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: node-version: ${{ matrix.node-version }} cache: pnpm - 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 playwright-run: name: E2E Test runs-on: ubuntu-22.04 needs: build-client strategy: fail-fast: false matrix: # Not Mobile Safari until we can get it working. Webkit and Mobile # Chrome both work, so hopefully there are no Mobile Safari specific # bugs. browsers: [chromium, firefox, webkit, Mobile Chrome] node-version: [20.x] services: mongodb: image: mongo:4.4 ports: - 27017:27017 # We need mailhog to catch any emails the api tries to send. mailhog: image: mailhog/mailhog ports: - 1025:1025 # SMTP server (listens for emails) - 8025:8025 # HTTP server (so we can make requests to the api) steps: - name: Set Action Environment Variables run: | echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV - name: Checkout Source Files uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: submodules: 'recursive' - uses: actions/download-artifact@c850b930e6ba138125429b7e5c93fc707a7f8427 # v4.1.4 with: name: client-artifact - name: Unpack Client Artifact run: | tar -xf client-artifact.tar rm client-artifact.tar - name: Setup pnpm uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d #v3.0.0 with: version: 9 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: node-version: ${{ matrix.node-version }} - name: Set freeCodeCamp Environment Variables run: | cp sample.env .env - name: Install and Build run: | pnpm install pnpm run create:shared pnpm run build:curriculum pnpm run build:server - name: Seed Database with Certified User run: pnpm run seed:certified-user # start-ci uses pm2, so it needs to be installed globally - name: Install pm2 run: npm i -g pm2 - name: Install playwright dependencies run: npx playwright install --with-deps - name: Run playwright tests run: | pnpm run start-ci & sleep 10 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: 30 - name: Upload screenshots if: failure() uses: actions/upload-artifact@v4 with: name: screenshots-${{ matrix.browsers }} path: playwright/test-results retention-days: 14