# This action is centrally managed in https://github.com/asyncapi/.github/
# Don't make changes to this file in this repo as they will be overwritten with changes made to the same file in above mentioned repo

# It does magic only if there is package.json file in the root of the project
name: Release - if Node project

on:
  push:
    branches:
      - master
      # below lines are not enough to have release supported for these branches
      # make sure configuration of `semantic-release` package mentions these branches
      - next-spec
      - next-major
      - next-major-spec
      - beta
      - alpha
      - next

permissions:
  contents: write # to be able to publish a GitHub release
  issues: write # to be able to comment on released issues
  pull-requests: write # to be able to comment on released pull requests
  id-token: write # to enable use of OIDC for trusted publishing and npm provenance

jobs:

  test-nodejs:
    # We just check the message of first commit as there is always just one commit because we squash into one before merging
    # "commits" contains array of objects where one of the properties is commit "message"
    # Release workflow will be skipped if release conventional commits are not used
    if: |
      startsWith( github.repository, 'asyncapi/' ) && 
      (startsWith( github.event.commits[0].message , 'fix:' ) ||
      startsWith( github.event.commits[0].message, 'fix!:' ) ||
      startsWith( github.event.commits[0].message, 'feat:' ) ||
      startsWith( github.event.commits[0].message, 'feat!:' ))
    name: Test NodeJS release on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    steps:
      - name: Set git to use LF #to once and for all finish neverending fight between Unix and Windows
        run: |
          git config --global core.autocrlf false
          git config --global core.eol lf
        shell: bash
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Check if Node.js project and has package.json
        id: packagejson
        run: test -e ./package.json && echo "exists=true" >> $GITHUB_OUTPUT || echo "exists=false" >> $GITHUB_OUTPUT
        shell: bash
      - if: steps.packagejson.outputs.exists == 'true'
        name: Determine what node version to use
        # This workflow is from our own org repo and safe to reference by 'master'.
        uses: asyncapi/.github/.github/actions/get-node-version-from-package-lock@master # //NOSONAR
        with:
          node-version: ${{ vars.NODE_VERSION }}
        id: lockversion
      - if: steps.packagejson.outputs.exists == 'true'
        name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "${{ steps.lockversion.outputs.version }}"
      - if: steps.lockversion.outputs.version == '18' && matrix.os == 'windows-latest'
        name: Install npm cli 8
        shell: bash
        #npm cli 10 is buggy because of some cache issues
        run: npm install -g npm@8.19.4
      - if: steps.packagejson.outputs.exists == 'true'
        name: Install dependencies
        shell: bash
        run: npm ci
      - if: steps.packagejson.outputs.exists == 'true'
        name: Run test
        run: npm test --if-present
      - if: failure() # Only, on failure, send a message on the 94_bot-failing-ci slack channel
        name: Report workflow run status to Slack
        uses: 8398a7/action-slack@28ba43ae48961b90635b50953d216767a6bea486 #using https://github.com/8398a7/action-slack/releases/tag/v3.16.2
        with:
          status: ${{ job.status }}
          fields: repo,action,workflow
          text: 'Release workflow failed in testing job'
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CI_FAIL_NOTIFY }}

  release:
    needs: [test-nodejs]
    name: Publish to any of NPM, Github, or Docker Hub
    runs-on: ubuntu-latest
    steps:
      - name: Set git to use LF #to once and for all finish neverending fight between Unix and Windows
        run: |
          git config --global core.autocrlf false
          git config --global core.eol lf
      - name: Checkout repository
        uses: actions/checkout@v4
      - name: Check if Node.js project and has package.json
        id: packagejson
        run: test -e ./package.json && echo "exists=true" >> $GITHUB_OUTPUT || echo "exists=false" >> $GITHUB_OUTPUT
        shell: bash
      - if: steps.packagejson.outputs.exists == 'true'
        name: Determine what node version to use
        # This workflow is from our own org repo and safe to reference by 'master'.
        uses: asyncapi/.github/.github/actions/get-node-version-from-package-lock@master # //NOSONAR
        with:
          node-version: ${{ vars.NODE_VERSION }}
        id: lockversion
      - if: steps.packagejson.outputs.exists == 'true'
        name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "${{ steps.lockversion.outputs.version }}"
          registry-url: "https://registry.npmjs.org"
      - if: steps.packagejson.outputs.exists == 'true'
        name: Install dependencies
        shell: bash
        run: npm ci
      - if: steps.packagejson.outputs.exists == 'true'
        name: Add plugin for conventional commits for semantic-release
        run: npm install --save-dev conventional-changelog-conventionalcommits@9.1.0
      - if: steps.packagejson.outputs.exists == 'true'
        name: Publish to any of NPM, Github, and Docker Hub
        id: release
        env:
          GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
          DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
          DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
          GIT_AUTHOR_NAME: asyncapi-bot
          GIT_AUTHOR_EMAIL: info@asyncapi.io
          GIT_COMMITTER_NAME: asyncapi-bot
          GIT_COMMITTER_EMAIL: info@asyncapi.io
        run: npx semantic-release@25.0.2
      - if: failure() # Only, on failure, send a message on the 94_bot-failing-ci slack channel
        name: Report workflow run status to Slack
        uses: 8398a7/action-slack@28ba43ae48961b90635b50953d216767a6bea486 #using https://github.com/8398a7/action-slack/releases/tag/v3.16.2
        with:
          status: ${{ job.status }}
          fields: repo,action,workflow
          text: 'Release workflow failed in release job'
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_CI_FAIL_NOTIFY }}
