log-center/scripts/report-cicd-error.sh
zyc 0d4b2d634c
All checks were successful
Build and Deploy Log Center / build-and-deploy (push) Successful in 2m24s
feat: 扩展日志收集,支持 CI/CD 构建错误和 K8s 部署错误
新增两种日志来源(cicd / deployment),使日志中台覆盖"构建→部署→运行"全链路:

后端变更:
- models.py: 新增 LogSource 枚举和 source 字段,file_path/line_number 改为可选
- main.py: 按来源生成不同指纹策略,所有查询端点支持 source 筛选,仪表盘新增来源分布统计
- database.py: 新增 4 条迁移 SQL(source 字段、索引、字段可空)
- task_manager.py: 修复 Agent 仅拉取 runtime 来源的缺陷

新增组件:
- k8s-monitor/: K8s Pod 健康监控脚本(Python),每 5 分钟检测异常 Pod 并上报
- k8s/monitor-cronjob.yaml: CronJob + RBAC 部署清单
- scripts/report-cicd-error.sh: CI/CD 错误上报 Bash 脚本
- scripts/gitea-actions-example.yaml: Gitea Actions 集成示例

前端变更:
- api.ts: 类型定义更新,支持 source 字段
- BugList.tsx: 新增来源筛选标签页和来源列
- BugDetail.tsx: 按来源条件渲染(CI/CD 信息、部署信息),非 runtime 禁用修复按钮
- Dashboard.tsx: 新增来源分布表格
- index.css: 来源标签样式(source-badge)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 10:20:16 +08:00

93 lines
3.0 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# report-cicd-error.sh - CI/CD 构建错误上报到 Log Center
#
# 用法: ./report-cicd-error.sh <project_id> <step_name> <error_message_or_file>
#
# 环境变量 (Gitea Actions 自动设置):
# LOG_CENTER_URL - Log Center API 地址
# GITHUB_WORKFLOW - 工作流名称
# GITHUB_JOB - Job 名称
# GITHUB_RUN_ID - 运行 ID
# GITHUB_REF_NAME - 分支名
# GITHUB_SHA - Commit SHA
# GITHUB_SERVER_URL - Gitea 地址
# GITHUB_REPOSITORY - 仓库名
set -euo pipefail
PROJECT_ID="${1:?用法: $0 <project_id> <step_name> <error_message_or_file>}"
STEP_NAME="${2:?缺少 step_name}"
ERROR_INPUT="${3:?缺少错误消息或日志文件路径}"
LOG_CENTER_URL="${LOG_CENTER_URL:-https://qiyuan-log-center-api.airlabs.art}"
# 读取错误信息:文件或字符串
if [ -f "$ERROR_INPUT" ]; then
ERROR_MSG=$(tail -100 "$ERROR_INPUT")
else
ERROR_MSG="$ERROR_INPUT"
fi
# 首行作为错误消息,其余作为堆栈
FIRST_LINE=$(echo "$ERROR_MSG" | head -1)
STACK_TRACE=$(echo "$ERROR_MSG" | jq -Rs 'split("\n") | map(select(length > 0))')
# 根据 step 名称推断错误类型
case "$STEP_NAME" in
*docker*|*Docker*|*Build*Image*) ERROR_TYPE="DockerBuildError" ;;
*npm*|*yarn*|*pnpm*) ERROR_TYPE="NpmBuildError" ;;
*test*|*Test*) ERROR_TYPE="TestFailure" ;;
*lint*|*Lint*) ERROR_TYPE="LintError" ;;
*deploy*|*Deploy*) ERROR_TYPE="DeployError" ;;
*) ERROR_TYPE="CIBuildError" ;;
esac
# 构建 JSON
PAYLOAD=$(jq -n \
--arg project_id "$PROJECT_ID" \
--arg env "cicd" \
--arg level "ERROR" \
--arg source "cicd" \
--arg error_type "$ERROR_TYPE" \
--arg error_message "$FIRST_LINE" \
--argjson stack_trace "$STACK_TRACE" \
--arg commit_hash "${GITHUB_SHA:-unknown}" \
--arg workflow "${GITHUB_WORKFLOW:-unknown}" \
--arg job "${GITHUB_JOB:-unknown}" \
--arg step "$STEP_NAME" \
--arg run_id "${GITHUB_RUN_ID:-0}" \
--arg branch "${GITHUB_REF_NAME:-unknown}" \
--arg repo "${GITHUB_REPOSITORY:-unknown}" \
--arg server_url "${GITHUB_SERVER_URL:-}" \
'{
project_id: $project_id,
environment: $env,
level: $level,
source: $source,
commit_hash: $commit_hash,
error: {
type: $error_type,
message: $error_message,
file_path: null,
line_number: null,
stack_trace: $stack_trace
},
context: {
workflow_name: $workflow,
job_name: $job,
step_name: $step,
run_id: $run_id,
branch: $branch,
repository: $repo,
run_url: "\($server_url)/\($repo)/actions/runs/\($run_id)"
}
}')
# 发送到 Log Center失败静默不影响流水线
curl -s -X POST "${LOG_CENTER_URL}/api/v1/logs/report" \
-H "Content-Type: application/json" \
-d "$PAYLOAD" \
--connect-timeout 5 \
--max-time 10 \
|| echo "Warning: 上报 Log Center 失败"