name: Dokploy Docker Build

on:
  push:
    branches: [main, canary, "fix/re-apply-database-migration-fix"]
  workflow_dispatch:

env:
  IMAGE_NAME: dokploy/dokploy

jobs:
  docker-amd:
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Set tag and version
        id: meta
        run: |
          if [ "${{ github.ref }}" = "refs/heads/main" ]; then
            TAG="latest"
            VERSION=$(node -p "require('./apps/dokploy/package.json').version")
          elif [ "${{ github.ref }}" = "refs/heads/canary" ]; then
            TAG="canary"
          else
            TAG="feature"
          fi
          echo "tags=${IMAGE_NAME}:${TAG}-amd64" >> $GITHUB_OUTPUT

      - name: Prepare env file
        run: |
          cp apps/dokploy/.env.production.example .env.production
          cp apps/dokploy/.env.production.example apps/dokploy/.env.production

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          platforms: linux/amd64
          push: true
          tags: ${{ steps.meta.outputs.tags }}
  docker-arm:
    runs-on: ubuntu-24.04-arm
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Set tag and version
        id: meta
        run: |
          VERSION=$(node -p "require('./apps/dokploy/package.json').version")
          if [ "${{ github.ref }}" = "refs/heads/main" ]; then
            TAG="latest"
            VERSION=$(node -p "require('./apps/dokploy/package.json').version")
          elif [ "${{ github.ref }}" = "refs/heads/canary" ]; then
            TAG="canary"
          else
            TAG="feature"
          fi
          echo "tags=${IMAGE_NAME}:${TAG}-arm64" >> $GITHUB_OUTPUT

      - name: Prepare env file
        run: |
          cp apps/dokploy/.env.production.example .env.production
          cp apps/dokploy/.env.production.example apps/dokploy/.env.production

      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: .
          platforms: linux/arm64
          push: true
          tags: ${{ steps.meta.outputs.tags }}

  combine-manifests:
    needs: [docker-amd, docker-arm]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Create and push manifests
        run: |
          if [ "${{ github.ref }}" = "refs/heads/main" ]; then
            VERSION=$(node -p "require('./apps/dokploy/package.json').version")
            TAG="latest"

            docker buildx imagetools create -t ${IMAGE_NAME}:${TAG} \
              ${IMAGE_NAME}:${TAG}-amd64 \
              ${IMAGE_NAME}:${TAG}-arm64

            docker buildx imagetools create -t ${IMAGE_NAME}:${VERSION} \
              ${IMAGE_NAME}:${TAG}-amd64 \
              ${IMAGE_NAME}:${TAG}-arm64

          elif [ "${{ github.ref }}" = "refs/heads/canary" ]; then
            TAG="canary"
            docker buildx imagetools create -t ${IMAGE_NAME}:${TAG} \
              ${IMAGE_NAME}:${TAG}-amd64 \
              ${IMAGE_NAME}:${TAG}-arm64

          else
            TAG="feature"
            docker buildx imagetools create -t ${IMAGE_NAME}:${TAG} \
              ${IMAGE_NAME}:${TAG}-amd64 \
              ${IMAGE_NAME}:${TAG}-arm64
          fi

  generate-release:
    needs: [combine-manifests]
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Get version
        id: get_version
        run: |
          VERSION=$(node -p "require('./apps/dokploy/package.json').version")
          echo "version=$VERSION" >> $GITHUB_OUTPUT

      - name: Create Release
        uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ steps.get_version.outputs.version }}
          name: ${{ steps.get_version.outputs.version }}
          generate_release_notes: true
          draft: false
          prerelease: false
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
