name: Publish consumable Docker images

on:
  push:
    tags: ['*.*.*']

jobs:
  compile:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        arch:
        - x86_64-unknown-linux-musl
        - x86_64-unknown-linux-gnu
    steps:
    - uses: actions/checkout@v1
    - run: cargo install cross
    - name: compile for specific target
      env: { arch: '${{ matrix.arch }}' }
      run: |
        cross build --target ${{ matrix.arch }} --release
        # leave only the executable file
        rm -rd target/${{ matrix.arch }}/release/{*/*,*.d,*.rlib,.fingerprint}
        find . -empty -delete
    - uses: actions/upload-artifact@master
      with:
        name: ${{ matrix.arch }}
        path: target/${{ matrix.arch }}/release

  docker:
    name: Build and publish docker images
    needs: compile
    runs-on: ubuntu-latest
    strategy:
      matrix:
        tag:
        - alpine
        - slim
        - debian
        - glibc-busybox
        - musl-busybox
        - musl-distroless
        - glibc-distroless
        - glibc
        - musl
        include:
        - { tag: alpine,           base-image: alpine,                     arch: x86_64-unknown-linux-musl, plugin: true    }
        - { tag: slim,             base-image: 'debian:stable-slim',       arch: x86_64-unknown-linux-gnu,  plugin: true    }
        - { tag: debian,           base-image: debian,                     arch: x86_64-unknown-linux-gnu,  plugin: true    }
        - { tag: glibc-busybox,    base-image: 'busybox:glibc',            arch: x86_64-unknown-linux-gnu,  use-patch: true }
        - { tag: musl-busybox,     base-image: 'busybox:musl',             arch: x86_64-unknown-linux-musl,                 }
        - { tag: musl-distroless,  base-image: 'gcr.io/distroless/static', arch: x86_64-unknown-linux-musl,                 }
        - { tag: glibc-distroless, base-image: 'gcr.io/distroless/cc',     arch: x86_64-unknown-linux-gnu,  use-patch: true }
        - { tag: glibc,            base-image: scratch,                    arch: x86_64-unknown-linux-gnu,                  }
        - { tag: musl,             base-image: scratch,                    arch: x86_64-unknown-linux-musl,                 }
    steps:
    - uses: actions/checkout@v1
    - uses: actions/download-artifact@master
      with: { name: '${{ matrix.arch }}', path: target/release }
    - name: Build and publish exact version
      run: |
        REGISTRY=${REGISTRY,,}; export TAG=${GITHUB_REF##*/}-${{ matrix.tag }};
        export NU_BINS=target/release/$( [ ${{ matrix.plugin }} = true ] && echo nu* || echo nu )
        export PATCH=$([ ${{ matrix.use-patch }} = true ] && echo .${{ matrix.tag }} || echo '')
        chmod +x $NU_BINS

        echo ${{ secrets.DOCKER_REGISTRY }} | docker login docker.pkg.github.com -u ${{ github.actor }} --password-stdin
        docker-compose --file docker/docker-compose.package.yml build
        docker-compose --file docker/docker-compose.package.yml push              # exact version
      env:
        BASE_IMAGE: ${{ matrix.base-image }}
        REGISTRY: docker.pkg.github.com/${{ github.repository }}

    #region semantics tagging
    - name: Retag and push without suffixing version
      run: |
        VERSION=${GITHUB_REF##*/}
        docker tag ${REGISTRY,,}/nu:${VERSION}-${{ matrix.tag }} ${REGISTRY,,}/nu:${{ matrix.tag }}
        docker tag ${REGISTRY,,}/nu:${VERSION}-${{ matrix.tag }} ${REGISTRY,,}/nu:${VERSION%%.*}-${{ matrix.tag }}
        docker tag ${REGISTRY,,}/nu:${VERSION}-${{ matrix.tag }} ${REGISTRY,,}/nu:${VERSION%.*}-${{ matrix.tag }}
        docker push ${REGISTRY,,}/nu:${VERSION%.*}-${{ matrix.tag }}              # latest patch
        docker push ${REGISTRY,,}/nu:${VERSION%%.*}-${{ matrix.tag }}             # latest features
        docker push ${REGISTRY,,}/nu:${{ matrix.tag }}                            # latest version
      env: { REGISTRY: 'docker.pkg.github.com/${{ github.repository }}' }
    - name: Retag and push debian as latest
      if: matrix.tag == 'debian'
      run: |
        VERSION=${GITHUB_REF##*/}
        docker tag ${REGISTRY,,}/nu:${{ matrix.tag }} ${REGISTRY,,}/nu:latest
        docker tag ${REGISTRY,,}/nu:${VERSION}-${{ matrix.tag }} ${REGISTRY,,}/nu:${VERSION%.*}
        docker tag ${REGISTRY,,}/nu:${VERSION}-${{ matrix.tag }} ${REGISTRY,,}/nu:${VERSION%%.*}
        docker tag ${REGISTRY,,}/nu:${VERSION}-${{ matrix.tag }} ${REGISTRY,,}/nu:${VERSION}
        docker push ${REGISTRY,,}/nu:${VERSION}       # exact version
        docker push ${REGISTRY,,}/nu:${VERSION%%.*}   # latest features
        docker push ${REGISTRY,,}/nu:${VERSION%.*}    # latest patch
        docker push ${REGISTRY,,}/nu:latest           # latest version
      env: { REGISTRY: 'docker.pkg.github.com/${{ github.repository }}' }
    #endregion semantics tagging