#
#  Copyright (c) 2020, The OpenThread Authors.
#  All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#  3. Neither the name of the copyright holder nor the
#     names of its contributors may be used to endorse or promote products
#     derived from this software without specific prior written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
#  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
#  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
#  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
#  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
#  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
#  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
#  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
#  POSSIBILITY OF SUCH DAMAGE.
#

name: Docker

on: [push, pull_request]

jobs:

  cancel-previous-runs:
    runs-on: ubuntu-20.04
    steps:
    - uses: rokroskar/workflow-run-cleanup-action@master
      env:
        GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
      if: "github.ref != 'refs/heads/main'"

  buildx:
    name: buildx-${{ matrix.docker_name }}
    runs-on: ubuntu-20.04
    strategy:
      fail-fast: false
      matrix:
        include:
          - docker_name: environment
    steps:
    - uses: actions/checkout@v2
      with:
        submodules: true

    - name: Prepare
      id: prepare
      run: |
        DOCKER_IMAGE=openthread/${{ matrix.docker_name }}
        DOCKER_FILE=etc/docker/${{ matrix.docker_name }}/Dockerfile
        DOCKER_PLATFORMS=linux/amd64
        VERSION=latest

        TAGS="--tag ${DOCKER_IMAGE}:${VERSION}"

        echo ::set-output name=docker_image::${DOCKER_IMAGE}
        echo ::set-output name=version::${VERSION}
        echo ::set-output name=buildx_args::--platform ${DOCKER_PLATFORMS} \
          --build-arg OT_GIT_REF=${{ github.sha }} \
          --build-arg VERSION=${VERSION} \
          --build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \
          --build-arg VCS_REF=${GITHUB_SHA::8} \
          ${TAGS} --file ${DOCKER_FILE} .

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

    - name: Docker Buildx (build)
      run: |
        docker buildx build --output "type=image,push=false" ${{ steps.prepare.outputs.buildx_args }}

    - name: Login to DockerHub
      if: success() && github.repository == 'openthread/openthread' && github.event_name != 'pull_request'
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

    - name: Docker Buildx (push)
      if: success() && github.repository == 'openthread/openthread' && github.event_name != 'pull_request'
      run: |
        docker buildx build --output "type=image,push=true" ${{ steps.prepare.outputs.buildx_args }}

    - name: Inspect Image
      if: always() && github.repository == 'openthread/openthread' && github.event_name != 'pull_request'
      run: |
        docker buildx imagetools inspect ${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.version }}
