version: 2
jobs:
  # Define in CircleCi Project Variables: $DOCKERHUB_REPO, $DOCKERHUB_USER, $DOCKERHUB_PASS
  # Publish jobs require those variables
  publish_docker_linuxamd64:
    machine:
      docker_layer_caching: false
    steps:
      - checkout  
      - run:
          command: |
            LATEST_TAG="${CIRCLE_TAG:1}"
            DOCKERHUB_DESTINATION="$DOCKERHUB_REPO:$LATEST_TAG-amd64"
            DOCKERHUB_DOCKERFILE="Dockerfile"
            sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS
            sudo docker build --pull -t "$DOCKERHUB_DESTINATION" -f "$DOCKERHUB_DOCKERFILE" .
            sudo docker push "$DOCKERHUB_DESTINATION"

  publish_docker_linuxarm32v7:
    machine:
      docker_layer_caching: false
    steps:
      - checkout  
      - run:
          command: |
            sudo docker run --rm --privileged multiarch/qemu-user-static:register --reset
            LATEST_TAG="${CIRCLE_TAG:1}"
            DOCKERHUB_DESTINATION="$DOCKERHUB_REPO:$LATEST_TAG-arm32v7"
            DOCKERHUB_DOCKERFILE="Dockerfile.arm32v7"
            sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS
            sudo docker build --pull -t "$DOCKERHUB_DESTINATION" -f "$DOCKERHUB_DOCKERFILE" .
            sudo docker push "$DOCKERHUB_DESTINATION"

  publish_docker_linuxarm64v8:
    machine:
      docker_layer_caching: false
    steps:
      - checkout  
      - run:
          command: |
            sudo docker run --rm --privileged multiarch/qemu-user-static:register --reset
            LATEST_TAG="${CIRCLE_TAG:1}"
            DOCKERHUB_DESTINATION="$DOCKERHUB_REPO:$LATEST_TAG-arm64v8"
            DOCKERHUB_DOCKERFILE="Dockerfile.arm64v8"
            sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS
            sudo docker build --pull -t "$DOCKERHUB_DESTINATION" -f "$DOCKERHUB_DOCKERFILE" .
            sudo docker push "$DOCKERHUB_DESTINATION"

  publish_docker_multiarch:
    machine:
      enabled: true
      image: circleci/classic:201808-01
    steps:
      - run:
          command: |
            # Turn on Experimental features
            LATEST_TAG="${CIRCLE_TAG:1}"
            sudo mkdir $HOME/.docker
            sudo sh -c 'echo "{ \"experimental\": \"enabled\" }" >> $HOME/.docker/config.json'
            #
            sudo docker login --username=$DOCKERHUB_USER --password=$DOCKERHUB_PASS
            #
            sudo docker manifest create --amend "$DOCKERHUB_REPO:$LATEST_TAG" "$DOCKERHUB_REPO:$LATEST_TAG-amd64" "$DOCKERHUB_REPO:$LATEST_TAG-arm32v7" "$DOCKERHUB_REPO:$LATEST_TAG-arm64v8"
            sudo docker manifest annotate "$DOCKERHUB_REPO:$LATEST_TAG" "$DOCKERHUB_REPO:$LATEST_TAG-amd64" --os linux --arch amd64
            sudo docker manifest annotate "$DOCKERHUB_REPO:$LATEST_TAG" "$DOCKERHUB_REPO:$LATEST_TAG-arm32v7" --os linux --arch arm --variant v7
            sudo docker manifest annotate "$DOCKERHUB_REPO:$LATEST_TAG" "$DOCKERHUB_REPO:$LATEST_TAG-arm64v8" --os linux --arch arm64 --variant v8
            sudo docker manifest push "$DOCKERHUB_REPO:$LATEST_TAG" -p

workflows:
  version: 2
  publish:
    jobs:
      - publish_docker_linuxamd64:
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /v(?:(?<major>(?:0|[1-9](?:(?:0|[1-9])+)*))[.](?<minor>(?:0|[1-9](?:(?:0|[1-9])+)*))[.](?<patch>(?:0|[1-9](?:(?:0|[1-9])+)*))(?:-(?:([A-Za-z1-9])*))?)$/
      - publish_docker_linuxarm32v7:
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /v(?:(?<major>(?:0|[1-9](?:(?:0|[1-9])+)*))[.](?<minor>(?:0|[1-9](?:(?:0|[1-9])+)*))[.](?<patch>(?:0|[1-9](?:(?:0|[1-9])+)*))(?:-(?:([A-Za-z1-9])*))?)$/
      - publish_docker_linuxarm64v8:
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /v(?:(?<major>(?:0|[1-9](?:(?:0|[1-9])+)*))[.](?<minor>(?:0|[1-9](?:(?:0|[1-9])+)*))[.](?<patch>(?:0|[1-9](?:(?:0|[1-9])+)*))(?:-(?:([A-Za-z1-9])*))?)$/
      - publish_docker_multiarch:
          requires:
            - publish_docker_linuxamd64
            - publish_docker_linuxarm32v7
            - publish_docker_linuxarm64v8
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /v(?:(?<major>(?:0|[1-9](?:(?:0|[1-9])+)*))[.](?<minor>(?:0|[1-9](?:(?:0|[1-9])+)*))[.](?<patch>(?:0|[1-9](?:(?:0|[1-9])+)*))(?:-(?:([A-Za-z1-9])*))?)$/
