name: docker

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
  cancel-in-progress: true

on:
  push:
    tags:
      - '*.*.*'
    branches:
      - master
    paths:
      - 'utils/docker/**'
      - '.github/workflows/docker.yml'
  pull_request:
    paths:
      - 'utils/docker/**'
      - '.github/workflows/docker.yml'
  schedule:
    - cron: "0 0 */7 * *"

jobs:
  prep:
    name: Prepare docker env
    runs-on: ubuntu-latest
    outputs:
      version: ${{ steps.prep.outputs.version }}
      docker_image: ${{ steps.prep.outputs.docker_image }}
      created: ${{ steps.prep.outputs.created }}
    steps:
      - name: Prepare docker env
        id: prep
        run: |
          DOCKER_IMAGE=wasmedge/wasmedge
          VERSION=noop
          if [ "${{ github.event_name }}" = "schedule" ]; then
          VERSION=nightly
          elif [[ $GITHUB_REF == refs/tags/* ]]; then
          VERSION=${GITHUB_REF#refs/tags/}
          elif [[ $GITHUB_REF == refs/heads/* ]]; then
          VERSION=$(echo ${GITHUB_REF#refs/heads/} | sed -r 's#/+#-#g')
          if [ "${{ github.event.repository.default_branch }}" = "$VERSION" ]; then
          VERSION=edge
          fi
          elif [[ $GITHUB_REF == refs/pull/* ]]; then
          VERSION=pr-${{ github.event.number }}
          fi
          echo "version=$VERSION" >> $GITHUB_OUTPUT
          echo "docker_image=$DOCKER_IMAGE" >> $GITHUB_OUTPUT
          echo "created=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT

  build-docker-images:
    name: build-docker-images
    needs: [prep]
    runs-on: ubuntu-latest
    container:
      image: wasmedge/wasmedge:ci-image-base

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

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

      - name: Login to DockerHub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_ACCESS_TOKEN }}

      - name: "Rebuild wasmedge/wasmedge:ci-image-base"
        uses: docker/build-push-action@v5
        with:
          context: ./utils/docker
          file: utils/docker/Dockerfile.ci-image-base
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ needs.prep.outputs.docker_image }}:ci-image-base
          labels: |
            org.opencontainers.image.title=${{ github.event.repository.name }}
            org.opencontainers.image.description=${{ github.event.repository.description }}
            org.opencontainers.image.url=${{ github.event.repository.html_url }}
            org.opencontainers.image.source=${{ github.event.repository.clone_url }}
            org.opencontainers.image.version=${{ needs.prep.outputs.version }}
            org.opencontainers.image.created=${{ needs.prep.outputs.created }}
            org.opencontainers.image.revision=${{ github.sha }}

      - name: "Rebuild wasmedge/wasmedge:ubuntu-base"
        uses: docker/build-push-action@v5
        with:
          context: ./utils/docker
          file: utils/docker/Dockerfile.base
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ needs.prep.outputs.docker_image }}:ubuntu-base
          labels: |
            org.opencontainers.image.title=${{ github.event.repository.name }}
            org.opencontainers.image.description=${{ github.event.repository.description }}
            org.opencontainers.image.url=${{ github.event.repository.html_url }}
            org.opencontainers.image.source=${{ github.event.repository.clone_url }}
            org.opencontainers.image.version=${{ needs.prep.outputs.version }}
            org.opencontainers.image.created=${{ needs.prep.outputs.created }}
            org.opencontainers.image.revision=${{ github.sha }}

      - name: "Rebuild wasmedge/wasmedge:ubuntu-build-clang"
        uses: docker/build-push-action@v5
        with:
          build-args: BASE=wasmedge/wasmedge:ubuntu-base
          context: ./utils/docker
          file: ./utils/docker/Dockerfile.build-clang
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ needs.prep.outputs.docker_image }}:ubuntu-build-clang
          labels: |
            org.opencontainers.image.title=${{ github.event.repository.name }}
            org.opencontainers.image.description=${{ github.event.repository.description }}
            org.opencontainers.image.url=${{ github.event.repository.html_url }}
            org.opencontainers.image.source=${{ github.event.repository.clone_url }}
            org.opencontainers.image.version=${{ needs.prep.outputs.version }}
            org.opencontainers.image.created=${{ needs.prep.outputs.created }}
            org.opencontainers.image.revision=${{ github.sha }}

      - name: "Rebuild wasmedge/wasmedge:ubuntu-build-gcc"
        uses: docker/build-push-action@v5
        with:
          build-args: BASE=wasmedge/wasmedge:ubuntu-base
          context: ./utils/docker
          file: utils/docker/Dockerfile.build-gcc
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ needs.prep.outputs.docker_image }}:ubuntu-build-gcc
          labels: |
            org.opencontainers.image.title=${{ github.event.repository.name }}
            org.opencontainers.image.description=${{ github.event.repository.description }}
            org.opencontainers.image.url=${{ github.event.repository.html_url }}
            org.opencontainers.image.source=${{ github.event.repository.clone_url }}
            org.opencontainers.image.version=${{ needs.prep.outputs.version }}
            org.opencontainers.image.created=${{ needs.prep.outputs.created }}
            org.opencontainers.image.revision=${{ github.sha }}

      - name: "Rebuild wasmedge/wasmedge:ubuntu-build-clang-plugins-deps"
        uses: docker/build-push-action@v5
        with:
          build-args: BASE=wasmedge/wasmedge:ubuntu-build-clang
          context: ./utils/docker
          file: ./utils/docker/Dockerfile.build-plugins-deps
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ needs.prep.outputs.docker_image }}:ubuntu-build-clang-plugins-deps
          labels: |
            org.opencontainers.image.title=${{ github.event.repository.name }}
            org.opencontainers.image.description=${{ github.event.repository.description }}
            org.opencontainers.image.url=${{ github.event.repository.html_url }}
            org.opencontainers.image.source=${{ github.event.repository.clone_url }}
            org.opencontainers.image.version=${{ needs.prep.outputs.version }}
            org.opencontainers.image.created=${{ needs.prep.outputs.created }}
            org.opencontainers.image.revision=${{ github.sha }}

      - name: "Rebuild wasmedge/wasmedge:ubuntu-build-gcc-plugins-deps"
        uses: docker/build-push-action@v5
        with:
          build-args: BASE=wasmedge/wasmedge:ubuntu-build-gcc
          context: ./utils/docker
          file: ./utils/docker/Dockerfile.build-plugins-deps
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ needs.prep.outputs.docker_image }}:ubuntu-build-gcc-plugins-deps
          labels: |
            org.opencontainers.image.title=${{ github.event.repository.name }}
            org.opencontainers.image.description=${{ github.event.repository.description }}
            org.opencontainers.image.url=${{ github.event.repository.html_url }}
            org.opencontainers.image.source=${{ github.event.repository.clone_url }}
            org.opencontainers.image.version=${{ needs.prep.outputs.version }}
            org.opencontainers.image.created=${{ needs.prep.outputs.created }}
            org.opencontainers.image.revision=${{ github.sha }}

      - name: "Rebuild wasmedge/wasmedge:latest"
        uses: docker/build-push-action@v5
        with:
          build-args: BASE=wasmedge/wasmedge:ubuntu-base
          context: ./utils/docker
          file: utils/docker/Dockerfile.build-clang
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ needs.prep.outputs.docker_image }}:latest
          labels: |
            org.opencontainers.image.title=${{ github.event.repository.name }}
            org.opencontainers.image.description=${{ github.event.repository.description }}
            org.opencontainers.image.url=${{ github.event.repository.html_url }}
            org.opencontainers.image.source=${{ github.event.repository.clone_url }}
            org.opencontainers.image.version=${{ needs.prep.outputs.version }}
            org.opencontainers.image.created=${{ needs.prep.outputs.created }}
            org.opencontainers.image.revision=${{ github.sha }}

  build-manylinux2014_x86_64:
    name: build-manylinux2014_x86_64
    runs-on: ubuntu-latest
    needs: [prep]
    container:
      image: wasmedge/wasmedge:ci-image-base

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

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

      - name: Login to DockerHub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_ACCESS_TOKEN }}

      - name: "Rebuild wasmedge/wasmedge:manylinux2014_x86_64"
        uses: docker/build-push-action@v5
        with:
          build-args: BASE=quay.io/pypa/manylinux2014_x86_64
          context: ./utils/docker
          file: utils/docker/Dockerfile.manylinux2014_x86_64
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ needs.prep.outputs.docker_image }}:manylinux2014_x86_64
          labels: |
            org.opencontainers.image.title=${{ github.event.repository.name }}
            org.opencontainers.image.description=${{ github.event.repository.description }}
            org.opencontainers.image.url=${{ github.event.repository.html_url }}
            org.opencontainers.image.source=${{ github.event.repository.clone_url }}
            org.opencontainers.image.version=${{ needs.prep.outputs.version }}
            org.opencontainers.image.created=${{ needs.prep.outputs.created }}
            org.opencontainers.image.revision=${{ github.sha }}

      - name: "Rebuild wasmedge/wasmedge:manylinux2014_x86_64-plugins-deps"
        uses: docker/build-push-action@v5
        with:
          build-args: BASE=wasmedge/wasmedge:manylinux2014_x86_64
          context: ./utils/docker
          file: utils/docker/Dockerfile.manylinux2014-build-plugins-deps
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ needs.prep.outputs.docker_image }}:manylinux2014_x86_64-plugins-deps
          labels: |
            org.opencontainers.image.title=${{ github.event.repository.name }}
            org.opencontainers.image.description=${{ github.event.repository.description }}
            org.opencontainers.image.url=${{ github.event.repository.html_url }}
            org.opencontainers.image.source=${{ github.event.repository.clone_url }}
            org.opencontainers.image.version=${{ needs.prep.outputs.version }}
            org.opencontainers.image.created=${{ needs.prep.outputs.created }}
            org.opencontainers.image.revision=${{ github.sha }}
