name: "Publish Technical Documentation (release)"

on:
  push:
    branches:
      - "release-*"
    tags:
      - "v[0-9]+.[0-9]+.[0-9]+"
    paths:
      - "docs/sources/**"
  workflow_dispatch:

jobs:
  test:
    runs-on: "ubuntu-latest"
    steps:
      - name: "Check out code"
        uses: "actions/checkout@v4"
      - name: "Build website"
        # -e HUGO_REFLINKSERRORLEVEL=ERROR prevents merging broken refs with the downside
        # that no refs to external content can be used as these refs will not resolve in the
        # docs-base image.
        run: >
          docker run -v ${PWD}/docs/sources:/hugo/content/docs/oncall/latest
          -e HUGO_REFLINKSERRORLEVEL=ERROR
          --rm grafana/docs-base:latest /bin/bash
          -c 'echo -e "---\\nredirectURL: /hugo/content/docs/oncall/latest/\\ntype: redirect\\nversioned: true\\n---\\n"
          > /hugo/content/docs/oncall/_index.md; make hugo'

  sync:
    runs-on: "ubuntu-latest"
    needs: "test"
    steps:
      - name: "Checkout code and tags"
        uses: "actions/checkout@v4"
        with:
          fetch-depth: 0

      - name: "Checkout Actions library"
        uses: "actions/checkout@v4"
        with:
          repository: "grafana/grafana-github-actions"
          path: "./actions"

      - name: "Install Actions from library"
        run: "npm install --production --prefix ./actions"

      - name: "Determine if there is a matching release tag"
        id: "has-matching-release-tag"
        uses: "./actions/has-matching-release-tag"
        with:
          ref_name: "${{ github.ref_name }}"
          release_tag_regexp: "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$"
          release_branch_regexp: "^release-(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$"

      - name: "Determine technical documentation version"
        if: "steps.has-matching-release-tag.outputs.bool == 'true'"
        uses: "./actions/docs-target"
        id: "target"
        with:
          ref_name: "${{ github.ref_name }}"

      - name: "Clone website-sync Action"
        if: "steps.has-matching-release-tag.outputs.bool == 'true'"
        # WEBSITE_SYNC_TOKEN is a fine-grained GitHub Personal Access Token that expires.
        # It must be regenerated in the grafanabot GitHub account and requires a Grafana organization
        # GitHub administrator to update the organization secret.
        # The IT helpdesk can update the organization secret.
        run: |
          git clone --single-branch --no-tags --depth 1 \
          -b master https://grafanabot:${{ secrets.WEBSITE_SYNC_TOKEN }}@github.com/grafana/website-sync \
          ./.github/actions/website-sync

      - name: "Publish to website repository (release)"
        if: "steps.has-matching-release-tag.outputs.bool == 'true'"
        uses: "./.github/actions/website-sync"
        id: "publish-release"
        with:
          repository: "grafana/website"
          branch: "master"
          host: "github.com"
          # PUBLISH_TO_WEBSITE_TOKEN is a fine-grained GitHub Personal Access Token that expires.
          # It must be regenerated in the grafanabot GitHub account and requires a Grafana organization
          # GitHub administrator to update the organization secret.
          # The IT helpdesk can update the organization secret.
          github_pat: "grafanabot:${{ secrets.PUBLISH_TO_WEBSITE_TOKEN }}"
          source_folder: "docs/sources"
          # Append ".x" to target to produce a v<major>.<minor>.x directory.
          target_folder: "content/docs/oncall/${{ steps.target.outputs.target }}.x"
          # Allow the workflow to succeed if there are no changes to commit.
          # This is only going to be true on tags as those events ignore the path
          # filter in the workflow `on.push` section.
          allow_no_changes: "true"
