name: Test and Release

on:
  workflow_dispatch:
  release:
    types:
      - published
  pull_request:
    branches:
      - master
      - v[0-9]+.[0-9]+-dev

jobs:
  test:
    name: Run Insight UI tests
    runs-on: ubuntu-20.04
    timeout-minutes: 10
    steps:
      - name: Cancel Previous Runs
        uses: styfle/cancel-workflow-action@0.9.0
        with:
          access_token: ${{ github.token }}

      - uses: actions/checkout@v2

      - uses: actions/setup-node@v2
        with:
          node-version: '12'

      - name: Enable NPM cache
        uses: actions/cache@v2
        with:
          path: '~/.npm'
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - name: Check NPM package lock version is updated
        uses: dashevo/gh-action-check-package-lock@v1

      - name: Install NPM dependencies
        run: npm ci

      - name: Run ESLinter
        run: npm run lint

      - name: Run tests
        run: npm run test

  release-npm:
    name: Release NPM package
    runs-on: ubuntu-20.04
    needs: test
    if: ${{ github.event_name == 'release' }}
    steps:
      - uses: actions/checkout@v2

      - name: Check package version matches tag
        uses: geritol/match-tag-to-package-version@0.1.0
        env:
          TAG_PREFIX: refs/tags/v

      - name: Enable NPM cache
        uses: actions/cache@v2
        with:
          path: '~/.npm'
          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-node-

      - name: Install NPM dependencies
        run: npm ci

      - name: Set release tag
        uses: actions/github-script@v3
        id: tag
        with:
          result-encoding: string
          script: |
            const tag = context.payload.release.tag_name;
            const [, major, minor] = tag.match(/^v([0-9]+)\.([0-9]+)/);
            return (tag.includes('dev') ? `${major}.${minor}-dev` : 'latest');

      - name: Publish NPM package
        uses: JS-DevTools/npm-publish@v1
        with:
          token: ${{ secrets.NPM_TOKEN }}
          tag: ${{ steps.tag.outputs.result }}

  release-docker:
    name: Release Docker image
    runs-on: ubuntu-20.04
    needs: release-npm
    if: ${{ github.event_name == 'release' }}
    steps:
      - uses: actions/checkout@v2

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1

      - name: Set up Docker BuildX
        uses: docker/setup-buildx-action@v1
        with:
          version: v0.6.1
          install: true
          driver-opts: image=moby/buildkit:buildx-stable-1

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

      - name: Set suffix to Docker tags
        uses: actions/github-script@v3
        id: suffix
        with:
          result-encoding: string
          script: "return (context.payload.release.tag_name.includes('-dev') ? '-dev' : '');"

      - name: Set release tag
        uses: actions/github-script@v3
        id: tag
        with:
          result-encoding: string
          script: |
            const tag = context.payload.release.tag_name;
            const [, major] = tag.match(/^v([0-9]+)/);
            return major;

      - name: Set Docker tags and labels
        id: docker_meta
        uses: docker/metadata-action@v3
        with:
          images: Alterdot/insight
          tags: |
            type=match,pattern=v(\d+),group=1
            type=match,pattern=v(\d+.\d+),group=1
            type=match,pattern=v(\d+.\d+.\d+),group=1
            type=match,pattern=v(.*),group=1,suffix=,enable=${{ contains(github.event.release.tag_name, '-dev') }}
          flavor: |
            latest=${{ !contains(github.event.release.tag_name, '-dev') }}
            suffix=${{ steps.suffix.outputs.result }}

      - name: Build and push Docker image
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          context: docker
          file: docker/Dockerfile
          push: true
          tags: ${{ steps.docker_meta.outputs.tags }}
          labels: ${{ steps.docker_meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
          platforms: linux/amd64,linux/arm64
          build-args: |
            VERSION=${{ github.event.release.tag_name }}  
            MAJOR_VERSION=${{ steps.tag.outputs.result }}

      - name: Output Docker image digest
        run: echo ${{ steps.docker_build.outputs.digest }}
