#!/bin/bash # Copyright 2022 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 # Finds the most recent ancestor (first parents only) of the given commit # (default HEAD) for which the ci workflow passed. There are GitHub actions that # allegedly do this, but they mostly seem to be broken, unlicensed, or both. # This approach iterates through commits in the history and makes a separate # call for each. The alternative is collecting all the successful runs and then # sorting them. Empirically, the latter was much slower. Fetching them already # sorted does not appear to be an option as GitHub does not document any known # sort order. Fetching for multiple specific commits at once is similarly not an # option. set -euo pipefail commitish="${1:-HEAD}" declare -r REQUIRED_WORKFLOWS=(ci.yml) declare -ar QUERY_PARAMS=( branch=main event=push status=success exclude_pull_requests=true ) function get_latest_green() { while read commit; do local -a query_params=("${QUERY_PARAMS[@]}" "head_sha=${commit}") # String join on ampersand local query_string="$(IFS="&" ; echo "${query_params[*]}")" local all_passing="true" for workflow in "${REQUIRED_WORKFLOWS[@]}"; do local successful_run_count="$(\ gh api --jq '.total_count' \ "/repos/openxla/iree/actions/workflows/${workflow}/runs?${query_string}" \ )" # Any successful run of the workflow (including reruns) is OK. if (( successful_run_count==0 )); then all_passing="false" break fi done if [[ "${all_passing}" == true ]]; then echo "${commit}" return 0 fi done < <(git rev-list --first-parent "${commitish}") echo "Failed to find green commit" >&2 return 1 } get_latest_green