name: Release

on:
  push:
    branches:
      - master
      - development
      - alpha
      - beta

jobs:
  release:
    name: 'Release NPM, GitHub'
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repo
        uses: actions/checkout@v3
        with:
          persist-credentials: false
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 18.12
      - name: Install dependencies
        run: npm ci
      - name: Get version from package.json before release step
        id: initversion
        run: echo "version=$(npm run get-version --silent)" >> $GITHUB_OUTPUT
      - name: Release to NPM and GitHub
        id: release
        env:
          GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
          NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
          GIT_AUTHOR_NAME: bot-flowbuilld
          GIT_AUTHOR_EMAIL: bot.flowbuild@gmail.com
          GIT_COMMITTER_NAME: bot-flowbuilld
          GIT_COMMITTER_EMAIL: bot.flowbuild@gmail.com
        run: npm run release
      - name: Get version from package.json after release step
        id: extractver
        run: echo "version=$(npm run get-version --silent)" >> $GITHUB_OUTPUT
      - name: Create Pull Request with updated package files
        if: steps.initversion.outputs.version != steps.extractver.outputs.version
        uses: peter-evans/create-pull-request@v4
        with:
          token: ${{ secrets.GH_TOKEN }}
          commit-message: 'chore(release): ${{ steps.extractver.outputs.version }}'
          committer: bot-flowbuilld <bot.flowbuild@gmail.com>
          author: bot-flowbuilld <bot.flowbuild@gmail.com>
          title: 'chore(release): ${{ steps.extractver.outputs.version }}'
          body: 'Version bump in package.json and package-lock.json for release [${{ steps.extractver.outputs.version }}](https://github.com/${{github.repository}}/releases/tag/v${{ steps.extractver.outputs.version }})'
          branch: version-bump/${{ steps.extractver.outputs.version }}
          labels: 'automerge'
    outputs:
      version: ${{ steps.extractver.outputs.version }}
  build:
    name: 'Build image on DockerHub'
    needs:
      - release
    runs-on: ubuntu-latest
    steps:
      - name: Print Version
        run: echo "Using version ${{ needs.release.outputs.version }}"
      - uses: actions/checkout@v3
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
      - name: Login to DockerHub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Build and push latest
        if: ${{ github.ref_name == 'master' }}
        uses: docker/build-push-action@v3
        with:
          context: .
          push: true
          tags: flowbuild/server:latest
      - name: Build and push version
        uses: docker/build-push-action@v3
        with:
          context: .
          push: true
          tags: 'flowbuild/server:${{ needs.release.outputs.version }}'