# Copyright 2023 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

name: Benchmark Trigger

# Trigger benchmark CI workflows when benchmark PR labels are added.
# When a benchmark label is added, this cancels and then re-runs the CI
# workflow. When the workflow is re-run, it will pick up the latest PR
# description and labels. See
# https://github.com/openxla/iree/issues/10042#issuecomment-1449250094 for
# more background.
#
# This workflow is running on the base branch the PR targets.

on:
  pull_request_target:
    types:
      - labeled

env:
  PR_NUMBER: ${{ github.event.pull_request.number }}
  HEAD_SHA: ${{ github.event.pull_request.head.sha }}
  # Target workflow that runs the benchmarks.
  WORKFLOW_NAME: CI
  BENCHMARK_LABEL_PREFIX: 'benchmarks:'

jobs:
  # Precondition check is a separate step because we can't put the concurrency
  # constraint on it; otherwise the irrelevant labeling events will cancel the
  # events that meet the preconditions. Even with cancel-in-progress = false,
  # the queued events will still be cancelled.
  precondition:
    runs-on: ubuntu-20.04
    outputs:
      found-label: ${{ steps.precondition.outputs.found-label }}
      triggered-at: ${{ steps.precondition.outputs.triggered-at }}
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
      - name: "Checking labels"
        id: precondition
        run: |
          echo "found-label=$(jq \
            --arg label_prefix ${BENCHMARK_LABEL_PREFIX} \
            '.label.name | startswith($label_prefix)' \
            ${GITHUB_EVENT_PATH})" >> "${GITHUB_OUTPUT}"
          # pull_request_target event doesn't have the workflow start time. Get
          # the approximate start time at the beginning.
          echo "triggered-at=$(date +%s)" >> "${GITHUB_OUTPUT}"

  trigger:
    needs: precondition
    if: fromJSON(needs.precondition.outputs.found-label)
    runs-on: ubuntu-20.04
    # Required for cancel and rerun APIs.
    permissions:
      actions: write
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    concurrency:
      # Only allows a single trigger to run for a PR concurrently.
      # Timestamp-based check below makes sure we don't rerun benchmark twice
      # when multiple label events happen the same time. We don't use
      # `cancel-in-progress` to avoid that because cancelled jobs are
      # considered as failures and show red on Github UI.
      group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
    steps:
      - name: "Checking out repository"
        # This checkouts from the base branch instead of the pull request. See
        # https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target
        uses: actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3 # v3.5.0

      - name: "Finding the previous workflow run"
        id: find-workflow
        env:
          RUN_JSON: workflow-run.json
        run: |
          gh api "/repos/${GITHUB_REPOSITORY}/actions/runs" --method GET -F head_sha="${HEAD_SHA}" \
            | jq --arg name "${WORKFLOW_NAME}" '.workflow_runs | map(select(.name == $name))[0]' \
            > "${RUN_JSON}"
          echo "workflow-url=$(jq '.url' ${RUN_JSON})" >> "${GITHUB_OUTPUT}"
          echo "run-status=$(jq --raw-output '.status' ${RUN_JSON})" >> "${GITHUB_OUTPUT}"
          echo "run-started-at=$(jq --raw-output '.run_started_at' ${RUN_JSON})" >> "${GITHUB_OUTPUT}"

      - name: "Checking if the workflow has been rerun"
        id: check
        if: fromJSON(steps.find-workflow.outputs.workflow-url) != null
        env:
          RUN_STARTED_AT: ${{ steps.find-workflow.outputs.run-started-at }}
          TRIGGERED_AT: ${{ needs.precondition.outputs.triggered-at }}
        run: |
          # If the latest workflow run started after the trigger event, it means
          # the workflow has been rerun and picked up the new labels. Skip rerun
          # in this case.
          RUN_STARTED_AT_EPOCH="$(date --date="${RUN_STARTED_AT}" +%s)"
          if (( RUN_STARTED_AT_EPOCH < TRIGGERED_AT )); then
            SHOULD_RERUN="true"
          else
            SHOULD_RERUN="false"
          fi
          echo "should-rerun=${SHOULD_RERUN}" >> "${GITHUB_OUTPUT}"

          cat <<EOF
          Workflow run started at $(date --utc --date="${RUN_STARTED_AT}")
          Trigger event started at $(date --utc --date="@${TRIGGERED_AT}")
          Should rerun: "${SHOULD_RERUN}"
          EOF

      - name: "Cancelling the previous workflow run"
        # If the workflow isn't completed, we need to cancel it first; otherwise
        # the API can't rerun it.
        if: |
          fromJSON(steps.check.outputs.should-rerun) &&
          steps.find-workflow.outputs.run-status != 'completed'
        env:
          IREE_WORKFLOW_RUN_URL: ${{ fromJSON(steps.find-workflow.outputs.workflow-url) }}
        run: build_tools/github_actions/cancel_workflow_and_wait.sh

      - name: "Getting the latest commit SHA"
        # A push might have happened to trigger a new workflow run. Check the
        # PR's latest commit SHA and only rerun if there is no new push.
        #
        # It reduces the chance that we rerun a workflow on the previous commit
        # and cancel (due to the concurrency constraint) the run on the newer
        # commit. Even if that happens, users will see their CI run fails and
        # can rerun it manually from the UI.
        id: get-sha
        if: fromJSON(steps.check.outputs.should-rerun)
        run: |
          echo "latest-sha=$(gh api /repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER} \
            | jq --raw-output '.head.sha')" \
            >> "${GITHUB_OUTPUT}"

      - name: "Rerequesting the workflow"
        if: |
          fromJSON(steps.check.outputs.should-rerun) &&
          steps.get-sha.outputs.latest-sha == env.HEAD_SHA
        env:
          WORKFLOW_RUN_URL: ${{ fromJSON(steps.find-workflow.outputs.workflow-url) }}
        run: |
          gh api "${WORKFLOW_RUN_URL}/rerun" --method POST
