Merge pull request #29320 from vtushar06/remove-cirrus-cron-action
Some checks are pending
ci / path-filter (push) Waiting to run
ci / Validate source code changes (push) Waiting to run
ci / Cross Build (Linux, FreeBSD) (push) Waiting to run
ci / build debian-sid (push) Waiting to run
ci / build fedora-current (push) Waiting to run
ci / build fedora-prior (push) Waiting to run
ci / build fedora-rawhide (push) Waiting to run
ci / windows installer hyperv (push) Waiting to run
ci / windows installer wsl (push) Waiting to run
ci / macos installer (push) Waiting to run
ci / int local root debian-sid (push) Blocked by required conditions
ci / sys local root debian-sid (push) Blocked by required conditions
ci / int local rootless debian-sid (push) Blocked by required conditions
ci / sys local rootless debian-sid (push) Blocked by required conditions
ci / int remote root debian-sid (push) Blocked by required conditions
ci / sys remote root debian-sid (push) Blocked by required conditions
ci / bud local root fedora-current (push) Blocked by required conditions
ci / int local root fedora-current (push) Blocked by required conditions
ci / sys local root fedora-current (push) Blocked by required conditions
ci / int local rootless fedora-current (push) Blocked by required conditions
ci / sys local rootless fedora-current (push) Blocked by required conditions
ci / bud remote root fedora-current (push) Blocked by required conditions
ci / int remote root fedora-current (push) Blocked by required conditions
ci / sys remote root fedora-current (push) Blocked by required conditions
ci / int remote rootless fedora-current (push) Blocked by required conditions
ci / sys remote rootless fedora-current (push) Blocked by required conditions
ci / int local root fedora-prior (push) Blocked by required conditions
ci / sys local root fedora-prior (push) Blocked by required conditions
ci / int local rootless fedora-prior (push) Blocked by required conditions
ci / sys local rootless fedora-prior (push) Blocked by required conditions
ci / int remote root fedora-prior (push) Blocked by required conditions
ci / sys remote root fedora-prior (push) Blocked by required conditions
ci / int local root fedora-rawhide (push) Blocked by required conditions
ci / sys local root fedora-rawhide (push) Blocked by required conditions
ci / int local rootless fedora-rawhide (push) Blocked by required conditions
ci / sys local rootless fedora-rawhide (push) Blocked by required conditions
ci / int remote root fedora-rawhide (push) Blocked by required conditions
ci / sys remote root fedora-rawhide (push) Blocked by required conditions
ci / apiv2 root fedora-current (push) Blocked by required conditions
ci / bindings root fedora-current (push) Blocked by required conditions
ci / compose_v2 root fedora-current (push) Blocked by required conditions
ci / docker_py root fedora-current (push) Blocked by required conditions
ci / unit root fedora-current (push) Blocked by required conditions
ci / apiv2 rootless fedora-current (push) Blocked by required conditions
ci / compose_v2 rootless fedora-current (push) Blocked by required conditions
ci / unit rootless fedora-current (push) Blocked by required conditions
ci / upgrade v5.3.1 root fedora-current (push) Blocked by required conditions
ci / upgrade v5.6.2 root fedora-current (push) Blocked by required conditions
ci / machine linux amd64 (push) Blocked by required conditions
ci / windows unit (push) Blocked by required conditions
ci / windows e2e (push) Blocked by required conditions
ci / windows machine hyperv (push) Blocked by required conditions
ci / windows machine wsl (push) Blocked by required conditions
ci / macos machine applehv (push) Blocked by required conditions
ci / macos machine libkrun (push) Blocked by required conditions
ci / Total Success (push) Blocked by required conditions
zizmor: GitHub Actions Security Analysis / Zizmor (push) Waiting to run

.github: remove the leftover cirrus cron scripts
This commit is contained in:
Paul Holzinger 2026-07-28 17:51:15 +02:00 committed by GitHub
commit f74c2d95e5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 0 additions and 452 deletions

View file

