All checks were successful
Build and Deploy Log Center / build-and-deploy (push) Successful in 2m24s
新增两种日志来源(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>
93 lines
3.0 KiB
Bash
Executable File
93 lines
3.0 KiB
Bash
Executable File
#!/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 失败"
|