# Copyright © 2023 OpenIM open source community. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: Docker Buildx Images CI

on:
  schedule:
  - cron: '30 1 * * *'
  push:
    branches:
      - release-*
    tags:
      - v*
  workflow_dispatch:

jobs:
  build-ghcr:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2
        
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
        with:
          install: true

      - name: Cache Docker layers
        uses: actions/cache@v3
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-buildx-

      - name: Log in to GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}

################################################
# build/
# └── docker
#     ├── openim-api
#     │   └── Dockerfile
#     ├── openim-cmdutils
#     │   └── Dockerfile
#     ├── openim-crontask
#     │   └── Dockerfile
#     ├── openim-msggateway
#     │   └── Dockerfile
#     ├── openim-msgtransfer
#     │   └── Dockerfile
#     ├── openim-push
#     │   └── Dockerfile
#     ├── openim-rpc-auth
#     │   └── Dockerfile
#     ├── openim-rpc-conversation
#     │   └── Dockerfile
#     ├── openim-rpc-friend
#     │   └── Dockerfile
#     ├── openim-rpc-group
#     │   └── Dockerfile
#     ├── openim-rpc-msg
#     │   └── Dockerfile
#     ├── openim-rpc-third
#     │   └── Dockerfile
#     └── openim-rpc-user
#         └── Dockerfile
#############################################

      - name: Extract metadata (tags, labels) for Docker openim-api
        id: meta1
        uses: docker/metadata-action@v4.6.0
        with:
          images: ghcr.io/openimsdk/openim-api

      - name: Build and push Docker image for openim-api
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./build/docker/openim-api/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta1.outputs.tags }}
          labels: ${{ steps.meta1.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Extract metadata (tags, labels) for Docker openim-cmdutils
        id: meta2
        uses: docker/metadata-action@v4.6.0
        with:
          images: ghcr.io/openimsdk/openim-cmdutils

      - name: Build and push Docker image for openim-cmdutils
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./build/docker/openim-cmdutils/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta2.outputs.tags }}
          labels: ${{ steps.meta2.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Extract metadata (tags, labels) for Docker openim-crontask
        id: meta3
        uses: docker/metadata-action@v4.6.0
        with:
          images: ghcr.io/openimsdk/openim-crontask

      - name: Build and push Docker image for openim-crontask
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./build/docker/openim-crontask/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta3.outputs.tags }}
          labels: ${{ steps.meta3.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Extract metadata (tags, labels) for Docker openim-msggateway
        id: meta4
        uses: docker/metadata-action@v4.6.0
        with:
          images: ghcr.io/openimsdk/openim-msggateway

      - name: Build and push Docker image for openim-msggateway
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./build/docker/openim-msggateway/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta4.outputs.tags }}
          labels: ${{ steps.meta4.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Extract metadata (tags, labels) for Docker openim-msgtransfer
        id: meta5
        uses: docker/metadata-action@v4.6.0
        with:
          images: ghcr.io/openimsdk/openim-msgtransfer

      - name: Build and push Docker image for openim-msgtransfer
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./build/docker/openim-msgtransfer/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta5.outputs.tags }}
          labels: ${{ steps.meta5.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache
          
      - name: Extract metadata (tags, labels) for Docker openim-push
        id: meta6
        uses: docker/metadata-action@v4.6.0
        with:
          images: ghcr.io/openimsdk/openim-push

      - name: Build and push Docker image for openim-push
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./build/docker/openim-push/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta6.outputs.tags }}
          labels: ${{ steps.meta6.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Extract metadata (tags, labels) for Docker openim-rpc-auth
        id: meta7
        uses: docker/metadata-action@v4.6.0
        with:
          images: ghcr.io/openimsdk/openim-rpc-auth

      - name: Build and push Docker image for openim-rpc-auth
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./build/docker/openim-rpc-auth/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta7.outputs.tags }}
          labels: ${{ steps.meta7.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Extract metadata (tags, labels) for Docker openim-rpc-conversation
        id: meta8
        uses: docker/metadata-action@v4.6.0
        with:
          images: ghcr.io/openimsdk/openim-rpc-conversation

      - name: Build and push Docker image for openim-rpc-conversation
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./build/docker/openim-rpc-conversation/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta8.outputs.tags }}
          labels: ${{ steps.meta8.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Extract metadata (tags, labels) for Docker openim-rpc-friend
        id: meta9
        uses: docker/metadata-action@v4.6.0
        with:
          images: ghcr.io/openimsdk/openim-rpc-friend

      - name: Build and push Docker image for openim-rpc-friend
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./build/docker/openim-rpc-friend/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta9.outputs.tags }}
          labels: ${{ steps.meta9.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Extract metadata (tags, labels) for Docker openim-rpc-group
        id: meta10
        uses: docker/metadata-action@v4.6.0
        with:
          images: ghcr.io/openimsdk/openim-rpc-group

      - name: Build and push Docker image for openim-rpc-group
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./build/docker/openim-rpc-group/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta10.outputs.tags }}
          labels: ${{ steps.meta10.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Extract metadata (tags, labels) for Docker openim-rpc-msg
        id: meta11
        uses: docker/metadata-action@v4.6.0
        with:
          images: ghcr.io/openimsdk/openim-rpc-msg

      - name: Build and push Docker image for openim-rpc-msg
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./build/docker/openim-rpc-msg/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta11.outputs.tags }}
          labels: ${{ steps.meta11.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Extract metadata (tags, labels) for Docker openim-rpc-third
        id: meta12
        uses: docker/metadata-action@v4.6.0
        with:
          images: ghcr.io/openimsdk/openim-rpc-third

      - name: Build and push Docker image for openim-rpc-third
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./build/docker/openim-rpc-third/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta12.outputs.tags }}
          labels: ${{ steps.meta12.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache

      - name: Extract metadata (tags, labels) for Docker openim-rpc-user
        id: meta13
        uses: docker/metadata-action@v4.6.0
        with:
          images: ghcr.io/openimsdk/openim-rpc-user

      - name: Build and push Docker image for openim-rpc-user
        uses: docker/build-push-action@v4
        with:
          context: .
          file: ./build/docker/openim-rpc-user/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta13.outputs.tags }}
          labels: ${{ steps.meta13.outputs.labels }}
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache