---
# Workflow for triggering a release.
name: Release
on:
  schedule:
    - cron: '0 0 * * *'
  workflow_dispatch: # Dispatch runs build and validate, then push to the appropriate storage location.
    inputs:
      type:
        description: Build Type
        default: nightly
        required: true
      version:
        description: Version Tag
        default: nightly
        required: true
concurrency: # This keeps multiple instances of the job from running concurrently for the same ref and event type.
  group: release-${{ github.ref }}-${{ github.event_name }}
  cancel-in-progress: true
jobs:
  update-changelogs:
    name: Update changelog
    runs-on: ubuntu-latest
    outputs:
      ref: ${{ steps.target.outputs.ref }}
      version: ${{ steps.target.outputs.version }}
      type: ${{ steps.target.outputs.type }}
      run: ${{ steps.target.outputs.run }}
    steps:
      - name: Checkout
        id: checkout
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
          submodules: recursive
          token: ${{ secrets.NETDATABOT_GITHUB_TOKEN }}
      - name: Prepare base ref
        id: target
        run: >-
          .github/scripts/prepare-release-base.sh \
              ${{ github.repository }} \
              ${{ github.event_name }} \
              ${{ github.event.inputs.type }} \
              ${{ github.event.inputs.version }} \
              ${{ secrets.NETDATA_RELEASE_TEST }}
      - name: Generate Nightly Changleog
        id: nightly-changelog
        if: steps.target.outputs.run == 'true' && steps.target.outputs.type == 'nightly'
        uses: heinrichreimer/github-changelog-generator-action@v2.3
        with:
          bugLabels: IGNOREBUGS
          excludeLabels: "stale,duplicate,question,invalid,wontfix,discussion,no changelog"
          issues: false
          sinceTag: v1.10.0
          token: ${{ secrets.NETDATABOT_GITHUB_TOKEN }}
          unreleasedLabel: "**Next release**"
          verbose: true
          maxIssues: 500
      - name: Generate Release Changelog
        id: release-changelog
        if: steps.target.outputs.run == 'true' && steps.target.outputs.type != 'nightly'
        uses: heinrichreimer/github-changelog-generator-action@v2.3
        with:
          bugLabels: IGNOREBUGS
          excludeLabels: "stale,duplicate,question,invalid,wontfix,discussion,no changelog"
          futureRelease: ${{ github.event.inputs.version }}
          issues: false
          sinceTag: v1.10.0
          token: ${{ secrets.NETDATABOT_GITHUB_TOKEN }}
          unreleasedLabel: "**Next release**"
          verbose: true
          maxIssues: 500
      - name: Commit Changes
        id: commit
        if: steps.target.outputs.run == 'true'
        env:
          GITHUB_TOKEN: ${{ secrets.NETDATABOT_GITHUB_TOKEN }}
        run: |
          git config user.name "netdatabot"
          git config user.email "bot@netdata.cloud"
          git add packaging/version CHANGELOG.md
          git commit -m "[ci skip] ${{ steps.target.outputs.message }}"
          if [ "${{ steps.target.outputs.type }}" != "nightly" ]; then
            git tag -a "${{ github.event.inputs.version }}" -m "${{ steps.target.outputs.message }}"
          fi
          if [ -n "${{ steps.target.outputs.new-branch }}" ]; then
            git branch "${{ steps.target.outputs.new-branch }}"
          fi
          git push --tags origin "${{ steps.target.outputs.branch }}"
          if [ -n "${{ steps.target.outputs.new-branch }}" ]; then
            git push origin "${{ steps.target.outputs.new-branch }}"
          fi
      - name: Failure Notification
        uses: rtCamp/action-slack-notify@v2
        env:
          SLACK_COLOR: 'danger'
          SLACK_FOOTER: ''
          SLACK_ICON_EMOJI: ':github-actions:'
          SLACK_TITLE: 'Failed to prepare changelog:'
          SLACK_USERNAME: 'GitHub Actions'
          SLACK_MESSAGE: |-
              ${{ github.repository }}: Failed to prepare changelog.
              Checkout: ${{ steps.checkout.outcome }}
              Prepare base ref: ${{ steps.target.outcome }}
              Generate nightly changelog: ${{ steps.nightly-changelog.outcome }}
              Generate release changelog: ${{ steps.release-changelog.outcome }}
              Commit changes: ${{ steps.commit.outcome }}
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
        if: failure()

  trigger-artifacts:
    name: Trigger artifact builds
    runs-on: ubuntu-latest
    needs: update-changelogs
    if: needs.update-changelogs.outputs.run == 'true'
    steps:
      - name: Checkout
        id: checkout
        uses: actions/checkout@v3
        with:
          ref: ${{ needs.update-changelogs.outputs.ref }}
      - name: Trigger build
        id: trigger
        uses: benc-uk/workflow-dispatch@v1
        with:
          token: ${{ secrets.NETDATABOT_GITHUB_TOKEN }}
          repo: ${{ github.repository }}
          workflow: Build
          ref: ${{ needs.update-changelogs.outputs.ref }}
          inputs: '{"version": "${{ needs.update-changelogs.outputs.version }}", "type": "${{ needs.update-changelogs.outputs.type }}"}'
      - name: Failure Notification
        uses: rtCamp/action-slack-notify@v2
        env:
          SLACK_COLOR: 'danger'
          SLACK_FOOTER: ''
          SLACK_ICON_EMOJI: ':github-actions:'
          SLACK_TITLE: 'Failed to trigger ${{ needs.update-changelogs.outputs.type }} artifact builds:'
          SLACK_USERNAME: 'GitHub Actions'
          SLACK_MESSAGE: |-
              ${{ github.repository }}: Failed to trigger ${{ needs.update-changelogs.outputs.type }} artifact builds.
              Checkout: ${{ steps.checkout.outcome }}
              Trigger build: ${{ steps.trigger.outcome }}
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
        if: failure()

  trigger-docker:
    name: Trigger docker builds
    runs-on: ubuntu-latest
    needs: update-changelogs
    if: needs.update-changelogs.outputs.run == 'true'
    steps:
      - name: Checkout
        id: checkout
        uses: actions/checkout@v3
        with:
          ref: ${{ needs.update-changelogs.outputs.ref }}
      - name: Trigger build
        id: trigger
        uses: benc-uk/workflow-dispatch@v1
        with:
          token: ${{ secrets.NETDATABOT_GITHUB_TOKEN }}
          repo: ${{ github.repository }}
          workflow: Docker
          ref: ${{ needs.update-changelogs.outputs.ref }}
          inputs: '{"version": "${{ needs.update-changelogs.outputs.version }}"}'
      - name: Failure Notification
        uses: rtCamp/action-slack-notify@v2
        env:
          SLACK_COLOR: 'danger'
          SLACK_FOOTER: ''
          SLACK_ICON_EMOJI: ':github-actions:'
          SLACK_TITLE: 'Failed to trigger ${{ needs.update-changelogs.outputs.type }} Docker builds:'
          SLACK_USERNAME: 'GitHub Actions'
          SLACK_MESSAGE: |-
              ${{ github.repository }}: Failed to trigger ${{ needs.update-changelogs.outputs.type }} Docker builds.
              Checkout: ${{ steps.checkout.outcome }}
              Trigger build: ${{ steps.trigger.outcome }}
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
        if: failure()

  trigger-packages:
    name: Trigger package builds
    runs-on: ubuntu-latest
    needs: update-changelogs
    if: needs.update-changelogs.outputs.run == 'true'
    steps:
      - name: Checkout
        id: checkout
        uses: actions/checkout@v3
        with:
          ref: ${{ needs.update-changelogs.outputs.ref }}
      - name: Trigger build
        id: trigger
        uses: benc-uk/workflow-dispatch@v1
        with:
          token: ${{ secrets.NETDATABOT_GITHUB_TOKEN }}
          repo: ${{ github.repository }}
          workflow: Packages
          ref: ${{ needs.update-changelogs.outputs.ref }}
          inputs: '{"version": "${{ needs.update-changelogs.outputs.version }}", "type": "${{ needs.update-changelogs.outputs.type }}"}'
      - name: Failure Notification
        uses: rtCamp/action-slack-notify@v2
        env:
          SLACK_COLOR: 'danger'
          SLACK_FOOTER: ''
          SLACK_ICON_EMOJI: ':github-actions:'
          SLACK_TITLE: 'Failed to trigger ${{ needs.update-changelogs.outputs.type }} package builds:'
          SLACK_USERNAME: 'GitHub Actions'
          SLACK_MESSAGE: |-
              ${{ github.repository }}: Failed to trigger ${{ needs.update-changelogs.outputs.type }} package builds.
              Checkout: ${{ steps.checkout.outcome }}
              Trigger build: ${{ steps.trigger.outcome }}
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
        if: failure()
