name: Publish rolling build

on:
  push:
    branches:
      - master

jobs:
  npm:
    runs-on: ubuntu-20.04

    strategy:
      matrix:
        node: [15]

    steps:
      - uses: actions/checkout@v2

      - name: Use Node.js ${{ matrix.node }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node }}
          registry-url: 'https://registry.npmjs.org'

      - run: npm ci --no-optional

      - name: Tag rolling release
        id: tag_release
        run: |
          git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
          git config --local user.name "github-actions[bot]"
          build_version=0.0.0-master.`git rev-parse --short HEAD`
          npm version --no-git-tag-version $build_version
          echo ::set-output name=BUILD_VERSION::$build_version

      - name: Use @${{ github.actor }} scope
        run: |
          jq '.name = "@${{ github.actor }}/flood"' package.json > package.new.json
          mv package.new.json package.json

      - run: npm pack

      - run: npm publish --access public ./*.tgz
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

      - name: Upload tarball
        uses: actions/upload-artifact@v2
        with:
          name: flood
          path: ./*.tgz
          if-no-files-found: error

      - name: Wait until the package is available
        uses: nick-invision/retry@v2
        with:
          command: curl -f -s https://registry.npmjs.org/@jesec/flood/${{ steps.tag_release.outputs.BUILD_VERSION }} &>/dev/null
          timeout_minutes: 30
          max_attempts: 15
          retry_wait_seconds: 15

      - run: sleep 20

  docker:
    needs: npm
    runs-on: ubuntu-20.04

    steps:
      - uses: actions/checkout@v2

      - name: Set up QEMU
        run: |
          sudo apt update
          sudo apt install --reinstall -y qemu-user-static

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

      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Parse version
        id: parse_version
        run: |
          echo ::set-output name=BUILD_VERSION::0.0.0-master.`git rev-parse --short HEAD`

      - name: Publish flood:master to Docker Hub
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./distribution/containers/Dockerfile.release
          platforms: linux/amd64,linux/arm64,linux/arm/v7
          push: true
          tags: jesec/flood:master
          build-args: |
            PACKAGE=@jesec/flood
            VERSION=${{ steps.parse_version.outputs.BUILD_VERSION }}

      - run: sleep 10

      - name: Publish rtorrent-flood to Docker Hub
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./distribution/containers/Dockerfile.rtorrent
          platforms: linux/amd64,linux/arm64
          push: true
          tags: |
            jesec/rtorrent-flood:master
            jesec/rtorrent-flood:latest
          build-args: |
            FLOOD_VERSION=master
            RTORRENT_VERSION=master

  docker-dbg:
    runs-on: ubuntu-20.04

    steps:
      - uses: actions/checkout@v2

      - name: Set up QEMU
        run: |
          sudo apt update
          sudo apt install --reinstall -y qemu-user-static

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

      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - name: Tag rolling release
        run: |
          git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
          git config --local user.name "github-actions[bot]"
          npm version --no-git-tag-version 0.0.0-master.`git rev-parse --short HEAD`

      - name: Publish flood:master-dbg to Docker Hub
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./Dockerfile
          target: flood
          platforms: linux/amd64,linux/arm64
          push: true
          tags: jesec/flood:master-dbg

      - name: Publish rtorrent-flood:master-dbg to Docker Hub
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./Dockerfile
          target: rtorrent-flood
          platforms: linux/amd64,linux/arm64
          push: true
          tags: jesec/rtorrent-flood:master-dbg

  pkg:
    needs: npm
    runs-on: ubuntu-20.04

    strategy:
      matrix:
        node: [15]

    steps:
      - name: Use Node.js ${{ matrix.node }}
        uses: actions/setup-node@v1
        with:
          node-version: ${{ matrix.node }}
          registry-url: 'https://registry.npmjs.org'

      - name: Set up QEMU
        run: |
          sudo apt update
          sudo apt install --reinstall -y qemu-user-static

      - run: sudo npm install -g @jesec/pkg

      - uses: actions/download-artifact@v2
        with:
          name: flood

      - name: Extract tarball
        run: |
          tar xvf *.tgz --strip-components=1

      - name: Build executables
        run: |
          pkg . --out-path dist-pkg

      - name: Rename linuxstatic to linux
        run: |
          mv dist-pkg/flood-linuxstatic-x64 dist-pkg/flood-linux-x64
          mv dist-pkg/flood-linuxstatic-arm64 dist-pkg/flood-linux-arm64

      - name: 'Upload executable: Linux x64'
        uses: actions/upload-artifact@v2
        with:
          name: flood-linux-x64
          path: dist-pkg/flood-linux-x64
          if-no-files-found: error

      - name: 'Upload executable: Linux arm64'
        uses: actions/upload-artifact@v2
        with:
          name: flood-linux-arm64
          path: dist-pkg/flood-linux-arm64
          if-no-files-found: error

      - name: 'Upload executable: MacOS x64'
        uses: actions/upload-artifact@v2
        with:
          name: flood-macos-x64
          path: dist-pkg/flood-macos-x64
          if-no-files-found: error

      - name: 'Upload executable: Windows x64'
        uses: actions/upload-artifact@v2
        with:
          name: flood-win-x64.exe
          path: dist-pkg/flood-win-x64.exe
          if-no-files-found: error

      - name: 'Upload executable: Windows arm64'
        uses: actions/upload-artifact@v2
        with:
          name: flood-win-arm64.exe
          path: dist-pkg/flood-win-arm64.exe
          if-no-files-found: error

  docker-distroless:
    needs: pkg
    runs-on: ubuntu-20.04

    steps:
      - uses: actions/checkout@v2

      - name: Set up QEMU
        run: |
          sudo apt update
          sudo apt install --reinstall -y qemu-user-static

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

      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

      - uses: actions/download-artifact@v2
        with:
          name: flood-linux-arm64
          path: artifacts

      - uses: actions/download-artifact@v2
        with:
          name: flood-linux-x64
          path: artifacts

      - run: find .

      - name: Publish flood:master-distroless to Docker Hub
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./distribution/containers/Dockerfile.distroless
          target: flood
          platforms: linux/amd64,linux/arm64
          push: true
          tags: jesec/flood:master-distroless

      - name: Publish rtorrent-flood:master-distroless to Docker Hub
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./distribution/containers/Dockerfile.distroless
          target: rtorrent-flood
          platforms: linux/amd64,linux/arm64
          push: true
          tags: jesec/rtorrent-flood:master-distroless
