name: CI on: push: branches: [ "main" ] pull_request: branches: [ "main" ] workflow_dispatch: inputs: backend_image: description: 'Backend image to use in E2E tests (optional, default: ghcr.io/morbalint/kemkas-backend:b8565f8e)' required: false jobs: unit-test-and-lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Setup Node.js 24.x uses: actions/setup-node@v4 with: node-version: 24.x - name: Cache NPM packages uses: actions/cache@v4 with: key: npm-${{ hashFiles('./frontend/yarn.lock') }} path: | ./frontend/node_modules restore-keys: | npm-${{ hashFiles('./frontend/yarn.lock') }} npm- - name: Yarn Install run: | cd ./frontend yarn install --frozen-lockfile - name: Yarn Test run: | cd ./frontend yarn run test - name: Yarn Lint run: | cd ./frontend yarn run lint build-fe: runs-on: ubuntu-latest permissions: contents: read packages: write attestations: write id-token: write outputs: image_sha_tag: ${{ steps.image-tag.outputs.image_sha_tag }} steps: - uses: actions/checkout@v6 - uses: docker/setup-buildx-action@v4 - name: Log in to GitHub Container Registry uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Compute frontend image tag id: image-tag run: | image_repo="ghcr.io/${{ github.repository_owner }}/kemkas-frontend" sha_tag="${image_repo}:${GITHUB_SHA::8}" tags="$sha_tag" if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then tags+=$'\n'"${image_repo}:latest" fi echo "image_sha_tag=${sha_tag}" >> "$GITHUB_OUTPUT" { echo "tags<> "$GITHUB_OUTPUT" - name: Build and push frontend image uses: docker/build-push-action@v7 with: context: ./frontend/ file: ./frontend/Dockerfile cache-from: type=gha cache-to: type=gha,mode=max push: true tags: | ${{ steps.image-tag.outputs.tags }} build-e2e: runs-on: ubuntu-latest permissions: contents: read packages: write attestations: write id-token: write outputs: image_sha_tag: ${{ steps.image-tag.outputs.image_sha_tag }} steps: - uses: actions/checkout@v6 - uses: docker/setup-buildx-action@v4 - name: Log in to GitHub Container Registry uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Compute e2e image tag id: image-tag run: | image_repo="ghcr.io/${{ github.repository_owner }}/kemkas-e2e" sha_tag="${image_repo}:${GITHUB_SHA::8}" tags="$sha_tag" if [[ "${GITHUB_REF}" == "refs/heads/main" ]]; then tags+=$'\n'"${image_repo}:latest" fi echo "image_sha_tag=${sha_tag}" >> "$GITHUB_OUTPUT" { echo "tags<> "$GITHUB_OUTPUT" - name: Build and push e2e image uses: docker/build-push-action@v7 with: context: ./e2e/ file: ./e2e/Dockerfile cache-from: type=gha cache-to: type=gha,mode=max push: true tags: | ${{ steps.image-tag.outputs.tags }} run-e2e: runs-on: ubuntu-latest needs: - build-fe - build-e2e permissions: contents: read packages: read env: BACKEND_IMAGE: ${{ github.event.inputs.backend_image || 'ghcr.io/morbalint/kemkas-backend:b8565f8e' }} FRONTEND_IMAGE: ${{ needs.build-fe.outputs.image_sha_tag }} E2E_IMAGE: ${{ needs.build-e2e.outputs.image_sha_tag }} steps: - uses: actions/checkout@v6 - name: Setup docker compose uses: docker/setup-compose-action@v2 - name: Log in to GitHub Container Registry uses: docker/login-action@v4 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Pull images for test run run: docker compose -f e2e.docker-compose.yaml pull - name: Run Docker Compose E2E tests run: docker compose -f e2e.docker-compose.yaml up --no-build --abort-on-container-exit --exit-code-from e2e e2e - name: Upload Playwright HTML report if: always() uses: actions/upload-artifact@v7 with: name: playwright-report path: e2e/playwright-report if-no-files-found: ignore - name: Upload Playwright test results if: always() uses: actions/upload-artifact@v7 with: name: playwright-test-results path: e2e/test-results if-no-files-found: ignore - name: Tear down Docker Compose stack if: always() run: docker compose -f e2e.docker-compose.yaml down -v --remove-orphans