name: Build

on: [push, pull_request]
    
jobs:

  frontend:
    name: Front-end
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v2
        with:
          node-version: 16
      - uses: c-hive/gha-yarn-cache@v2
        with:
          directory: ./web
      - run: yarn install && CI=false yarn run build
        working-directory: ./web

  backend:
    name: Back-end
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-go@v3
        with:
          go-version: '^1.16.5'

      - name: Build
        run: |
          go build -race -ldflags "-extldflags '-static'"
        working-directory: ./
  
  linter:
    name: Go-Linter
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-go@v3
        with:
          go-version: '^1.16.5'
      
      - name: golangci-lint
        uses: golangci/golangci-lint-action@v3
        with:
          version: v1.29
          args: --disable-all -E gofumpt --max-same-issues=0 --max-issues-per-linter=0 --timeout 5m ./...

  release-and-push:
    name: Release And Push
    runs-on: ubuntu-latest
    if: github.repository == 'casbin/casnode' && github.event_name == 'push'
    needs: [ frontend, backend, linter ]
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Setup Node.js
        uses: actions/setup-node@v2
        with:
          node-version: 16

      - name: Fetch Previous version
        id: get-previous-tag
        uses: actions-ecosystem/action-get-latest-tag@v1.6.0

      - name: Release
        run: yarn global add semantic-release@17.4.4 && semantic-release
        env:
          GH_TOKEN: ${{ secrets.GH_BOT_TOKEN }}

      - name: Fetch Current version
        id: get-current-tag
        uses: actions-ecosystem/action-get-latest-tag@v1.6.0

      - name: Decide Should_Push Or Not
        id: should_push
        run: |
          old_version=${{steps.get-previous-tag.outputs.tag}}
          new_version=${{steps.get-current-tag.outputs.tag }}

          old_array=(${old_version//\./ })
          new_array=(${new_version//\./ })

          if [ ${old_array[0]} != ${new_array[0]} ]
          then 
              echo "push='true'" >> GITHUB_OUTPUT
          elif [ ${old_array[1]} != ${new_array[1]} ]
          then 
              echo "push='true'" >> GITHUB_OUTPUT
          else
              echo "push='false'" >> GITHUB_OUTPUT
          fi

      - name: Log in to Docker Hub
        uses: docker/login-action@v1
        if: github.repository == 'casbin/casnode' && github.event_name == 'push' &&steps.should_push.outputs.push=='true'
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_PASSWORD }}

      - name: Push to Docker Hub
        uses: docker/build-push-action@v2
        if: github.repository == 'casbin/casnode' && github.event_name == 'push' && steps.should_push.outputs.push=='true'
        with:
          push: true
          tags: casbin/casnode:${{steps.get-current-tag.outputs.tag }},casbin/casnode:latest