@ -1,92 +0,0 @@
#!/bin/bash
set -eo pipefail
# Intended to be executed from a github action workflow step.
# Outputs the Cirrus cron names and IDs of any failed builds
source $(dirname "${BASH_SOURCE[0]}")/lib.sh
_errfmt="Expecting %s value to not be empty"
if [[ -z "$GITHUB_REPOSITORY" ]]; then # <owner>/<repo>
err $(printf "$_errfmt" "\$GITHUB_REPOSITORY")
elif [[ -z "$ID_NAME_FILEPATH" ]]; then # output filepath
err $(printf "$_errfmt" "\$ID_NAME_FILEPATH")
fi
confirm_gha_environment
mkdir -p ./artifacts
cat > ./artifacts/query_raw.json << "EOF"
query {
ownerRepository(platform: "github", owner: "@@OWNER@@", name: "@@REPO@@") {
cronSettings {
name
lastInvocationBuild {
id
status
}
}
}
}
EOF
# Makes for easier copy/pasting query to/from
# https://cirrus-ci.com/explorer
owner=$(cut -d '/' -f 1 <<<"$GITHUB_REPOSITORY")
repo=$(cut -d '/' -f 2 <<<"$GITHUB_REPOSITORY")
sed -r -e "s/@@OWNER@@/$owner/g" -e "s/@@REPO@@/$repo/g" \
./artifacts/query_raw.json > ./artifacts/query.json
if grep -q '@@' ./artifacts/query.json; then
err "Found unreplaced substitution token in query JSON"
fi
# The query should never ever return an empty-list, unless there are no cirrus-cron
# jobs defined for the repository. In that case, this monitoring script shouldn't
# be running anyway.
filt_head='.data.ownerRepository.cronSettings'
gql "$(<./artifacts/query.json)" "$filt_head" > ./artifacts/reply.json
# e.x. reply.json
# {
# "data": {
# "ownerRepository": {
# "cronSettings": [
# {
# "name": "Keepalive_v2.0",
# "lastInvocationBuild": {
# "id": "5776050544181248",
# "status": "EXECUTING"
# }
# },
# {
# "name": "Keepalive_v1.9",
# "lastInvocationBuild": {
# "id": "5962921081569280",
# "status": "COMPLETED"
# }
# },
# {
# "name": "Keepalive_v2.0.5-rhel",
# "lastInvocationBuild": {
# "id": "5003065549914112",
# "status": "FAILED"
# }
# ...
# Output format: <build id> <cron-job name>
# Where <cron-job name> may contain multiple words
filt="$filt_head | map(select(.lastInvocationBuild.status==\"FAILED\") | {id:.lastInvocationBuild.id, name:.name} | join(\" \")) | join(\"\n\")"
jq --raw-output "$filt" ./artifacts/reply.json > "$ID_NAME_FILEPATH"
# Print out the file to assist in job debugging
echo "<Failed Build ID> <Cron Name>"
cat "$ID_NAME_FILEPATH"
# Count non-empty lines (in case there are any)
records=$(awk -r -e '/\w+/{print $0}' "$ID_NAME_FILEPATH" | wc -l)
# Set the output of this step.
# Ref: https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-output-parameter
# shellcheck disable=SC2154
echo "failures=$records" >> $GITHUB_OUTPUT
echo "Total failed Cirrus-CI cron builds: $records"

View file

