#!/usr/bin/env bash # Runs the same checks as the explorer's GitHub workflows (.github/workflows/ # explorer-*.yml) and keeps the full output with per-step timings in # tests/tmp/check-ci.log. That log lives outside tests/artifacts, which # Playwright clears when the e2e run starts. # # Leaves out explorer-visual.yml: its baselines exist only as CI artifacts. The # desktop app in desktop/ has its own desktop/scripts/check-ci. set -uo pipefail cd "$(dirname "$0")/.." || exit log=tests/tmp/check-ci.log mkdir -p "$(dirname "$log")" echo "check-ci started $(date -u +%Y-%m-%dT%H:%M:%SZ) at $(git rev-parse --short HEAD)" >"$log" if [ -t 1 ]; then bold=$'\e[1m' dim=$'\e[2m' green=$'\e[32m' red=$'\e[31m' reset=$'\e[0m' else bold="" dim="" green="" red="" reset="" fi # Prints to the terminal with styling and to the log without. say() { printf '%s\n' "$1" printf '%s\n' "$2" >>"$log" } width=$(tput cols 2>/dev/null || echo 80) [ "$width" -gt 100 ] && width=100 # A full-width rule with a title, like "━━ check-js ━━━━━━". rule() { local text="━━ $1 " local fill=$((width - ${#text})) [ "$fill" -lt 3 ] && fill=3 printf '%s%s' "$text" "$(printf '━%.0s' $(seq 1 "$fill"))" } steps=( "check|npm run check" "unit-test|npm run test:unit" "install-binaries|mkdir -p tests/artifacts && scripts/install-binaries" "http-client-unit-test|npm run test:http-client:unit" "rust build|RUSTFLAGS='-D warnings' cargo build --workspace --all-features" "rust test|cargo test --workspace --all-features && cargo test -p radicle-httpd" "rust lint|RUSTFLAGS='-D warnings' cargo clippy --workspace --all-features --tests && RUSTFLAGS='-D warnings' cargo clippy -p radicle-httpd --no-default-features --tests && cargo fmt --all -- --check" "playwright install|npx playwright install chromium" "build|npm run build && npm run test:e2e -- --project chromium --config playwright.buildSmoke.config.ts" "e2e|npm run test:e2e -- --project chromium" ) summary=() status=0 total_start=$SECONDS for step in "${steps[@]}"; do name=${step%%|*} command=${step#*|} if [ "$status" -ne 0 ]; then summary+=("$(printf '%s- %-18s skipped%s' "$dim" "$name" "$reset")|$(printf -- '- %-18s skipped' "$name")") continue fi say "" "" say "${bold}$(rule "$name")${reset}" "$(rule "$name")" say "${dim} \$ $command${reset}" " \$ $command" say "" "" start=$SECONDS bash -c "$command" 2>&1 | awk '{ print " " $0; fflush() }' | tee -a "$log" status=${PIPESTATUS[0]} took=$((SECONDS - start)) if [ "$status" -eq 0 ]; then summary+=("$(printf '%s✓%s %-18s %4ss' "$green" "$reset" "$name" "$took")|$(printf '✓ %-18s %4ss' "$name" "$took")") else summary+=("$(printf '%s✗ %-18s %4ss exit %s%s' "$red" "$name" "$took" "$status" "$reset")|$(printf '✗ %-18s %4ss exit %s' "$name" "$took" "$status")") fi done say "" "" say "${bold}$(rule summary)${reset}" "$(rule summary)" say "" "" for line in "${summary[@]}"; do say " ${line%%|*}" " ${line#*|}" done say "" "" took=$((SECONDS - total_start)) if [ "$status" -eq 0 ]; then say " ${bold}${green}All checks passed in ${took}s${reset} ${dim}· log: $log${reset}" " All checks passed in ${took}s" else say " ${bold}${red}Checks failed after ${took}s${reset} ${dim}· log: $log${reset}" " Checks failed after ${took}s" fi exit "$status"