Skip to content
Open
Show file tree
Hide file tree
Changes from 29 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
ede9fd9
fix bug in run_tests logic
sean-breen Jun 24, 2026
a207440
wider net for docs_only
sean-breen Jun 25, 2026
5742781
Merge branch 'main' into chore/sb-ci-updates
sean-breen Jul 2, 2026
35c8d2c
fix docs_only detection, and enable for merge queue
sean-breen Jul 2, 2026
c7a72a9
Merge branch 'main' into chore/sb-ci-updates
sean-breen Jul 2, 2026
caea766
address feedback
sean-breen Jul 7, 2026
9ffea18
Potential fix for pull request finding
sean-breen Jul 7, 2026
531af52
gate all logic via variables.sh
sean-breen Jul 7, 2026
1fa0c69
merge main into chore/sb-ci-updates
sean-breen Jul 7, 2026
b102857
add back missing file
sean-breen Jul 7, 2026
a94baeb
cant use empty needs
sean-breen Jul 8, 2026
1681951
fix tag_stable logic, doesnt run on docs_only
sean-breen Jul 9, 2026
ec1dd2a
allow inspection of which jobs failed
sean-breen Jul 9, 2026
6fba7c7
Merge branch 'main' into chore/sb-ci-updates
sean-breen Jul 9, 2026
53cc407
update logic around CI flags
sean-breen Jul 9, 2026
02c7b1f
prevent unnecessary rebuilds when modifying files that do not affect …
sean-breen Jul 13, 2026
63a86d2
dont build for helm tests when a stable tag exists
sean-breen Jul 13, 2026
1c99f97
Merge branch 'main' into chore/sb-ci-updates
sean-breen Jul 13, 2026
abca8c6
add prompts dir to exclusion list
sean-breen Jul 14, 2026
2abbd40
remove redundant run_build variable
sean-breen Jul 14, 2026
cd52acc
full-build only when force is true
sean-breen Jul 15, 2026
db9ef51
Merge branch 'main' into chore/sb-ci-updates
sean-breen Jul 20, 2026
ed135cf
remove test make targets
sean-breen Jul 20, 2026
04a454a
add ci-preview scripts and make targets
sean-breen Jul 20, 2026
d06c778
Merge branch 'main' into chore/sb-ci-updates
sean-breen Jul 20, 2026
58f6b5f
short-circuit the e2e and tag-stable checks when build-artifacts did …
sean-breen Jul 20, 2026
bb85131
set-matrix
sean-breen Jul 21, 2026
a25440a
fix gating for e2e jobs + final ci results
sean-breen Jul 21, 2026
12ec6a0
Merge branch 'main' into chore/sb-ci-updates
vepatel Jul 22, 2026
65b0338
check for target_exists, and force a rebuild if not
sean-breen Jul 22, 2026
631d567
Merge branch 'main' into chore/sb-ci-updates
sean-breen Aug 5, 2026
9517d8a
Merge branch 'main' into chore/sb-ci-updates
sean-breen Aug 11, 2026
b77abba
Merge branch 'main' into chore/sb-ci-updates
sean-breen Aug 12, 2026
a93dccb
pr feedback
sean-breen Aug 12, 2026
e952897
merge main
sean-breen Aug 12, 2026
05034cb
add developer doc, and update skill
sean-breen Aug 12, 2026
8660787
fix repo paths
sean-breen Aug 12, 2026
63ab118
fix failing test
sean-breen Aug 12, 2026
169ffc9
fix failing test
sean-breen Aug 12, 2026
33c1dd8
fix arch mismatch?
sean-breen Aug 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
441 changes: 441 additions & 0 deletions .github/scripts/ci-preview.sh

Large diffs are not rendered by default.

