Files
ProjectAGiPrompt/8-CMII-RMDC/2-rmdc-jenkins-dac/9-JenkinsBuild-流程图.md
2026-01-21 16:15:49 +08:00

5.8 KiB
Raw Permalink Blame History

Jenkins Build Flow - 构建流程图

此文档描述了完整的Jenkins构建触发、状态轮询、数据库持久化以及前端状态展示流程。

构建任务完整流程

sequenceDiagram
    participant FE as Frontend
    participant BE as Backend (Handler)
    participant SVC as Service
    participant DB as Database
    participant JK as Jenkins
    participant BT as BuildTracker
    
    Note over FE,BT: 1. 触发构建
    FE->>BE: POST /build/trigger
    BE->>SVC: TriggerBuild()
    SVC->>JK: TriggerBuildInOrg()
    JK-->>SVC: Success
    SVC->>JK: GetBranchBuildsInOrg() (get build number)
    SVC->>DB: SaveBuild (is_building=true)
    SVC->>BT: TrackBuild(estimatedDuration + 20s)
    SVC-->>FE: Build Number
    
    Note over FE,BT: 2. 跳转构建详情页
    FE->>FE: 显示JenkinsBuildStatusCard
    FE->>BE: GET /builds/details
    BE->>SVC: GetBuildDetails()
    SVC->>DB: GetBuildByNumber()
    SVC->>JK: GetBuildDetailsInOrg()
    SVC->>BT: UpdateQueryTime()
    alt 构建已完成/失败
        SVC->>JK: GetBuildArtifactDockerImage() (仅SUCCESS)
        BT->>DB: UpdateBuild (async)
        BT->>BT: RemoveTask
    end
    SVC-->>FE: Build Details
    
    Note over FE,BT: 3. 前端等待轮询
    FE->>FE: 计算 waitTime = estimatedDuration - elapsed - 20s
    FE->>FE: JenkinsBuildStatusCard显示倒计时
    
    Note over FE,BT: 4. 开始轮询
    loop 每3秒 (直到超时或完成)
        FE->>FE: 检查超时 (elapsed > estimated + 30s?)
        alt 超时
            FE->>FE: 停止轮询
        else 未超时
            FE->>BE: GET /builds/details
            BE->>SVC: GetBuildDetails()
            alt 构建完成/失败
                SVC->>DB: Update (async)
                SVC->>BT: Remove from tracker
                SVC-->>FE: result != ""
                FE->>FE: 停止轮询更新UI
            else 仍在构建
                SVC-->>FE: is_building=true
                FE->>FE: 更新燃尽进度条
            end
        end
    end
    
    Note over FE,BT: 5. 后台超时检查
    BT->>BT: checkBuildTimeouts() (每10秒)
    alt 超时 (estimatedDuration + 20s)
        BT->>JK: GetBuildDetailsInOrg()
        BT->>DB: UpdateBuild
        BT->>BT: RemoveTask
    end

关键流程说明

1. 触发构建 (TriggerBuild)

  1. 前端调用 POST /build/trigger 触发构建
  2. 后端调用 Jenkins API 触发构建
  3. 等待1秒后查询最新构建号
  4. 将构建初始信息保存到 jenkins_builds 表 (is_building=true)
  5. 启动 BuildTracker 追踪此构建任务

2. 构建详情查询 (GetBuildDetails)

  1. 前端调用 GET /builds/details 获取构建详情
  2. 后端优先从数据库获取已有信息(DCU相关)
  3. 调用 Jenkins API 获取最新状态
  4. 仅当构建成功时才查询 ArtifactDockerImage避免不必要的日志解析
  5. 通知 BuildTracker 更新查询时间
  6. 如果构建已完成异步更新数据库并从Tracker移除

3. 前端轮询策略

等待时间算法:

waitTime = max(0, estimatedDuration - (currentTime - buildStartTime) - 20000ms)
  • 考虑用户刷新页面的情况,使用已经过的时间计算剩余等待时间
  • 提前20秒开始轮询确保及时获取最终状态

超时停止:

if (currentTime - buildStartTime > estimatedDuration + 30000ms) {
    停止轮询
}

4. 后端超时保障

  • BuildTracker 每10秒检查一次超时任务
  • 超时时间 = estimatedDuration + 20秒
  • 超时后主动查询Jenkins并更新数据库
  • 确保即使前端未轮询,构建状态也能被正确记录

JenkinsBuildStatusCard 组件

功能说明

位于 BuildDetails.vue产物信息卡片和DCU状态卡片之间用于展示Jenkins构建进度。

显示状态

状态 说明
等待查询 构建刚启动,显示轮询倒计时
构建中 显示燃尽进度条和实时duration
超时运行中 构建时间已超过预估
成功/失败 构建完成,显示最终状态

燃尽进度条算法

flowchart TD
    A[开始] --> B{duration >= estimatedDuration?}
    B -->|No| C{duration >= estimatedDuration - 20s?}
    B -->|Yes| D{duration >= estimatedDuration + 20s?}
    
    C -->|No| E[绿色进度条 = 0%<br/>显示'等待中...']
    C -->|Yes| F[绿色燃尽<br/>显示'预计完成 Xs']
    
    D -->|No| G[红色增长<br/>显示'已超时 Xs']
    D -->|Yes| H[红色 100%<br/>停止增长]

进度条计算公式:

  1. 等待阶段 (duration < estimated - 20s):

    • 颜色: 绿色
    • 进度: 0%
    • 文本: "等待中..."
  2. 燃尽阶段 (estimated - 20s <= duration < estimated):

    • 颜色: 绿色
    • 进度: 100 - (estimated - duration) / 20s * 100
    • 文本: "预计完成 Xs"
  3. 超时阶段 (estimated <= duration < estimated + 20s):

    • 颜色: 红色
    • 进度: (duration - estimated) / 20s * 100
    • 文本: "已超时 Xs"
  4. 停止阶段 (duration >= estimated + 20s):

    • 颜色: 红色
    • 进度: 100%
    • 持续更新duration显示

Duration 实时计算

注意: Jenkins在构建进行中时返回 duration: 0只有构建完成后才返回真实duration。

解决方案: 在组件中实时计算:

realTimeDuration = Date.now() - new Date(build.timestamp).getTime()

使用 setInterval 每秒更新 now 值,驱动 realTimeDuration 计算属性更新。


相关文件

文件 作用
build_tracker.go 后端构建状态追踪,超时检测
jenkins_service.go GetBuildDetails异步DB更新
UserDashboard.vue 用户端轮询逻辑
ProjectsManagement.vue 管理端轮询逻辑
BuildDetails.vue 构建详情页,集成状态卡片
JenkinsBuildStatusCard.vue 构建状态展示组件