using Dpz.Core.EnumLibrary.Pipeline;

namespace Dpz.Core.Public.Entity.Pipeline;

/// <summary>
/// 构建执行的单个步骤(服务器 x 项目 的一个日志面板)
/// </summary>
public class PipelineStep
{
    /// <summary>
    /// 阶段
    /// </summary>
    [BsonRepresentation(BsonType.String)]
    public PipelineStage Stage { get; set; }

    /// <summary>
    /// 项目(None 表示「总览」,即拉取代码等通用输出)
    /// </summary>
    [BsonRepresentation(BsonType.String)]
    public BuildProject Project { get; set; }

    /// <summary>
    /// 服务器(构建机 Host 或部署服务器别名)
    /// </summary>
    public string? Server { get; set; }

    /// <summary>
    /// 步骤状态
    /// </summary>
    [BsonRepresentation(BsonType.String)]
    public PipelineStatus Status { get; set; }

    /// <summary>
    /// 步骤开始时间
    /// </summary>
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime? StartTime { get; set; }

    /// <summary>
    /// 步骤结束时间
    /// </summary>
    [BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime? EndTime { get; set; }

    /// <summary>
    /// 步骤耗时(毫秒)
    /// </summary>
    public long? DurationMs { get; set; }

    /// <summary>
    /// 步骤失败原因
    /// </summary>
    public string? Error { get; set; }

    /// <summary>
    /// 终端输出行
    /// </summary>
    public List<string> Lines { get; set; } = [];
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码定义了一个与 CI/CD(持续集成/持续部署)流水线执行相关的实体类 PipelineStep,它用于表示流水线中某个具体步骤的执行记录,并且该实体很可能用于 MongoDB 持久化(因为用到了 Bson* 特性)。下面逐一拆解。


1. 命名空间与引用

  • 命名空间:Dpz.Core.Public.Entity.Pipeline
    属于 Dpz.Core 项目中的 Public 实体层,专门服务于流水线(Pipeline)功能。
  • 引用了 Dpz.Core.EnumLibrary.Pipeline,说明该类用到了 PipelineStageBuildProjectPipelineStatus 等枚举类型。

2. 类说明

public class PipelineStep

这个类用于描述构建执行的单个步骤。注释中写得很清楚:

(服务器 x 项目 的一个日志面板)

意思是:一个步骤可以理解为在某个服务器上,针对某个项目执行某阶段任务后产生的日志集合。它通常对应流水线中的一个原子操作,例如拉取代码、编译、部署、测试等。


3. 属性详解

① Stage —— 阶段

[BsonRepresentation(BsonType.String)]
public PipelineStage Stage { get; set; }
  • PipelineStage 是一个枚举,表示当前步骤属于哪个阶段(如检查、构建、部署等)。
  • BsonRepresentation(BsonType.String) 告诉 MongoDB:当存储该枚举时,使用枚举的字符串名称而非数字索引,这样在数据库里更容易阅读和调试。

② Project —— 项目

[BsonRepresentation(BsonType.String)]
public BuildProject Project { get; set; }
  • BuildProject 是一个枚举,代表被构建/部署的具体项目。
  • 注释说:None 表示「总览」,即拉取代码等通用输出
    说明存在一个 None 值,用来表示不针对特定项目,而是整个流水线的通用动作(比如 git pull、环境准备等)。
  • 同样以字符串形式存入 MongoDB。

③ Server —— 服务器

public string? Server { get; set; }
  • 字符串类型,允许 null
  • 注释表示:构建机 Host 或部署服务器别名
    也就是记录这个步骤是在哪台机器上执行的。可能是构建机的地址,也可能是部署目标服务器的名称。

④ Status —— 步骤状态

[BsonRepresentation(BsonType.String)]
public PipelineStatus Status { get; set; }
  • PipelineStatus 是另一个枚举,表示步骤当前状态,例如成功、失败、运行中等。
  • 同样以字符串形式存储。

⑤ StartTime / EndTime —— 开始/结束时间

[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime? StartTime { get; set; }

[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime? EndTime { get; set; }
  • 两个可空的 DateTime,分别记录步骤的开始和结束时间。
  • BsonDateTimeOptions(Kind = DateTimeKind.Local) 指定 MongoDB 在序列化/反序列化时将该时间作为本地时间处理,避免时区混乱。
  • ? 允许为 null,例如尚未结束的步骤 EndTime 就应为空。

⑥ DurationMs —— 耗时

public long? DurationMs { get; set; }
  • long? 可空长整型,单位是毫秒,记录步骤总耗时。
  • 可以由 EndTime - StartTime 计算得出,也可以单独存储以便快速查询。

⑦ Error —— 失败原因

public string? Error { get; set; }
  • 字符串,可为 null
  • 当步骤失败时,这里保存失败的原因或错误信息,便于排查问题。

⑧ Lines —— 终端输出行

public List<string> Lines { get; set; } = [];
  • List<string> 类型,保存该步骤执行过程中输出的日志行(终端文本)。
  • 初始化使用 C# 12 的集合表达式 [],等价于 new List<string>(),简洁且高效。
  • 注释说“终端输出行”,意味着这个列表就是日志面板中逐行显示的内容。

4. 特性(Attribute)补充说明

Bson* 系列特性来自 MongoDB 的 .NET 驱动程序(MongoDB.Bson 命名空间),用于控制实体如何映射到 BSON 文档。

  • [BsonRepresentation(BsonType.String)]:让枚举以字符串存储,提高可读性(例如存 "Success" 而不是 0)。
  • [BsonDateTimeOptions(Kind = DateTimeKind.Local)]:指定时间字段的 DateTimeKind 为本地时间,保证时区信息不丢失。

这些特性让实体既能自然地在 C# 中使用,又能与 MongoDB 的文档结构良好匹配。


5. 整体用途

PipelineStep 很可能是流水线日志模块的核心实体。
每次构建运行会产生多个 PipelineStep,每个步骤记录:

  • 在哪个服务器上
  • 针对哪个项目
  • 处于哪个阶段
  • 运行状态和耗时
  • 输出日志和错误信息

这种设计可以支持前端仪表盘按“服务器 × 项目”分组展示步骤日志,或者按流水线运行 ID 查询某次构建的完整过程。


6. 小结

  • 这是一个 MongoDB 持久化用的实体类,用于描述流水线中的单个执行步骤。
  • 它使用枚举加字符串转换、可空时间、耗时、错误信息和日志行集合,完整覆盖了日志面板所需的数据。
  • 代码简洁,符合现代 C# 风格,使用集合表达式初始化,配合 MongoDB 特性,方便序列化和存储。

如果需要进一步解释某个具体字段如何被写入或读取,或给出使用示例,也可以继续提问。

评论加载中...