@ -1,95 +0,0 @@
# Send text to stderr
msg() {
echo "$@" > /dev/stderr
}
# Must be called from top-level of script, not another function.
err() {
# Ref: https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions
msg "::error file=${BASH_SOURCE[1]},line=${BASH_LINENO[0]}::$*"
exit 1
}
confirm_gha_environment() {
local _err_fmt
_err_fmt="I don't seem to be running from a github-actions workflow"
# These are all defined by github-actions
# shellcheck disable=SC2154
if [[ -z "$GITHUB_OUTPUT" ]]; then
err "$_err_fmt, \$GITHUB_OUTPUT is empty"
elif [[ -z "$GITHUB_WORKFLOW" ]]; then
err "$_err_fmt, \$GITHUB_WORKFLOW is empty"
elif [[ ! -d "$GITHUB_WORKSPACE" ]]; then
# Defined by github-actions
# shellcheck disable=SC2154
err "$_err_fmt, \$GITHUB_WORKSPACE='$GITHUB_WORKSPACE' isn't a directory"
fi
cd "$GITHUB_WORKSPACE" || false
}
# Using python3 here is a compromise for readability and
# properly handling quote, control and unicode character encoding.
escape_query() {
local json_string
# Assume it's okay to squash repeated whitespaces inside the query
json_string=$(printf '%s' "$1" | \
tr --delete '\r\n' | \
tr --squeeze-repeats '[[:space:]]' | \
python3 -c 'import sys,json; print(json.dumps(sys.stdin.read()))')
# The $json_string in message is already quoted
echo -n "$json_string"
}
# Given a GraphQL query/mutation, fire it at the API.
# and return the output on stdout. The optional
# second parameter may contain a jq filter-string.
# When provided, if the GQL result is empty, null,
# fails to parse, or does not match the filter-string,
# non-zero will be returned.
gql() {
local e_query query
e_query=$(escape_query "$1")
query="{\"query\": $e_query}"
local filter
filter="$2"
local output
local filtered
msg "::group::Posting GraphQL Query and checking result"
msg "query: "
if ! jq -e . <<<"$query" > /dev/stderr; then
msg "::error file=${BASH_SOURCE[1]},line=${BASH_LINENO[0]}::Invalid query JSON: $query"
return 1
fi
# SECRET_CIRRUS_API_KEY is defined github secret
# shellcheck disable=SC2154
if output=$(curl \
--request POST \
--silent \
--show-error \
--location \
--header 'content-type: application/json' \
--header "Authorization: Bearer $SECRET_CIRRUS_API_KEY" \
--url 'https://api.cirrus-ci.com/graphql' \
--data "$query") && [[ -n "$output" ]]; then
if filtered=$(jq -e "$filter" <<<"$output") && [[ -n "$filtered" ]]; then
msg "result:"
# Make debugging easier w/ formatted output
# to stderr for display, stdout for consumption by caller
jq --indent 2 . <<<"$output" | tee /dev/stderr
msg "::endgroup::"
return 0
fi
msg "::error file=${BASH_SOURCE[1]},line=${BASH_LINENO[0]}::Query result did not pass filter '$2': '$output'"
msg "::endgroup::"
return 2
fi
msg "::error file=${BASH_SOURCE[1]},line=${BASH_LINENO[0]}::Query failed or result empty: '$output'"
msg "::endgroup::"
return 3
}

View file

@ -1,40 +0,0 @@
#!/bin/bash
set -eo pipefail
# Intended to be executed from a github action workflow step.
# Input: File listing space separated failed cron build names and IDs
# Output: $GITHUB_WORKSPACE/artifacts/email_body.txt file
source $(dirname "${BASH_SOURCE[0]}")/lib.sh
_errfmt="Expecting %s value to not be empty"
# ID_NAME_FILEPATH is defined by workflow YAML
# shellcheck disable=SC2154
if [[ -z "$GITHUB_REPOSITORY" ]]; then
err $(printf "$_errfmt" "\$GITHUB_REPOSITORY")
elif [[ ! -r "$ID_NAME_FILEPATH" ]]; then
err "Expecting \$ID_NAME_FILEPATH value ($ID_NAME_FILEPATH) to be a readable file"
fi
confirm_gha_environment
# GITHUB_WORKSPACE confirmed by confirm_gha_environment()
# shellcheck disable=SC2154
mkdir -p "$GITHUB_WORKSPACE/artifacts"
(
echo "Detected one or more Cirrus-CI cron-triggered jobs have failed recently:"
echo ""
while read -r BID NAME; do
echo "Cron build '$NAME' Failed: https://cirrus-ci.com/build/$BID"
done < "$ID_NAME_FILEPATH"
echo ""
# Defined by github-actions
# shellcheck disable=SC2154
echo "# Source: ${GITHUB_WORKFLOW} workflow on ${GITHUB_REPOSITORY}."
# Separate content from sendgrid.com automatic footer.
echo ""
echo ""
) > $GITHUB_WORKSPACE/artifacts/email_body.txt

View file

