name: Build Docker Image
on:
  ## 发布release的时候会自动构建
  release:
    types: [published]
jobs:
  prepare:
    runs-on: ubuntu-latest
    name: Prepare build metadata
    permissions:
      contents: read
    outputs:
      version: ${{ steps.check_version.outputs.version }}
      is_prerelease: ${{ github.event.release.prerelease }}
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          persist-credentials: false

      - name: judge has env GITHUB_REF  # 如果没有GITHUB_REF环境变量，则把github.ref变量赋值给GITHUB_REF
        run: |
          if [ -z "$GITHUB_REF" ]; then
            export GITHUB_REF=${{ github.ref }}
            echo $GITHUB_REF
          fi
      - name: Check version
        id: check_version
        run: |
          echo $GITHUB_REF
          # 如果是tag，则去掉refs/tags/前缀
          if [[ $GITHUB_REF == refs/tags/* ]]; then
            echo "It's a tag"
            echo $GITHUB_REF
            echo $GITHUB_REF | awk -F '/' '{print $3}'
            echo ::set-output name=version::$(echo $GITHUB_REF | awk -F '/' '{print $3}')
          else
            echo "It's not a tag"
            echo $GITHUB_REF
            echo ::set-output name=version::${GITHUB_REF}
          fi

  build-images:
    runs-on: ubuntu-latest
    needs: prepare
    name: Build ${{ matrix.platform }} image
    permissions:
      contents: read
    strategy:
      matrix:
        platform: [linux/amd64, linux/arm64]
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          persist-credentials: false

      - name: Set platform tag
        id: platform_tag
        run: |
          # Convert platform to tag suffix (e.g., linux/amd64 -> amd64)
          PLATFORM_TAG=$(echo ${{ matrix.platform }} | sed 's/linux\///g')
          echo ::set-output name=tag::${PLATFORM_TAG}

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

      - name: Login to Registry
        run: docker login --username=${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and cache
        run: |
          docker buildx build \
            --platform ${{ matrix.platform }} \
            --cache-to type=registry,ref=rockchin/langbot:cache-${{ steps.platform_tag.outputs.tag }},mode=max \
            --cache-from type=registry,ref=rockchin/langbot:cache-${{ steps.platform_tag.outputs.tag }} \
            -t rockchin/langbot:${{ needs.prepare.outputs.version }} \
            .

  push-multiarch:
    runs-on: ubuntu-latest
    needs: [prepare, build-images]
    name: Build and push multi-arch images
    permissions:
      contents: read
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          persist-credentials: false

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

      - name: Login to Registry
        run: docker login --username=${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }}

      - name: Build and push for Release
        if: ${{ needs.prepare.outputs.is_prerelease == 'false' }}
        run: |
          docker buildx build \
            --platform linux/amd64,linux/arm64 \
            --cache-from type=registry,ref=rockchin/langbot:cache-amd64 \
            --cache-from type=registry,ref=rockchin/langbot:cache-arm64 \
            -t rockchin/langbot:${{ needs.prepare.outputs.version }} \
            -t rockchin/langbot:latest \
            --push \
            .

      - name: Build and push for Pre-release
        if: ${{ needs.prepare.outputs.is_prerelease == 'true' }}
        run: |
          docker buildx build \
            --platform linux/amd64,linux/arm64 \
            --cache-from type=registry,ref=rockchin/langbot:cache-amd64 \
            --cache-from type=registry,ref=rockchin/langbot:cache-arm64 \
            -t rockchin/langbot:${{ needs.prepare.outputs.version }} \
            --push \
            .
