From 55533f8075e5a49e7da845a23b50490301e7326c Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Wed, 17 Jul 2024 03:31:49 +0200 Subject: [PATCH] ci: run e2e tests against new and old apis (#54546) --- .github/workflows/e2e-with-new-api.yml | 191 +++++++++++++++++++++++++ docker-compose.yml | 22 ++- 2 files changed, 206 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/e2e-with-new-api.yml diff --git a/.github/workflows/e2e-with-new-api.yml b/.github/workflows/e2e-with-new-api.yml new file mode 100644 index 00000000000..f0cbab9e7ee --- /dev/null +++ b/.github/workflows/e2e-with-new-api.yml @@ -0,0 +1,191 @@ +name: CI - E2E - Containers +on: + workflow_dispatch: + workflow_run: + workflows: ['CI - Node.js'] + types: + - completed + pull_request: + paths-ignore: + - 'docs/**' + branches: + - 'main' + - 'next-**' + - 'e2e-**' + +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 + + - 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 + + build-api: + name: Build Api (Container) + runs-on: ubuntu-22.04 + strategy: + matrix: + node-version: [20.x] + + steps: + - name: Checkout Source Files + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Create Image + run: | + docker build \ + -t fcc-api \ + -f docker/api/Dockerfile . + + build-new-api: + name: Build New Api (Container) + runs-on: ubuntu-22.04 + strategy: + matrix: + node-version: [20.x] + + steps: + - name: Checkout Source Files + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + + - name: Create Image + run: | + docker build \ + -t fcc-new-api \ + -f docker/new-api/Dockerfile . + + - name: Save Image + run: docker save fcc-new-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 (with new Api) + runs-on: ubuntu-22.04 + needs: [build-client, build-new-api] + strategy: + fail-fast: false + matrix: + # Extend this to include firefox and webkit once chromium is working. + browsers: [chromium] + node-version: [20.x] + + 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 + + - 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 + + # Cypress calls some pnpm scripts, so we need to install pnpm. + - 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: Install Dependencies + run: pnpm install + + - name: Set freeCodeCamp Environment Variables (needed by api) + run: | + cp sample.env .env + echo 'HOST=0.0.0.0' >> .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: 30 diff --git a/docker-compose.yml b/docker-compose.yml index 78eeb32e66b..8f1fea467c7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -3,6 +3,18 @@ services: image: mongo ports: - '27017:27017' + command: mongod --replSet rs0 + setup: + image: mongo + depends_on: + - mongo + restart: on-failure + entrypoint: [ + 'bash', + '-c', + # This will try to initiate the replica set, until it succeeds twice (i.e. until the replica set is already initialized) + 'mongosh --host mongo:27017 --eval ''try {rs.initiate();} catch (err) { if(err.codeName !== "AlreadyInitialized") throw err };''' + ] mailhog: restart: unless-stopped image: mailhog/mailhog @@ -10,10 +22,11 @@ services: - '1025:1025' - '8025:8025' api: + restart: unless-stopped depends_on: - mongo - mailhog - image: fcc-api + image: fcc-new-api env_file: - .env environment: @@ -24,9 +37,4 @@ services: ports: # PORT is used by the new api, so we use the less generic API_PORT to # avoid conflicts. - - '${API_PORT:-3000}:3000' - client: - image: fcc-client - ports: - # Same principle as above (avoiding conflicts) - - '${CLIENT_PORT:-8000}:8000' + - '3000:3000'