@ -1,124 +0,0 @@
#!/bin/bash
set -eo pipefail
# Intended to be executed from a github action workflow step.
# Input: File listing space separated failed cron build names and IDs
# Output: $GITHUB_WORKSPACE/artifacts/email_body.txt file
#
# HOW TO TEST: This script may be manually tested assuming you have
# access to the github containers-org. Cirrus API key. With that in-hand,
# this script may be manually run by:
# 1. export SECRET_CIRRUS_API_KEY=<value>
# 2. Find an old podman build that failed on `main` or another **branch**.
# For example, from https://cirrus-ci.com/github/containers/podman/main
# (pick an old one from the bottom, since re-running it won't affect anybody)
# 3. Create a temp. file, like /tmp/fail with a single line, of the form:
# <cirrus build id number> <cirrus-cron name>
# 4. export ID_NAME_FILEPATH=/tmp/fail
# 5. execute this script, and refresh the build in the WebUI, all unsuccessful
# tasks should change status to running or scheduled. Note: some later
# tasks may remain red as they wait for dependencies to run and pass.
# 6. After each run, cleanup with 'rm -rf $GITHUB_WORKSPACE/artifacts'
# (unless you want to examine them)
source $(dirname "${BASH_SOURCE[0]}")/lib.sh
_errfmt="Expecting %s value to not be empty"
# ID_NAME_FILEPATH is defined by workflow YAML
# shellcheck disable=SC2154
if [[ -z "$SECRET_CIRRUS_API_KEY" ]]; then
err $(printf "$_errfmt" "\$SECRET_CIRRUS_API_KEY")
elif [[ ! -r "$ID_NAME_FILEPATH" ]]; then # output from cron_failures.sh
err $(printf "Expecting %s value to be a readable file" "\$ID_NAME_FILEPATH")
fi
confirm_gha_environment
# GITHUB_WORKSPACE confirmed by confirm_gha_environment()
# shellcheck disable=SC2154
mkdir -p $GITHUB_WORKSPACE/artifacts
# If there are no tasks, don't fail reading the file
truncate -s 0 $GITHUB_WORKSPACE/artifacts/rerun_tids.txt
cat "$ID_NAME_FILEPATH" | \
while read -r BID NAME; do
if [[ -z "$NAME" ]]; then
err $(printf "$_errfmt" "\$NAME")
elif [[ -z "$BID" ]]; then
err $(printf "$_errfmt" "\$BID")
fi
id_status_q="
query {
build(id: \"$BID\") {
tasks {
id,
status
}
}
}
"
task_id_status=$(gql "$id_status_q" '.data.build.tasks[0]')
# Expected query result like:
# {
# "data": {
# "build": {
# "tasks": [
# {
# "id": "6321184690667520",
# "status": "COMPLETED"
# },
# ...
msg "::group::Selecting failed/aborted tasks to re-run"
jq -r -e '.data.build.tasks[] | join(" ")' <<<"$task_id_status" | \
while read -r TID STATUS; do
if [[ -z "$TID" ]] || [[ -z "$STATUS" ]]; then
# assume empty line and/or end of file
msg "Skipping TID '$TID' with status '$STATUS'"
continue
# Failed task dependencies will have 'aborted' status
elif [[ "$STATUS" == "FAILED" ]] || [[ "$STATUS" == "ABORTED" ]]; then
msg "Rerunning build $BID task $TID"
# Must send result through a file into rerun_tasks array
# because this section is executing in a child-shell
echo "$TID" >> $GITHUB_WORKSPACE/artifacts/rerun_tids.txt
fi
done
declare -a rerun_tasks
mapfile rerun_tasks <$GITHUB_WORKSPACE/artifacts/rerun_tids.txt
msg "::endgroup::"
if [[ "${#rerun_tasks[*]}" -eq 0 ]]; then
msg "No tasks to re-run for build $BID"
continue;
fi
msg "::warning::Rerunning ${#rerun_tasks[*]} tasks for build $BID"
# Check-value returned if the gql call was successful
canary=$(uuidgen)
# Ensure the trailing ',' is stripped from the end (would be invalid JSON)
# Rely on shell word-splitting in this case.
# shellcheck disable=SC2048
task_ids=$(printf '[%s]' $(printf '"%s",' ${rerun_tasks[*]} | head -c -1))
rerun_m="
mutation {
batchReRun(input: {
clientMutationId: \"$canary\",
taskIds: $task_ids
}
) {
clientMutationId
}
}
"
filter='.data.batchReRun.clientMutationId'
if [[ ! "$NAME" =~ "testing" ]]; then # see test.sh
result=$(gql "$rerun_m" "$filter")
if [[ $(jq -r -e "$filter"<<<"$result") != "$canary" ]]; then
err "Attempt to re-run tasks for build $BID failed: ${rerun_tasks[*]}"
fi
else
warn "Test-mode: Would have sent GraphQL request: '$rerun_m'"
fi
done

