feat(08-01): add runner-probe workflow
- Probe-only workflow triggering on gsd/phase-08-gitea-ci branch only - Answers P-01..P-11 + P-13: Node version, pnpm, runner mode (critical fork Docker vs host), Docker socket, MariaDB service container spawn and reachability on both hostnames, actions/cache, Playwright WebKit deps, gitea-upload-artifact fork, and GITHUB_SHA short-SHA expression - Uses healthcheck.sh --connect --innodb_initialized for MariaDB (never the binary removed from mariadb:11 — Pitfall 11) - Uses ChristopherHX/gitea-upload-artifact@v4 (not the official action which aborts on Gitea with GHES detection — Pitfall 6 / T-08-SC) - P-12 (docker login) deferred to Plan 04 — probe never references any secret (T-08-01 compliant) - All steps that may fail use continue-on-error: true so probe reports findings instead of red-failing on expected unknowns
This commit is contained in:
@@ -0,0 +1,225 @@
|
|||||||
|
name: runner-probe
|
||||||
|
|
||||||
|
# Probe-only workflow — answers all runner unknowns before real CI is designed.
|
||||||
|
# Runs ONLY on the feature branch; never on main.
|
||||||
|
# All steps that may fail on this runner use continue-on-error: true or || true
|
||||||
|
# so the probe REPORTS findings instead of red-failing on an expected unknown.
|
||||||
|
# Do NOT reference any secret in this workflow (T-08-01).
|
||||||
|
#
|
||||||
|
# Checks performed: P-01 through P-11 + P-13
|
||||||
|
# P-12 (docker login) is deferred to Plan 04 (publish) — DO NOT add it here.
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- gsd/phase-08-gitea-ci
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
probe:
|
||||||
|
name: runner-probe
|
||||||
|
runs-on: self-hosted
|
||||||
|
|
||||||
|
# P-05: Service container — probe whether it spawns and on which hostname.
|
||||||
|
# Uses healthcheck.sh --connect --innodb_initialized.
|
||||||
|
# Note: healthcheck.sh is used because the binary from older clients was
|
||||||
|
# removed from mariadb:11 (Pitfall 11).
|
||||||
|
services:
|
||||||
|
mariadb:
|
||||||
|
image: mariadb:11
|
||||||
|
env:
|
||||||
|
MARIADB_ROOT_PASSWORD: root
|
||||||
|
MARIADB_DATABASE: familysync
|
||||||
|
MARIADB_USER: familysync
|
||||||
|
MARIADB_PASSWORD: testpass
|
||||||
|
options: >-
|
||||||
|
--health-cmd="healthcheck.sh --connect --innodb_initialized"
|
||||||
|
--health-interval=10s
|
||||||
|
--health-timeout=5s
|
||||||
|
--health-retries=10
|
||||||
|
--health-start-period=30s
|
||||||
|
|
||||||
|
steps:
|
||||||
|
# ─── P-07: actions/checkout ──────────────────────────────────────────────
|
||||||
|
# Must be first real step. Reaching subsequent steps proves it resolves.
|
||||||
|
- name: P-07 checkout (actions/checkout@v4)
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
# ─── P-08: actions/setup-node ────────────────────────────────────────────
|
||||||
|
- name: P-08 setup-node (actions/setup-node@v4 — pin Node 22)
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '22'
|
||||||
|
|
||||||
|
# ─── P-01: Node.js version ───────────────────────────────────────────────
|
||||||
|
- name: P-01 Node.js version
|
||||||
|
run: |
|
||||||
|
echo "=== P-01: Node.js version ==="
|
||||||
|
node --version
|
||||||
|
echo "Expected: v22.x"
|
||||||
|
|
||||||
|
# ─── P-02: pnpm availability ─────────────────────────────────────────────
|
||||||
|
- name: P-02 pnpm availability
|
||||||
|
run: |
|
||||||
|
echo "=== P-02: pnpm availability ==="
|
||||||
|
pnpm --version 2>/dev/null || (
|
||||||
|
echo "pnpm not found — attempting corepack activation"
|
||||||
|
corepack enable pnpm
|
||||||
|
pnpm --version
|
||||||
|
)
|
||||||
|
echo "Expected: pnpm 11.x (from packageManager field in package.json)"
|
||||||
|
|
||||||
|
# ─── P-03: Runner mode — THE critical fork ───────────────────────────────
|
||||||
|
# Docker-executor mode: job runs inside a Docker container
|
||||||
|
# → services: works; DB_HOST=mariadb
|
||||||
|
# Host-executor mode: job runs directly on the Unraid host
|
||||||
|
# → services: not supported; must use docker run -d fallback
|
||||||
|
- name: P-03 runner mode detection (Docker vs host — critical fork)
|
||||||
|
run: |
|
||||||
|
echo "=== P-03: Runner mode (critical fork) ==="
|
||||||
|
echo "--- /proc/1/cgroup (first 5 lines) ---"
|
||||||
|
cat /proc/1/cgroup 2>/dev/null | head -5 || echo "(not readable)"
|
||||||
|
echo "--- hostname ---"
|
||||||
|
hostname
|
||||||
|
echo "--- /.dockerenv presence ---"
|
||||||
|
ls -la /.dockerenv 2>&1
|
||||||
|
echo "--- Conclusion ---"
|
||||||
|
if [ -f /.dockerenv ]; then
|
||||||
|
echo "RUNNER MODE: Docker-executor (job is running inside a Docker container)"
|
||||||
|
echo " → services: will work; MariaDB hostname = service label name (mariadb)"
|
||||||
|
echo " → DB_HOST=mariadb in downstream jobs"
|
||||||
|
else
|
||||||
|
echo "RUNNER MODE: host-executor (job is running directly on the host)"
|
||||||
|
echo " → services: NOT supported (nektos/act#2711)"
|
||||||
|
echo " → Downstream jobs must use: docker run -d mariadb:11 + explicit readiness loop"
|
||||||
|
echo " → DB_HOST=127.0.0.1 with -p 3306:3306 in docker run"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ─── P-04: Docker socket access ──────────────────────────────────────────
|
||||||
|
- name: P-04 Docker socket access
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
echo "=== P-04: Docker socket access ==="
|
||||||
|
docker info 2>&1 | head -20
|
||||||
|
echo "--- docker ps (first few lines) ---"
|
||||||
|
docker ps 2>&1 | head
|
||||||
|
|
||||||
|
# ─── P-05: Service container spawn check ─────────────────────────────────
|
||||||
|
- name: P-05 service container spawn (mariadb:11 visible in docker ps?)
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
echo "=== P-05: Service container spawn ==="
|
||||||
|
docker ps 2>&1 | grep -i maria \
|
||||||
|
&& echo "RESULT: MariaDB service container IS visible in docker ps (Docker-executor mode confirmed)" \
|
||||||
|
|| echo "RESULT: no mariadb container visible in docker ps (likely host-executor mode — services: not supported)"
|
||||||
|
|
||||||
|
# ─── P-06: MariaDB reachability — try BOTH hostnames ─────────────────────
|
||||||
|
# Does NOT fail the job: records which hostname resolves.
|
||||||
|
- name: P-06 MariaDB reachability (hostname=mariadb — Docker mode)
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
echo "=== P-06a: MariaDB via hostname 'mariadb' (Docker-executor mode) ==="
|
||||||
|
mysql -h mariadb -P 3306 -u familysync -ptestpass -e "SELECT 1" 2>&1 | head \
|
||||||
|
&& echo "P-06a RESULT: mariadb hostname RESOLVES — Docker mode" \
|
||||||
|
|| echo "P-06a RESULT: mariadb hostname DOES NOT resolve (expected if host-executor mode)"
|
||||||
|
|
||||||
|
- name: P-06 MariaDB reachability (hostname=127.0.0.1 — host mode)
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
echo "=== P-06b: MariaDB via 127.0.0.1 (host-executor mode fallback) ==="
|
||||||
|
mysql -h 127.0.0.1 -P 3306 -u familysync -ptestpass -e "SELECT 1" 2>&1 | head \
|
||||||
|
&& echo "P-06b RESULT: 127.0.0.1 RESOLVES — host mode" \
|
||||||
|
|| echo "P-06b RESULT: 127.0.0.1 does not resolve (expected if Docker-executor mode uses 'mariadb' hostname)"
|
||||||
|
|
||||||
|
# ─── P-09: actions/cache ─────────────────────────────────────────────────
|
||||||
|
# Known issue: cache server runs in runner container; job container on different
|
||||||
|
# network may cause socket hang-up. continue-on-error so probe reports finding.
|
||||||
|
- name: P-09 cache action (actions/cache@v4 — may time out in Docker mode)
|
||||||
|
uses: actions/cache@v4
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
path: /tmp/probe-cache-test
|
||||||
|
key: runner-probe-cache-test-${{ github.sha }}
|
||||||
|
|
||||||
|
- name: P-09 cache result
|
||||||
|
run: |
|
||||||
|
echo "=== P-09: Cache action result ==="
|
||||||
|
echo "If the previous 'cache' step completed without hanging, cache IS usable."
|
||||||
|
echo "If it timed out or errored, fall back to no-cache in downstream jobs."
|
||||||
|
|
||||||
|
# ─── P-10: Playwright WebKit system deps ────────────────────────────────
|
||||||
|
# Confirms WebKit system deps install without sudo/apt failure (Assumption A10).
|
||||||
|
# Runs from apps/pwa where @playwright/test is installed.
|
||||||
|
- name: P-10 Playwright WebKit + Chromium system deps
|
||||||
|
continue-on-error: true
|
||||||
|
working-directory: apps/pwa
|
||||||
|
run: |
|
||||||
|
echo "=== P-10: Playwright browser system deps (webkit + chromium) ==="
|
||||||
|
npx playwright install --with-deps webkit chromium 2>&1 | tail -30
|
||||||
|
echo "--- Exit code: $? ---"
|
||||||
|
echo "If the above shows installed without 'sudo' or 'apt' errors, WebKit deps are OK."
|
||||||
|
|
||||||
|
# ─── P-11: gitea-upload-artifact fork ───────────────────────────────────
|
||||||
|
# The official upload-artifact action is broken on Gitea (detected as GHES, aborts).
|
||||||
|
# Use ChristopherHX/gitea-upload-artifact@v4 — the confirmed Gitea fix (RESEARCH T-08-SC).
|
||||||
|
- name: P-11 write dummy artifact for upload test
|
||||||
|
run: |
|
||||||
|
echo "=== P-11: Upload artifact test ==="
|
||||||
|
mkdir -p /tmp/probe-artifact
|
||||||
|
echo "runner-probe artifact: sha=${GITHUB_SHA}" > /tmp/probe-artifact/probe.txt
|
||||||
|
cat /tmp/probe-artifact/probe.txt
|
||||||
|
|
||||||
|
- name: P-11 artifact upload (ChristopherHX/gitea-upload-artifact@v4)
|
||||||
|
uses: https://github.com/ChristopherHX/gitea-upload-artifact@v4
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
name: runner-probe-artifact
|
||||||
|
path: /tmp/probe-artifact/
|
||||||
|
retention-days: 3
|
||||||
|
|
||||||
|
# ─── P-13: GITHUB_SHA short SHA expression ───────────────────────────────
|
||||||
|
- name: P-13 short SHA expression (D-04 tag validation)
|
||||||
|
run: |
|
||||||
|
echo "=== P-13: GITHUB_SHA short SHA ==="
|
||||||
|
echo "GITHUB_SHA full = ${GITHUB_SHA}"
|
||||||
|
echo "short sha = ${GITHUB_SHA:0:7}"
|
||||||
|
echo "Expected: a 7-character hex string — confirms D-04 tag expression works"
|
||||||
|
if [ "${#GITHUB_SHA}" -ge 7 ]; then
|
||||||
|
echo "P-13 RESULT: OK — GITHUB_SHA is available and bash substring works"
|
||||||
|
else
|
||||||
|
echo "P-13 RESULT: WARN — GITHUB_SHA is shorter than expected or empty"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ─── SUMMARY: one-line verdict per fork ──────────────────────────────────
|
||||||
|
# Plans 02–04 consume these answers to pick the correct implementation path.
|
||||||
|
- name: SUMMARY — fork verdicts (record answers for SUMMARY.md)
|
||||||
|
run: |
|
||||||
|
echo "========================================================"
|
||||||
|
echo " RUNNER PROBE SUMMARY — FORK ANSWERS"
|
||||||
|
echo "========================================================"
|
||||||
|
echo ""
|
||||||
|
echo "P-03 Runner mode:"
|
||||||
|
if [ -f /.dockerenv ]; then
|
||||||
|
echo " DOCKER-EXECUTOR — job runs in a container"
|
||||||
|
echo " → services: works; DB_HOST=mariadb"
|
||||||
|
else
|
||||||
|
echo " HOST-EXECUTOR — job runs directly on host"
|
||||||
|
echo " → services: NOT supported; use docker run -d + DB_HOST=127.0.0.1"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
echo "P-05/P-06 MariaDB service container:"
|
||||||
|
MARIA_CONTAINER=$(docker ps 2>/dev/null | grep -i maria | head -1 || true)
|
||||||
|
if [ -n "$MARIA_CONTAINER" ]; then
|
||||||
|
echo " Service container IS visible — hostname 'mariadb' should resolve"
|
||||||
|
else
|
||||||
|
echo " Service container NOT visible — use docker run -d fallback"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
echo "P-09 Cache: see 'cache' step result above (continue-on-error — pass = usable)"
|
||||||
|
echo "P-10 WebKit deps: see 'playwright install' step above (continue-on-error)"
|
||||||
|
echo "P-11 Upload artifact: see 'gitea-upload-artifact' step above (continue-on-error)"
|
||||||
|
echo ""
|
||||||
|
echo "P-13 Short SHA: ${GITHUB_SHA:0:7}"
|
||||||
|
echo ""
|
||||||
|
echo " SECURITY CHECK: this probe references NO secrets (T-08-01 compliant)"
|
||||||
|
echo " P-12 (docker login/push) is deferred to Plan 04 — NOT in this probe."
|
||||||
|
echo "========================================================"
|
||||||
Reference in New Issue
Block a user