name: Continuous Deployment

on:
  workflow_dispatch:
    inputs:
      releaseType:
        description: The type of release. Should be one of "major", "minor", "patch"
        required: true
        default: 'patch'
  pull_request:
    branches:
      - main

# Make sure we're not running multiple release steps at the same time as this can give issues with determining the next npm version to release.
# Ideally we only add this to the 'release' job so it doesn't limit PR runs, but github can't guarantee the job order in that case:
# "When concurrency is specified at the job level, order is not guaranteed for jobs or runs that queue within 5 minutes of each other."
concurrency:
  group: indy-sdk-react-native-${{ github.ref }}-${{ github.repository }}-${{ github.event_name }}
  cancel-in-progress: true

jobs:
  validate:
    runs-on: ubuntu-20.04
    name: Validate
    steps:
      - name: Checkout indy-sdk-react-native
        uses: actions/checkout@v2

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - uses: actions/cache@v2
        id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
        with:
          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - name: Setup node v16
        uses: actions/setup-node@v2
        with:
          node-version: 16

      - name: Install dependencies
        run: yarn install

      - name: Prettier
        run: yarn check-format

  release:
    runs-on: ubuntu-20.04
    name: Release
    needs: [validate]
    # Only run on workflow dispatch to main branch
    if: github.ref == 'refs/heads/main' && github.repository == 'hyperledger/indy-sdk-react-native' && github.event_name == 'workflow_dispatch'
    steps:
      - name: Checkout indy-sdk-react-native
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: git config
        run: |
          git config user.name "@github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - uses: actions/cache@v2
        id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
        with:
          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - name: Setup node v16
        uses: actions/setup-node@v2
        with:
          node-version: 16

      - name: Install dependencies
        run: yarn install

      # https://github.com/yarnpkg/yarn/issues/6617#issuecomment-436222106
      - name: Prepend Node path
        run: npm config set scripts-prepend-node-path true

      - name: Set Verbose Logging
        run: npm config set loglevel verbose --global

      - name: Set NPM config
        run: |
          echo "//registry.npmjs.org/:_authToken=${{secrets.NPM_TOKEN}}" >> .npmrc
          echo "registry=https://registry.npmjs.org/" >> .npmrc
          echo "always-auth=true" >> .npmrc

      - name: Install dependencies
        run: yarn install --frozen-lockfile

      # On manual workflow dispatch release stable version
      - name: Release version
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: yarn release ${{ github.event.inputs.releaseType }}