View file

@ -1,101 +0,0 @@
# This script attempts to confirm functional github action scripts.
# It expects to be called from Cirrus-CI, in a special execution
# environment. Any use outside this environment will probably fail.
set -eo pipefail
# Defined by setup_environment.sh
# shellcheck disable=SC2154
if ! ((PREBUILD)); then
echo "Not operating under expected environment"
exit 1
fi
expect_regex() {
local expected_regex
local input_file
expected_regex="$1"
input_file="$2"
grep -E -q "$expected_regex" $input_file || \
die "No match to '$expected_regex' in '$(<$input_file)'"
}
req_env_vars CIRRUS_CI CIRRUS_REPO_FULL_NAME CIRRUS_WORKING_DIR CIRRUS_BUILD_ID
# Defined by the CI system
# shellcheck disable=SC2154
cd $CIRRUS_WORKING_DIR || fail
header="Testing cirrus-cron github-action script:"
msg "$header cron_failures.sh"
base=$CIRRUS_WORKING_DIR/.github/actions/check_cirrus_cron
# Don't care about mktemp return value
# shellcheck disable=SC2155
export GITHUB_OUTPUT=$(mktemp -p '' cron_failures_output_XXXX)
# CIRRUS_REPO_FULL_NAME checked above in req_env_vars
# shellcheck disable=SC2154
export GITHUB_REPOSITORY="$CIRRUS_REPO_FULL_NAME"
# shellcheck disable=SC2155
export GITHUB_WORKSPACE=$(mktemp -d -p '' cron_failures_workspace_XXXX)
export GITHUB_WORKFLOW="testing"
# shellcheck disable=SC2155
export ID_NAME_FILEPATH=$(mktemp -p '' cron_failures_data_XXXX)
trap "rm -rf $GITHUB_OUTPUT $GITHUB_WORKSPACE $ID_NAME_FILEPATH" EXIT
#####
cd $GITHUB_WORKSPACE || fail
# Replace newlines and indentation to make grep easier
if ! $base/cron_failures.sh |& \
tr -s '[:space:]' ' ' > $GITHUB_WORKSPACE/output; then
die "Failed: $base/cron_failures.sh with output '$(<$GITHUB_WORKSPACE/output)'"
fi
expect_regex \
'result.+data.+ownerRepository.+cronSettings.+endgroup' \
"$GITHUB_WORKSPACE/output"
#####
msg "$header make_email_body.sh"
# It's possible no cirrus-cron jobs actually failed
echo -e '\n\n \n\t\n' >> "$ID_NAME_FILEPATH" # blank lines should be ignored
# Don't need to test stdout/stderr of this
if ! $base/make_email_body.sh; then
die "make_email_body.sh failed"
fi
expect_regex \
'^Detected.+Cirrus-CI.+failed.*' \
"$GITHUB_WORKSPACE/artifacts/email_body.txt"
#####
msg "$header make_email_body.sh name and link"
# Job names may contain spaces, confirm lines are parsed properly
echo -e '1234567890 cirrus-cron test job' >> "$ID_NAME_FILEPATH" # Append to blank lines
$base/make_email_body.sh
expected="Cron build 'cirrus-cron test job' Failed: https://cirrus-ci.com/build/1234567890"
if ! grep -q "$expected" $GITHUB_WORKSPACE/artifacts/email_body.txt; then
die "Expecting to find string '$expected' in generated e-mail body:
$(<$GITHUB_WORKSPACE/artifacts/email_body.txt)"
fi
#####
msg "$header rerun_failed_tasks.sh"
export SECRET_CIRRUS_API_KEY=testing-nottherightkey
# test.sh is sensitive to the 'testing' name. Var. defined by cirrus-ci
# shellcheck disable=SC2154
echo "$CIRRUS_BUILD_ID test cron job name" > "$ID_NAME_FILEPATH"
if ! $base/rerun_failed_tasks.sh |& \
tr -s '[:space:]' ' ' > $GITHUB_WORKSPACE/rerun_output; then
die "rerun_failed_tasks.sh failed"
fi
expect_regex \
"Posting GraphQL Query.+$CIRRUS_BUILD_ID.+Selecting.+re-run" \
"$GITHUB_WORKSPACE/rerun_output"