diff --git a/.gitea/workflows/cd.yaml b/.gitea/workflows/cd.yaml
index 3e59db2a..335811d1 100644
--- a/.gitea/workflows/cd.yaml
+++ b/.gitea/workflows/cd.yaml
@@ -39,13 +39,15 @@ env:
OTEL_EXPORTER_OTLP_ENDPOINT: http://192.168.0.188:24318
OTEL_SERVICE_NAME: awoooi-cd
OTEL_RESOURCE_ATTRIBUTES: service.version=${{ github.sha }},deployment.environment=production
+ CI_IMAGE: 192.168.0.110:5000/awoooi/ci-runner:act-22.04
jobs:
tests:
- # 2026-04-02 ogt: Gitea runner label 是 ubuntu-latest (非 GitHub 的 self-hosted)
- # ADR-039 鐵律: 使用自建 runner,但 Gitea label matching 不同於 GitHub
+ # 2026-04-30 Codex: run the tests job on the host runner and launch the
+ # CI image explicitly. The act-managed job container can disappear mid-test
+ # with Docker RWLayer=nil on the shared 110 daemon.
timeout-minutes: 30
- runs-on: ubuntu-latest
+ runs-on: awoooi-host
# 2026-04-10 ogt: B5 改用 docker run 本地啟動,移除 services: 宣告
# Gitea act runner 的 services: container name 為空,導致 CI 失敗
steps:
@@ -69,8 +71,9 @@ jobs:
COMMIT_ESC=$(echo "$COMMIT_MSG" | sed 's/&/\&/g; s/\</g; s/>/\>/g')
MSG=$(printf '🚀 AWOOOI 部署開始\n├ 📝 %s\n├ 🔖 %s\n└ 👤 %s' "${COMMIT_ESC}" "${SHORT_SHA}" "${ACTOR}")
curl -fS -X POST "https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage" \
- -H "Content-Type: application/json" \
- -d "$(jq -n --arg c "${{ secrets.TELEGRAM_CHAT_ID }}" --arg t "$MSG" '{chat_id:$c,text:$t,parse_mode:"HTML"}')"
+ -d "chat_id=${{ secrets.TELEGRAM_CHAT_ID }}" \
+ -d "parse_mode=HTML" \
+ --data-urlencode "text=${MSG}"
@@ -79,6 +82,7 @@ jobs:
# pyproject.toml hash 變才重裝,其餘直接 activate (節省 ~6-7 min)
- name: Run API Tests
run: |
+ cat > /tmp/awoooi-api-tests.sh <<'CI_SCRIPT'
VENV=/opt/api-venv
HASH_FILE=/opt/api-venv/.deps_hash
CURRENT_HASH=$(md5sum apps/api/pyproject.toml | awk '{print $1}')
@@ -141,6 +145,14 @@ jobs:
2>&1 | tee /tmp/pytest-output.txt; PYTEST_EXIT=${PIPESTATUS[0]}
tail -60 /tmp/pytest-output.txt
exit $PYTEST_EXIT
+ CI_SCRIPT
+ docker run --rm \
+ -v "$PWD:/workspace" \
+ -v /tmp/awoooi-api-tests.sh:/tmp/awoooi-api-tests.sh:ro \
+ -v awoooi-api-venv-cache:/opt/api-venv \
+ -w /workspace \
+ "${{ env.CI_IMAGE }}" \
+ bash /tmp/awoooi-api-tests.sh
# ── 整合測試 B5 (2026-04-10) ──────────────────────────────────────────
# B5 整合測試 — postgres-test 由 services: 提供,localhost:15432 直連
@@ -155,6 +167,7 @@ jobs:
# 修法: 把 pg-test-b5 加入 act task 的 network,用 container name 連線
- name: Integration Tests (B5 — 真實 DB)
run: |
+ cat > /tmp/awoooi-b5-tests.sh <<'CI_SCRIPT'
cd apps/api
# 安裝 psql client
if ! command -v psql &>/dev/null; then
@@ -195,6 +208,15 @@ jobs:
/opt/api-venv/bin/pytest tests/integration/test_b5_core_flows.py -v --tb=short -m integration
# 清理
docker rm -f pg-test-b5 || true
+ CI_SCRIPT
+ docker run --rm \
+ -v "$PWD:/workspace" \
+ -v /tmp/awoooi-b5-tests.sh:/tmp/awoooi-b5-tests.sh:ro \
+ -v /var/run/docker.sock:/var/run/docker.sock \
+ -v awoooi-api-venv-cache:/opt/api-venv \
+ -w /workspace \
+ "${{ env.CI_IMAGE }}" \
+ bash /tmp/awoooi-b5-tests.sh
- name: Notify Pipeline Failure
# 2026-04-30 Codex: tests job failure notifier; no jq dependency for host parity.