W22: coverage metric + network tests + Tool stream feedback + stdin pipe + session path + dependency check (W22.1-W22.6)
Some checks failed
Some checks failed
- W22.1: gcovr 覆盖率度量 + CI coverage job(40% 阈值 warning) - W22.2: network_plugin 单元测试(parse_headers_json/extract_host_port/SSE/异常保护) - W22.3: Tool Calling 流式反馈(chat_stream + "[工具调用]/[工具结果]" 状态行) - W22.4: --prompt stdin pipe(--prompt - 从 stdin 读取) - W22.5: session 路径健壮化(static 缓存 + mkdir + fallback) - W22.6: 插件依赖拓扑静态校验(validate_dependencies 循环/缺失检测) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
104
.github/workflows/ci.yml
vendored
104
.github/workflows/ci.yml
vendored
@@ -224,3 +224,107 @@ jobs:
|
||||
- name: Test (Sanitizer)
|
||||
shell: bash
|
||||
run: ctest --preset ci-sanitize --output-on-failure
|
||||
|
||||
# ── Coverage (PR + push master, Linux clang-18, gcovr) ──
|
||||
coverage:
|
||||
name: Coverage (gcovr) / ubuntu-24.04
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
# ── 1. 源码检出 ──────────────────────────────────────
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 1
|
||||
|
||||
# ── 2. 工具链 (clang-18) ─────────────────────────────
|
||||
- name: Install toolchain (Ubuntu)
|
||||
run: |
|
||||
sudo apt-get update -qq
|
||||
sudo apt-get install -y -qq clang-18 ninja-build
|
||||
echo "CC=clang-18" >> $GITHUB_ENV
|
||||
echo "CXX=clang++-18" >> $GITHUB_ENV
|
||||
|
||||
# ── 3. Python + Conan ─────────────────────────────────
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: '3.12'
|
||||
|
||||
- name: Install Conan + gcovr
|
||||
run: pip install conan gcovr
|
||||
|
||||
# ── 4. Conan 依赖缓存 ─────────────────────────────────
|
||||
- name: Cache Conan
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.conan2
|
||||
~/.conan2/p
|
||||
key: ${{ runner.os }}-conan-Release-${{ hashFiles('deps/conanfile.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-conan-Release-
|
||||
${{ runner.os }}-conan-
|
||||
|
||||
# ── 5. Conan 依赖安装 ─────────────────────────────────
|
||||
- name: Install Conan dependencies
|
||||
shell: bash
|
||||
run: |
|
||||
conan profile detect --force
|
||||
conan install deps --build=missing -s build_type=Release
|
||||
|
||||
# ── 6. CMake 配置 ─────────────────────────────────────
|
||||
- name: Configure CMake (Coverage)
|
||||
shell: bash
|
||||
run: cmake --preset ci-coverage
|
||||
|
||||
# ── 7. 构建 ───────────────────────────────────────────
|
||||
- name: Build (Coverage)
|
||||
shell: bash
|
||||
run: cmake --build --preset ci-coverage
|
||||
|
||||
# ── 8. 测试 ──────────────────────────────────────────
|
||||
- name: Test (Coverage)
|
||||
shell: bash
|
||||
run: ctest --preset ci-coverage --output-on-failure
|
||||
|
||||
# ── 9. 覆盖率报告 ────────────────────────────────────
|
||||
- name: Coverage report
|
||||
id: coverage
|
||||
shell: bash
|
||||
run: |
|
||||
gcovr -r . --object-directory=build/ci-coverage \
|
||||
--gcov-executable "llvm-cov-18 gcov" \
|
||||
--print-summary > coverage_summary.txt 2>&1 || true
|
||||
cat coverage_summary.txt
|
||||
# Extract line coverage percentage
|
||||
LINE_COV=$(grep -oP 'lines:\s*\K[\d.]+' coverage_summary.txt || echo "0")
|
||||
echo "line_rate=${LINE_COV}" >> $GITHUB_OUTPUT
|
||||
# Also generate HTML report
|
||||
mkdir -p build/ci-coverage/coverage
|
||||
gcovr -r . --object-directory=build/ci-coverage \
|
||||
--gcov-executable "llvm-cov-18 gcov" \
|
||||
--html --html-details \
|
||||
-o build/ci-coverage/coverage/index.html || true
|
||||
echo "HTML report: build/ci-coverage/coverage/index.html"
|
||||
|
||||
# ── 10. 覆盖率摘要 + 阈值门禁 ─────────────────────────
|
||||
- name: Coverage summary
|
||||
if: always()
|
||||
shell: bash
|
||||
run: |
|
||||
LINE_COV="${{ steps.coverage.outputs.line_rate }}"
|
||||
THRESHOLD=40
|
||||
echo "## Coverage Report" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
echo "| Metric | Value | Threshold | Status |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "|--------|-------|-----------|--------|" >> $GITHUB_STEP_SUMMARY
|
||||
if [ -z "$LINE_COV" ] || [ "$LINE_COV" = "0" ]; then
|
||||
echo "| Line Coverage | N/A | ${THRESHOLD}% | :grey_question: (no data) |" >> $GITHUB_STEP_SUMMARY
|
||||
elif awk "BEGIN {exit !($LINE_COV < $THRESHOLD)}"; then
|
||||
echo "| Line Coverage | ${LINE_COV}% | ${THRESHOLD}% | :warning: BELOW THRESHOLD |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "::warning title=Coverage below threshold::Line coverage ${LINE_COV}% is below ${THRESHOLD}% threshold"
|
||||
else
|
||||
echo "| Line Coverage | ${LINE_COV}% | ${THRESHOLD}% | :white_check_mark: OK |" >> $GITHUB_STEP_SUMMARY
|
||||
echo "Line coverage ${LINE_COV}% >= ${THRESHOLD}% threshold - OK"
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user