name: CI - E2E - 3rd party donation tests on: workflow_dispatch: push: branches: - 'prod-**' 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-') }} permissions: contents: read jobs: build-client: name: Build Client runs-on: ubuntu-24.04 strategy: matrix: node-version: [24] steps: - name: Checkout Source Files uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false submodules: 'recursive' - name: Checkout client-config uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false repository: freeCodeCamp/client-config path: client-config - name: Setup pnpm uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: ${{ matrix.node-version }} - name: Set freeCodeCamp Environment Variables run: | sed '/STRIPE/d; /PAYPAL/d; /PATREON/d;' sample.env > .env echo 'STRIPE_PUBLIC_KEY=${{ secrets.STRIPE_PUBLIC_KEY }}' >> .env echo 'PAYPAL_CLIENT_ID=${{ secrets.PAYPAL_CLIENT_ID }}' >> .env echo 'PATREON_CLIENT_ID=${{ secrets.PATREON_CLIENT_ID }}' >> .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: Tar Files run: tar -cf client-artifact.tar client/public - name: Upload Client Artifact uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: client-artifact path: client-artifact.tar build-api: name: Build API (Container) runs-on: ubuntu-24.04 steps: - name: Checkout Source Files uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false 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@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: api-artifact path: api-artifact.tar playwright-run-api: name: Run Playwright 3rd Party Donation Tests runs-on: ubuntu-24.04 needs: [build-client, build-api] strategy: fail-fast: false matrix: browsers: [chromium] node-version: [24] steps: - name: Set Action Environment Variables run: | echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV - name: Checkout Source Files uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 - 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: Setup pnpm uses: pnpm/action-setup@8912a9102ac27614460f54aedde9e1e7f9aec20d # v6.0.5 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: ${{ matrix.node-version }} - name: Install Dependencies run: pnpm install - name: Set freeCodeCamp Environment Variables (needed by api) run: | sed '/STRIPE/d; /PAYPAL/d; /PATREON/d;' sample.env > .env echo 'STRIPE_PUBLIC_KEY=${{ secrets.STRIPE_PUBLIC_KEY }}' >> .env echo 'PAYPAL_CLIENT_ID=${{ secrets.PAYPAL_CLIENT_ID }}' >> .env echo 'PATREON_CLIENT_ID=${{ secrets.PATREON_CLIENT_ID }}' >> .env - name: Install playwright dependencies run: npx playwright install --with-deps - name: Install run: pnpm install - 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 third-party-donation.spec.ts --project=${{ matrix.browsers }} - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 if: ${{ !cancelled() }} with: name: playwright-report-${{ matrix.browsers }} path: e2e/playwright/reporter retention-days: 7