#!/bin/bash # report-cicd-error.sh - CI/CD 构建错误上报到 Log Center # # 用法: ./report-cicd-error.sh # # 环境变量 (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 }" 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 失败"