diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 70dfa97..bd15d8a 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -84,7 +84,11 @@ jobs: docker start "$CID" >/dev/null # Run build + tests (capture exit code, don't fail the step here so # we can still collect the report on failure) - docker exec "$CID" /src/ci/build-test.sh + docker exec \ + -e GITHUB_RUN_ID="${{ github.run_id }}" \ + -e GITHUB_REPOSITORY="${{ github.repository }}" \ + -e GITHUB_SERVER_URL="${GITEA_SERVER}" \ + "$CID" /src/ci/build-test.sh TEST_RC=$? mkdir -p bin reports docker cp "$CID:/src/bin/pPowerManger" bin/pPowerManger 2>/dev/null || true @@ -116,8 +120,8 @@ jobs: git config user.email "ci@localhost" git checkout --orphan test-reports >/dev/null 2>&1 || git checkout test-reports >/dev/null 2>&1 || true git rm -rf . >/dev/null 2>&1 || true - cp -f reports/test-report.md reports/test-report.html reports/junit.xml . 2>/dev/null || true - git add test-report.md test-report.html junit.xml + cp -f reports/test-report.md reports/junit.xml . 2>/dev/null || true + git add test-report.md junit.xml git commit -m "CI test report ${GITHUB_SHA:-}" >/dev/null 2>&1 || true git push -f origin test-reports >/dev/null 2>&1 || echo "WARN: failed to push test-reports branch" fi diff --git a/README.md b/README.md index 182f83d..9e71ce8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,12 @@ # H100PowerManger -H100 能源管理程序 \ No newline at end of file +H100 能源管理程序 + +[![CI](https://gitea2.zhaojingkui.xyz/zjk/H100PowerManger/actions/workflows/ci.yml/badge.svg)](https://gitea2.zhaojingkui.xyz/zjk/H100PowerManger/actions) + +## 测试报告 + +每次 CI 运行后自动生成测试报告: + +- [最新测试报告 (Markdown)](https://gitea2.zhaojingkui.xyz/zjk/H100PowerManger/src/branch/test-reports/test-report.md) +- [JUnit XML](https://gitea2.zhaojingkui.xyz/zjk/H100PowerManger/raw/branch/test-reports/junit.xml) diff --git a/ci/build-test.sh b/ci/build-test.sh index 8d4747d..45a9ae4 100755 --- a/ci/build-test.sh +++ b/ci/build-test.sh @@ -2,7 +2,7 @@ #======================================================================= # FILE: ci/build-test.sh # DESC: Build the project, run unit tests + a startup smoke test, and -# generate a visual test report (markdown + junit.xml + html). +# generate a visual test report (markdown + junit.xml). # Executed INSIDE the aarch64 build container (ci/Dockerfile). #======================================================================= set -uo pipefail @@ -17,6 +17,12 @@ ARCH="$(uname -m)" COMMIT="$(git -C "${SRC_DIR}" rev-parse --short HEAD 2>/dev/null || echo "${GITHUB_SHA:-unknown}")" BUILD_DATE="$(date -u +'%Y-%m-%d %H:%M:%S UTC')" +# Run link (env vars passed by the workflow via docker exec) +RUN_LINK="" +if [ -n "${GITHUB_SERVER_URL:-}" ] && [ -n "${GITHUB_REPOSITORY:-}" ] && [ -n "${GITHUB_RUN_ID:-}" ]; then + RUN_LINK="${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" +fi + #----------------------------------------------------------------------- # Result trackers #----------------------------------------------------------------------- @@ -117,30 +123,81 @@ EOF fi #----------------------------------------------------------------------- -# 4. Generate visual test report +# 4. Generate visual test report (markdown + junit.xml) #----------------------------------------------------------------------- mark() { [ "$1" = "1" ] && echo "✅ 通过" || echo "❌ 失败"; } ALL_OK=0 [ "${BUILD_OK}" = "1" ] && [ "${SQLITE_OK}" = "1" ] && [ "${SMOKE_OK}" = "1" ] && ALL_OK=1 -# --- Markdown report --- -cat > "${REPORT_DIR}/test-report.md" < "$REPORT" +md() { printf '%s\n' "$*" >> "$REPORT"; } -| 步骤 | 结果 | 耗时 | -| :--- | :--- | :--- | -| 构建 (${ARCH}) | $(mark ${BUILD_OK}) | ${BUILD_TIME}s | -| 单元测试 SQLiteTest | $(mark ${SQLITE_OK}) | ${SQLITE_TIME}s | -| 冒烟测试 MOOSDB+pPowerManger | $(mark ${SMOKE_OK}) | ${SMOKE_TIME}s | +md "## H100PowerManger CI 测试报告" +md "" +md "**总体结论: $([ "${ALL_OK}" = "1" ] && echo "✅ 全部通过" || echo "❌ 存在失败")**" +md "" +md "| 步骤 | 结果 | 耗时 |" +md "| :--- | :--- | :--- |" +md "| 构建 (${ARCH}) | $(mark ${BUILD_OK}) | ${BUILD_TIME}s |" +md "| 单元测试 SQLiteTest | $(mark ${SQLITE_OK}) | ${SQLITE_TIME}s |" +md "| 冒烟测试 MOOSDB+pPowerManger | $(mark ${SMOKE_OK}) | ${SMOKE_TIME}s |" +md "" -**总体结论: $([ "${ALL_OK}" = "1" ] && echo "✅ 全部通过" || echo "❌ 存在失败")** +if [ "${ALL_OK}" != "1" ]; then + md "## 失败详情" + md "" + if [ "${BUILD_OK}" != "1" ]; then + md "### 构建 (${ARCH}) — ❌" + md "" + md '
make.log 末尾' + md "" + md '```text' + tail -30 /tmp/make.log >> "$REPORT" 2>/dev/null || true + md '```' + md '
' + md "" + fi + if [ "${SQLITE_OK}" != "1" ]; then + md "### 单元测试 SQLiteTest — ❌" + md "" + md '
SQLiteTest 输出末尾' + md "" + md '```text' + tail -30 /tmp/sqlitetest.log >> "$REPORT" 2>/dev/null || true + md '```' + md '
' + md "" + fi + if [ "${SMOKE_OK}" != "1" ]; then + md "### 冒烟测试 MOOSDB+pPowerManger — ❌" + md "" + md '
pPowerManger 日志末尾' + md "" + md '```text' + tail -20 /tmp/pm_smoke.log >> "$REPORT" 2>/dev/null || true + md '```' + md '' + md '
MOOSDB 日志末尾' + md "" + md '```text' + tail -10 /tmp/moosdb_smoke.log >> "$REPORT" 2>/dev/null || true + md '```' + md '
' + md "" + fi +fi -- 架构: \`${ARCH}\` -- Commit: \`${COMMIT}\` -- 时间: ${BUILD_DATE} -EOF +md "---" +md "" +md "- 架构: \`${ARCH}\`" +md "- Commit: \`${COMMIT}\`" +md "- 时间: ${BUILD_DATE}" +if [ -n "${RUN_LINK}" ]; then + md "- 运行: [${RUN_LINK}](${RUN_LINK})" +fi -# --- JUnit XML report (for Gitea test-report rendering) --- +# --- JUnit XML report --- cat > "${REPORT_DIR}/junit.xml" < @@ -158,37 +215,6 @@ cat > "${REPORT_DIR}/junit.xml" < EOF -# --- Self-contained HTML report --- -status_html() { - [ "$1" = "1" ] && echo '✔ PASS' \ - || echo '✖ FAIL' -} -cat > "${REPORT_DIR}/test-report.html" < -H100PowerManger 测试报告 - -

H100PowerManger CI 测试报告

-

架构 ${ARCH} · Commit ${COMMIT} · ${BUILD_DATE}

-

$([ "${ALL_OK}" = "1" ] && echo '全部通过' || echo '存在失败')

- - - - - -
步骤结果耗时
构建 (${ARCH})$(status_html ${BUILD_OK})${BUILD_TIME}s
单元测试 SQLiteTest$(status_html ${SQLITE_OK})${SQLITE_TIME}s
冒烟测试 MOOSDB+pPowerManger$(status_html ${SMOKE_OK})${SMOKE_TIME}s
- -EOF - echo ">>> Reports generated in ${REPORT_DIR}:" ls -la "${REPORT_DIR}"