Files
homarr/scripts/ci/act.sh
T
Thomas 229bd4b3ed chore: use Bun package management and Turbo remote caching (#6978)
* feat: migrate tooling and runtimes to bun

* fix: serialize act installs and adapt backup checks

* fix: finish bun scripts and rootless act setup

* fix: support bun images in runtime benchmarks

* fix: keep a single bun toolchain configuration

* fix: include docs mascot sources in workshop build

* docs: use bun in remaining tool commands

* fix: complete bun sqlite development tooling

* docs: explain sqlite development adapter

* fix: align remaining commands and local ci validation

* fix: use renovate regex fallback with bun

* fix: finalize bun sqlite connections during cleanup

* fix: preserve sqlite foreign key enforcement

* fix: align docker build frontends

* fix: prepare release versions with bun

* Add Bun benchmarks and preserve SQLite connection defaults

* Benchmark Bun installs, conflicts and production workloads

* Force Bun workspace tools and HTTP/1.1 upstream streaming

* Exclude benchmark evidence from Docker contexts

* Expose branch benchmarks through CI

* Verify hydrated widget data in production benchmarks

* Measure image archives and document benchmark protocol

* Audit dependency sharing across every workspace

* Pin pnpm for nested baseline benchmark scripts

* Preserve nested manager pinning on benchmark resume

* Include application and runtime image footprints

* Fail benchmark gates on candidate command errors

* Report complete build overhead and sampled memory bounds

* Validate migration comparisons across pinned revisions

* Record configurable runtime memory budgets

* Retain out-of-memory kills in runtime budget probes

* Reject OOM events consistently across runtime metrics

* Record complete Bun migration benchmarks

* Record memory diagnosis and correct Turbo caching

* Use Bun package management while preserving Node runtimes

* Keep native build fallbacks and exclude development artifacts

* Fix Node ESM metadata and isolate local CI configuration

* Measure development performance and isolate act environment

* Support isolated environment files in rootless act

* Validate the full migration range with act

* Preserve native SQLite binding for bundled migrations

* Use documented dev defaults and report benchmark scope

* Validate dev defaults and isolate restart measurements

* Record package-manager and development benchmarks

* Keep benchmark measurements and link full command artifacts

* Clean up temporary act environment files

* Validate Node runtimes in package-manager comparisons

* Validate every workspace in manual CI runs

* Retain patched nested brace expansion versions

* Complete package-manager and Node performance report

* Normalize archived benchmark logs

* Record final hosted validation

* Cache both Next builds with platform isolation

* Prime cache with write-only mode

* Split Next artifacts below Cloudflare upload limit

* Assemble coherent standalone cache outputs

* Preserve traced middleware entrypoints

* Assemble traced directory links before files

* Separate cached dependencies from assembled output

* Record signed Turbo cache benchmarks

* Remove archived benchmark captures

Full benchmark evidence is preserved at 8f7d3bcd14109bfb13fa664d31710b88d820ad66.

* Remove migration benchmark harness

* fix: correct migration launch and local Act prerequisites

* Consolidate Turbo caches and production artifacts

* Exclude generated files from Docker cache inputs

* fix: address Bun migration review findings

* fix: check restored compiler bundle manifests
2026-10-07 16:38:14 +02:00

121 lines
3.3 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
mode="${1:-all}"
case "$mode" in
fast) job="fast-gate" ;;
docker) job="container" ;;
all) job="" ;;
cleanup) job="cleanup" ;;
*)
echo "Usage: $0 {fast|docker|all|cleanup}" >&2
exit 2
;;
esac
command -v act >/dev/null 2>&1 || {
echo "act is required: https://nektosact.com/installation/index.html" >&2
exit 1
}
docker info >/dev/null 2>&1 || {
echo "Docker is not running" >&2
exit 1
}
if [[ -z "${DOCKER_HOST:-}" ]]; then
DOCKER_HOST=$(docker context inspect --format '{{.Endpoints.docker.Host}}' 2>/dev/null || true)
export DOCKER_HOST
fi
head_sha=$(git rev-parse HEAD)
head_ref=$(git branch --show-current)
head_ref=${head_ref:-act-local}
event_file=$(mktemp "${TMPDIR:-/tmp}/homarr-act-event.XXXXXX")
environment_file=$(mktemp "${TMPDIR:-/tmp}/homarr-act-env.XXXXXX")
trap 'rm -f "$event_file" "$environment_file"' EXIT
json_escape() { printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g; s/\t/\\t/g'; }
if [[ "$mode" == "cleanup" ]]; then
event_name="workflow_dispatch"
cat >"$event_file" <<EOF
{
"inputs": { "operation": "cleanup", "pr_number": "1", "ref": "" },
"repository": { "full_name": "homarr-labs/homarr" }
}
EOF
elif [[ "$mode" == "docker" || "$mode" == "all" ]]; then
event_name="workflow_dispatch"
cat >"$event_file" <<EOF
{
"inputs": { "operation": "validate", "ref": "$head_sha" },
"repository": { "full_name": "homarr-labs/homarr" }
}
EOF
else
base_sha=$(git merge-base origin/dev HEAD)
event_name="pull_request"
safe_ref=$(json_escape "$head_ref")
cat >"$event_file" <<EOF
{
"action": "synchronize",
"number": 1,
"repository": { "full_name": "homarr-labs/homarr" },
"pull_request": {
"number": 1,
"draft": false,
"base": { "sha": "$base_sha", "ref": "dev" },
"head": {
"sha": "$head_sha",
"ref": "$safe_ref",
"repo": { "full_name": "homarr-labs/homarr" }
}
}
}
EOF
fi
runner_image="${ACT_RUNNER_IMAGE:-catthehacker/ubuntu:act-latest}"
args=(
"$event_name"
--workflows .github/workflows/ci.yml
--eventpath "$event_file"
--platform "ubuntu-latest=$runner_image"
--container-architecture linux/amd64
--env-file /dev/null
--bind
--env "DB_DRIVER=better-sqlite3"
--env "TURBO_CACHE_DIR=$PWD/.turbo/cache"
# Jobs share the dependency volume; installs must not race.
--concurrent-jobs 1
)
# Ryuk mounts the host socket; rootless runners also need a reachable host address.
if [[ "$DOCKER_HOST" == unix://* ]]; then
args+=(--env "TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE=${DOCKER_HOST#unix://}")
fi
if [[ -n "${ACT_TESTCONTAINERS_HOST:-}" ]]; then
args+=(--env "TESTCONTAINERS_HOST_OVERRIDE=$ACT_TESTCONTAINERS_HOST")
fi
if [[ -n "$job" ]]; then
args+=(--job "$job")
fi
git_common_dir=$(cd "$(git rev-parse --git-common-dir)" && pwd)
# Bun loads .env automatically; reproduce GitHub's checkout without local settings.
container_options="--volume $environment_file:$PWD/.env --volume homarr-act-bun-1-4-2-node-24-18-0-modules:$PWD/node_modules --volume homarr-act-bun-cache:/root/.bun/install/cache"
case "$git_common_dir" in
"$PWD" | "$PWD"/*) ;;
*) container_options="$container_options --volume $git_common_dir:$git_common_dir:ro" ;;
esac
args+=(--container-options "$container_options")
if [[ -n "${ACT_SECRET_FILE:-}" ]]; then
args+=(--secret-file "$ACT_SECRET_FILE")
fi
act "${args[@]}"