on:
  push:
    tags:
      - "v*"
name: Test and Release
jobs:
  npm-test:
    name: JavaScript Tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        name: Install Node
        with:
          node-version: latest
      - run: corepack enable
      - run: pnpm --version
      - uses: actions/setup-node@v4
        with:
          node-version: latest
          cache: "pnpm"
          cache-dependency-path: "**/pnpm-lock.yaml"
      - name: Install dependencies
        run: pnpm install --frozen-lockfile --prefer-offline
      - name: Run Tests
        run: pnpm run test -- --outputTruncateLength=500
  go-test:
    name: Go Tests
    runs-on: ubuntu-latest
    steps:
      - name: Install Go
        uses: actions/setup-go@v5
        with:
          go-version: 1.22.x
          check-latest: true
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Install Protoc
        uses: arduino/setup-protoc@v3
      - name: Install gRPC and Go
        run: |
          go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
          go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
      - name: Run Go Tests with Coverage
        run: make test
  int-test:
    name: Integration Tests
    timeout-minutes: 60
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        name: Install Node
        with:
          node-version: latest
      - run: corepack enable
      - run: pnpm --version
      - uses: actions/setup-node@v4
        with:
          node-version: latest
          cache: "pnpm"
          cache-dependency-path: "**/pnpm-lock.yaml"
      - name: Install dependencies
        run: pnpm install
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: Writing certs to file
        run: |
          echo "${{ secrets.TTL_KEY }}" > shared_key.pem
          echo "${{ secrets.TTL_CERT }}" > shared_cert.pem
      - name: Build
        uses: docker/bake-action@v6
        with:
          source: .
          load: true
          set: |
            *.cache-from=type=gha
            *.cache-to=type=gha,mode=max
      - name: Run Playwright tests
        run: docker compose up --exit-code-from playwright
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: playwright-report
          path: playwright-report/
          retention-days: 30
  buildx:
    needs: [go-test, npm-test, int-test]
    name: Release
    runs-on: ubuntu-latest
    steps:
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0
      - name: Login to DockerHub
        uses: docker/login-action@v3.3.0
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Log in to the Container registry
        uses: docker/login-action@v3.3.0
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Checkout
        uses: actions/checkout@v4
      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: |
            amir20/dozzle
            ghcr.io/amir20/dozzle
          tags: |
            type=raw,value=latest
            type=semver,pattern={{version}},prefix=v
            type=semver,pattern={{major}}.{{minor}},prefix=v
            type=semver,pattern={{major}},prefix=v
      - name: Writing certs to file
        run: |
          echo "${{ secrets.TTL_KEY }}" > shared_key.pem
          echo "${{ secrets.TTL_CERT }}" > shared_cert.pem
      - name: Build and push
        uses: docker/build-push-action@v6.13.0
        with:
          push: true
          context: .
          platforms: linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8
          tags: ${{ steps.meta.outputs.tags }}
          build-args: TAG=${{ steps.meta.outputs.version }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
  git-release:
    needs: [buildx]
    name: Github Release
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Install Node
        uses: actions/setup-node@v4
      - name: Release to Github
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: npx changelogithub