149 changes: 149 additions & 0 deletions .github/scripts/ci-preview_test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
#!/usr/bin/env bash
#
# Snapshot tests for ci-preview.sh. For each named preset scenario, invoke
# the preview in --json mode and assert the computed flag values match the
# expectations documented here. This is a second layer of protection on top
# of variables_test.sh: variables_test.sh checks the flag functions in
# isolation; this checks the scenario wiring in ci-preview.sh + the
# translation of workflow_dispatch inputs (e.g. docs_only being force-false
# on workflow_dispatch).
#
# Run: bash .github/scripts/ci-preview_test.sh [-v|--verbose]

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PREVIEW="$SCRIPT_DIR/ci-preview.sh"

VERBOSE=0
case "${1:-}" in -v | --verbose) VERBOSE=1 ;; esac

if [ -t 1 ] && [ -z "${NO_COLOR:-}" ]; then
C_PASS=$'\033[0;32m' C_FAIL=$'\033[0;31m' C_DIM=$'\033[0;90m' C_OFF=$'\033[0m'
else
C_PASS='' C_FAIL='' C_DIM='' C_OFF=''
fi

pass=0
fail=0

# extract_flags_line <json-blob>
# Collapses the JSON emitted by ci-preview --json to a single-line form:
# run_tests=<v> docker_build=<v> run_unit_tests=<v> run_e2e=<v> tag_stable=<v> promote=<v>
extract_flags_line() {
awk -F'"' '
/"run_tests":/ { r=$4 }
/"docker_build":/ { d=$4 }
/"run_unit_tests":/ { u=$4 }
/"run_e2e":/ { e=$4 }
/"tag_stable":/ { t=$4 }
/"promote":/ { p=$4 }
END { printf "run_tests=%s docker_build=%s run_unit_tests=%s run_e2e=%s tag_stable=%s promote=%s", r, d, u, e, t, p }
'
}

# assert_scenario_flags <preset> <expected-flags-line>
assert_scenario_flags() {
local preset="$1" want="$2"
local got
got=$(NO_COLOR=1 "$PREVIEW" --scenario "$preset" --json 2>/dev/null | extract_flags_line)
if [ "$got" = "$want" ]; then
pass=$((pass + 1))
if [ "$VERBOSE" -eq 1 ]; then
printf '%b✓ PASS%b %-18s %s\n' "$C_PASS" "$C_OFF" "$preset" "$got"
fi
else
fail=$((fail + 1))
printf '%b✗ FAIL%b %-18s\n want: %s\n got: %s\n' \
"$C_FAIL" "$C_OFF" "$preset" "$want" "$got"
fi
}

