diff --git a/.github/workflows/temporary-container-checks.yml b/.github/workflows/temporary-container-checks.yml new file mode 100644 index 00000000000..6a59b117ba0 --- /dev/null +++ b/.github/workflows/temporary-container-checks.yml @@ -0,0 +1,170 @@ +# TODO: remove this workflow once we use containers in the other workflows. This +# workflow is intended to prevent regressions until that has been achieved. +name: CI - E2E - Containers +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-**' + +jobs: + build-client: + name: Build Client (Container) + runs-on: ubuntu-20.04 + strategy: + matrix: + node-version: [18.x] + + steps: + - name: Checkout Source Files + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + + - name: Checkout client-config + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + with: + repository: freeCodeCamp/client-config + path: client-config + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + with: + node-version: ${{ matrix.node-version }} + cache: pnpm + + - name: Create Image + run: | + docker build \ + --build-arg HOME_LOCATION=http://localhost:8000 \ + --build-arg API_LOCATION=http://localhost:3000 \ + --build-arg FORUM_LOCATION=https://forum.freecodecamp.org \ + --build-arg NEWS_LOCATION=https://www.freecodecamp.org/news \ + --build-arg RADIO_LOCATION=https://coderadio.freecodecamp.org \ + --build-arg CLIENT_LOCALE=english \ + --build-arg CURRICULUM_LOCALE=english \ + --build-arg SHOW_LOCALE_DROPDOWN_MENU=false \ + --build-arg ALGOLIA_APP_ID=app_id_from_algolia_dashboard \ + --build-arg ALGOLIA_API_KEY=api_key_from_algolia_dashboard \ + --build-arg STRIPE_PUBLIC_KEY=pk_from_stripe_dashboard \ + --build-arg PAYPAL_CLIENT_ID=id_from_paypal_dashboard \ + --build-arg PATREON_CLIENT_ID=id_from_patreon_dashboard \ + --build-arg DEPLOYMENT_ENV=staging \ + --build-arg SHOW_UPCOMING_CHANGES=false \ + --build-arg SHOW_NEW_CURRICULUM=true \ + --build-arg GROWTHBOOK_URI=api_URI_from_Growthbook_dashboard \ + --build-arg FREECODECAMP_NODE_ENV=development \ + -t fcc-client \ + -f docker/web/Dockerfile . + + - name: Save Image + run: docker save fcc-client > client-artifact.tar + + - name: Upload Client Artifact + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3 + with: + name: client-artifact + path: client-artifact.tar + + # TODO: Figure out what to do with the webpack stats file. Create it + # during the build via a mounted host directory? i.e. docker build -t + # myimage -v /path/on/host:/output/dir -f Dockerfile . It's important to + # ensure it doesn't end up in the final image, as it's a large file. + # - name: Upload Webpack Stats + # uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3 + # with: + # name: webpack-stats + # path: client/public/stats.json + + cypress-run: + name: Test + runs-on: ubuntu-20.04 + needs: build-client + strategy: + fail-fast: false + matrix: + # To avoid wasting resources we're only using chrome for now. + browsers: [chrome] + node-version: [18.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 + + steps: + - name: Set Action Environment Variables + run: | + echo "CYPRESS_RECORD_KEY=${{ secrets.CYPRESS_RECORD_KEY }}" >> $GITHUB_ENV + echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV + + - name: Checkout Source Files + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + + - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3 + with: + name: client-artifact + + - name: Load Client Image + run: | + docker load < client-artifact.tar + + - name: Setup pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 + + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@5e21ff4d9bc1a8cf6de233a3057d20ec6b3fb69d # v3 + with: + node-version: ${{ matrix.node-version }} + # cypress-io/github-action caches the store, so we should not cache it + # here. + + - name: Set freeCodeCamp Environment Variables + run: cp sample.env .env + + - name: Install and Build + run: | + pnpm install + pnpm run create:config + pnpm run build:curriculum + pnpm run build:server + + - name: Seed Database + run: pnpm run seed + + # start-ci uses pm2, so it needs to be installed globally + - name: Install pm2 + run: npm i -g pm2 + + - name: Cypress run + uses: cypress-io/github-action@v4 + with: + record: ${{ env.CYPRESS_RECORD_KEY != 0 }} + start: | + pnpm start:server + docker compose up -d + wait-on: http://localhost:8000 + wait-on-timeout: 1200 + config: baseUrl=http://localhost:8000 + browser: ${{ matrix.browsers }} + spec: ${{ matrix.spec }}