mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-01 19:12:14 +00:00
6c99d4fe22
nix-flake-update opens a PR every Sunday that changes flake.lock and nothing else. flake.lock is consumed only by Nix packaging — cargo never reads it — yet it was in no paths filter, so each of those PRs ran the full Continuous Integration pipeline and the merge then ran Build and Release too. Added to all four lists that have to agree: ci.yml's push and pull_request paths-ignore, build.yml's push paths-ignore, and ci-docs-only.yml's paths. The cron stays. flake.lock still has consumers — anyone running `nix build` or `nix develop` — so stopping the updates would remove the workflow's output, not just its CI cost. Those four lists drifting is a silent failure, so scripts/check_ci_paths_sync.sh now asserts the pair that matters: ci.yml's pull_request paths-ignore must equal ci-docs-only.yml's paths. An entry present only in the first means a PR touching those files triggers neither workflow, nobody reports "Test and Lint" or "Quick Checks", and the PR waits on a required check forever. It also asserts both companion job names still exist, since renaming one produces the same hang. The push list is not compared: no required check is reported for push events. Also in this cleanup: - nix-flake-update's GITHUB_TOKEN drops to contents: read. The branch push and the pull request are both made by update-flake-lock with the FLAKE_UPDATE_TOKEN PAT, so the write scopes were an unused repo-write credential on an unattended weekly job. - build.yml's build_docker dispatch input is documented as advisory. docker.yml triggers on workflow_run and requires the triggering event to be a tag push, so a manual dispatch never reaches it whatever this input says. - The nine disabled workflow files get a banner saying so. Their disabled_manually state lives in GitHub's UI and is invisible when reading the file, which has already misled one audit into treating dead workflows as live. Refs: rustfs/backlog#1598, rustfs/backlog#1603
84 lines
3.3 KiB
Bash
Executable File
84 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# ci.yml's pull_request paths-ignore and ci-docs-only.yml's paths must be equal.
|
|
#
|
|
# ci-docs-only.yml exists to report the required checks for pull requests that
|
|
# ci.yml skips. The two lists are the complement of each other, so any drift
|
|
# breaks one of two ways, both silent:
|
|
#
|
|
# - an entry only in ci.yml's paths-ignore: a PR touching only those files
|
|
# triggers neither workflow, nobody reports "Test and Lint" or "Quick
|
|
# Checks", and the PR waits on a required check forever;
|
|
# - an entry only in ci-docs-only.yml's paths: both workflows run, which is
|
|
# merely wasteful — but it also means the lists no longer describe the same
|
|
# intent, and the next edit is made against a wrong assumption.
|
|
#
|
|
# The push paths-ignore in ci.yml is deliberately NOT compared: no required
|
|
# check is reported for push events, so it does not have to pair with anything.
|
|
#
|
|
# Also asserts ci-docs-only.yml still declares both companion job names, since a
|
|
# rename there produces exactly the permanent-pending failure above.
|
|
#
|
|
# Usage: scripts/check_ci_paths_sync.sh
|
|
set -euo pipefail
|
|
|
|
cd "$(dirname "$0")/.."
|
|
|
|
CI=".github/workflows/ci.yml"
|
|
DOCS=".github/workflows/ci-docs-only.yml"
|
|
|
|
# Print the quoted list items that follow $2 within the block introduced by $1.
|
|
# Both files keep these as a flat list of quoted scalars, so no YAML parser is
|
|
# needed and the script stays dependency-free like its check_* siblings.
|
|
extract() {
|
|
local file="$1" event="$2" key="$3"
|
|
awk -v event="$event" -v key="$key" '
|
|
$0 ~ "^ " event ":[[:space:]]*$" { in_event = 1; next }
|
|
in_event && /^ [a-z_]+:[[:space:]]*$/ { in_event = 0 }
|
|
in_event && $0 ~ "^ " key ":[[:space:]]*$" { in_list = 1; next }
|
|
in_list {
|
|
if ($0 ~ /^ - /) {
|
|
item = $0
|
|
sub(/^ - /, "", item)
|
|
gsub(/^"|"$/, "", item)
|
|
print item
|
|
next
|
|
}
|
|
if ($0 !~ /^[[:space:]]*#/ && $0 !~ /^[[:space:]]*$/) in_list = 0
|
|
}
|
|
' "$file" | sort
|
|
}
|
|
|
|
ci_list="$(extract "$CI" "pull_request" "paths-ignore")"
|
|
docs_list="$(extract "$DOCS" "pull_request" "paths")"
|
|
|
|
if [ -z "$ci_list" ] || [ -z "$docs_list" ]; then
|
|
echo "ERROR: could not read one of the path lists — did the file structure change?" >&2
|
|
echo " $CI pull_request.paths-ignore: $(printf '%s' "$ci_list" | grep -c . || true) entries" >&2
|
|
echo " $DOCS pull_request.paths: $(printf '%s' "$docs_list" | grep -c . || true) entries" >&2
|
|
exit 1
|
|
fi
|
|
|
|
status=0
|
|
|
|
if ! diff_out="$(diff <(printf '%s\n' "$ci_list") <(printf '%s\n' "$docs_list"))"; then
|
|
echo "ERROR: $CI pull_request paths-ignore and $DOCS paths have drifted." >&2
|
|
echo " '<' is only in $CI, '>' is only in $DOCS:" >&2
|
|
printf '%s\n' "$diff_out" | sed 's/^/ /' >&2
|
|
status=1
|
|
fi
|
|
|
|
for job_name in "Test and Lint" "Quick Checks"; do
|
|
if ! grep -q "name: ${job_name}\$" "$DOCS"; then
|
|
echo "ERROR: $DOCS no longer declares a job named '${job_name}'." >&2
|
|
echo " It is a required status check; without a companion job here, a" >&2
|
|
echo " docs-only PR waits on it forever." >&2
|
|
status=1
|
|
fi
|
|
done
|
|
|
|
if [ "$status" -ne 0 ]; then
|
|
exit 1
|
|
fi
|
|
|
|
echo "OK: ci.yml and ci-docs-only.yml path lists agree ($(printf '%s\n' "$ci_list" | wc -l | tr -d ' ') entries)"
|