# assert_current_flags <label> <extra-args...> -- <expected-flags-line>
# Runs `--current <extra-args>` and asserts the resulting flags. The `--`
# separator marks where the expected line begins so we can pass an arbitrary
# number of extra ci-preview flags before it.
assert_current_flags() {
local label="$1"; shift
local args=() want=""
while [ $# -gt 0 ]; do
if [ "$1" = "--" ]; then shift; want="$1"; shift; break; fi
args+=("$1"); shift
done
local got
got=$(NO_COLOR=1 "$PREVIEW" --current "${args[@]}" --json 2>/dev/null | extract_flags_line)
if [ "$got" = "$want" ]; then
pass=$((pass + 1))
if [ "$VERBOSE" -eq 1 ]; then
printf '%b✓ PASS%b %-18s %s\n' "$C_PASS" "$C_OFF" "$label" "$got"
fi
else
fail=$((fail + 1))
printf '%b✗ FAIL%b %-18s\n want: %s\n got: %s\n' \
"$C_FAIL" "$C_OFF" "$label" "$want" "$got"
fi
}

# --- presets -----------------------------------------------------------------
# Keep aligned with the docstring in ci-preview.sh. Each row: the flag values
# that ci.yml would use to gate every downstream job for that scenario.

assert_scenario_flags normal \
"run_tests=true docker_build=true run_unit_tests=true run_e2e=true tag_stable=true promote=false"

assert_scenario_flags docs-only \
"run_tests=false docker_build=false run_unit_tests=false run_e2e=false tag_stable=false promote=false"

assert_scenario_flags up-to-date \
"run_tests=false docker_build=false run_unit_tests=false run_e2e=false tag_stable=false promote=false"

assert_scenario_flags cache-only \
"run_tests=true docker_build=true run_unit_tests=false run_e2e=true tag_stable=true promote=false"

assert_scenario_flags stable-only \
"run_tests=false docker_build=false run_unit_tests=false run_e2e=false tag_stable=false promote=false"

assert_scenario_flags forked \
"run_tests=true docker_build=true run_unit_tests=true run_e2e=false tag_stable=false promote=false"

assert_scenario_flags forked-docs \
"run_tests=false docker_build=false run_unit_tests=false run_e2e=false tag_stable=false promote=false"

assert_scenario_flags force-main \
"run_tests=false docker_build=true run_unit_tests=true run_e2e=true tag_stable=true promote=true"

assert_scenario_flags force-main-no-tests \
"run_tests=false docker_build=true run_unit_tests=false run_e2e=false tag_stable=false promote=false"

assert_scenario_flags force-release \
"run_tests=false docker_build=true run_unit_tests=true run_e2e=true tag_stable=true promote=true"

assert_scenario_flags force-feature \
"run_tests=true docker_build=true run_unit_tests=true run_e2e=true tag_stable=true promote=false"

assert_scenario_flags run-tests-false \
"run_tests=false docker_build=true run_unit_tests=false run_e2e=false tag_stable=false promote=false"

assert_scenario_flags merge-queue \
"run_tests=true docker_build=true run_unit_tests=true run_e2e=true tag_stable=true promote=false"

# --- --current mode ----------------------------------------------------------
# Smoke-test the auto-detect wiring. Explicit overrides must beat the
# auto-detected value; this is what makes `make ci-preview` safe on any branch.
if git rev-parse --show-toplevel >/dev/null 2>&1; then
assert_current_flags "current+docs-only" --docs-only true -- \
"run_tests=false docker_build=false run_unit_tests=false run_e2e=false tag_stable=false promote=false"

assert_current_flags "current+optimistic" --cache-hit true --stable-exists true -- \
"run_tests=false docker_build=false run_unit_tests=false run_e2e=false tag_stable=false promote=false"
else
if [ "$VERBOSE" -eq 1 ]; then
printf '%b- SKIP%b %-18s %b[not in a git repo]%b\n' \
"$C_DIM" "$C_OFF" "current mode" "$C_DIM" "$C_OFF"
fi
fi

if [ "$fail" -eq 0 ]; then
printf '%b✓ all %d preview scenarios passed%b\n' "$C_PASS" "$pass" "$C_OFF"
else
printf '%b✗ %d of %d preview scenarios failed%b\n' "$C_FAIL" "$fail" "$((pass + fail))" "$C_OFF"
fi
[ "$fail" -eq 0 ]
1 change: 1 addition & 0 deletions .github/scripts/exclude_ci_files.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
.github/scripts/release-version-update.sh
.github/scripts/requirements.txt
.github/skills/*
.github/prompts/*
.github/workflows/build-base-images.yml
.github/workflows/build-ot-dependency.yml
.github/workflows/build-test-image.yml
Expand Down
5 changes: 4 additions & 1 deletion .github/scripts/validate-workflow-gating.sh
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,8 @@ main() {

if ! validate_if_condition "$job_name" "$if_cond"; then
if [ "$file_has_errors" -eq 0 ]; then
# Blank line separates each file's group of errors for readability.
echo ""
echo "❌ File '$file' has ungated or poorly gated jobs:"
file_has_errors=1
fi
Expand All @@ -119,7 +121,8 @@ main() {
done

if [ "$errors" -ne 0 ]; then
echo "❌ Workflow validation failed! All public jobs must have strict repository gating."
echo ""
echo "❌ Workflow validation failed! Found ${errors} issues."
exit 1
else
echo "✅ All public workflows are successfully gated."
Expand Down
Loading
Loading