# 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-Linux

on:
  push:
    # Publish `master` as Docker `latest` image.
    branches:
      - master
    paths:
      - 'docker/linux/**'

  # Run builds for any PRs.
  pull_request:
    paths:
      - 'docker/linux/**'

env:
  IMAGE_NAME: nuttx-ci-linux

jobs:
  # Push image to GitHub Packages.
  push:
    runs-on: ubuntu-latest
    env:
      DOCKER_BUILDKIT: 1
      IMAGE_TAG: docker.pkg.github.com/${{ github.repository }}/nuttx-ci-linux
    steps:
      - uses: actions/checkout@v2

      - name: Log into registry
        run: echo "${{ secrets.GITHUB_TOKEN }}" | docker login docker.pkg.github.com -u ${{ github.actor }} --password-stdin

      - name: Build Linux image
        run: |
          echo "Building Linux Image using cache from $IMAGE_TAG"

          docker build \
            --build-arg BUILDKIT_INLINE_CACHE=1 \
            --cache-from $IMAGE_TAG \
            --tag $IMAGE_TAG \
            -f ./docker/linux/Dockerfile ./docker/
        
      - name: Push Linux image
        if: (github.event_name == 'push') && (github.ref == 'refs/heads/master')
        run: |
          docker push $IMAGE_TAG
