blob: a06ca2fdd6885c0a06d3ac57401513331f9c69da [file] [log] [blame]
# 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.
check:
runs-on: ubuntu-20.04
outputs:
should-rerun: ${{ steps.precondition.outputs.should-rerun }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- name: "Checking labels"
id: precondition
run: |
echo "should-rerun=$(jq --raw-output \
--arg label_prefix ${BENCHMARK_LABEL_PREFIX} \
'.label.name | startswith($label_prefix)' \
${GITHUB_EVENT_PATH})" >> "${GITHUB_OUTPUT}"
trigger:
needs: check
if: needs.check.outputs.should-rerun == 'true'
runs-on: ubuntu-20.04
# Required for cancel and rerun APIs.
permissions:
actions: write
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
concurrency:
# This cancels queued and in-progress trigger runs for the same PR.
group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
cancel-in-progress: true
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}"
- 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.find-workflow.outputs.workflow-url) != null &&
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.find-workflow.outputs.workflow-url) != null
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.find-workflow.outputs.workflow-url) != null &&
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