using System.Text.Json.Serialization;
using Dpz.Core.EnumLibrary;
using Dpz.Core.Public.ViewModel;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Mvc.ModelBinding;

namespace Dpz.Core.Web.Jobs.Hangfire.Build;

/// <summary>
/// 远程连接的SSH服务器
/// </summary>
/// <param name="Host">host</param>
/// <param name="Port">端口</param>
/// <param name="Username">用户名</param>
/// <param name="Password">密码</param>
public record SshServer(string Host, int Port, string Username, string Password);

/// <summary>
/// 编译、构建服务器
/// </summary>
/// <param name="Host">host</param>
/// <param name="Port">端口</param>
/// <param name="Username">用户名</param>
/// <param name="Password">密码</param>
/// <param name="Workspace">工作目录</param>
[UsedImplicitly]
public record SshBuildServer(
    string Host,
    int Port,
    string Username,
    string Password,
    string Workspace
) : SshServer(Host, Port, Username, Password);

/// <summary>
/// 部署服务器
/// </summary>
/// <param name="Host">host</param>
/// <param name="Port">端口</param>
/// <param name="Username">用户名</param>
/// <param name="Password">密码</param>
/// <param name="Project">需要部署的项目</param>
[UsedImplicitly]
public record SshDeploymentServer(
    string Host,
    int Port,
    string Username,
    string Password,
    BuildProject Project
) : SshServer(Host, Port, Username, Password);

/// <summary>
/// SSH配置项
/// </summary>
/// <param name="Build"></param>
/// <param name="Servers"></param>
[UsedImplicitly]
public record SshConfiguration(
    SshBuildServer Build,
    string Registry,
    Dictionary<string, SshDeploymentServer> Servers
);

public class BuildOption
{
    public BuildProject Project { get; set; } =
        BuildProject.DpzCore | BuildProject.DpzWebApi | BuildProject.DpzCoreAuth;

    public string? Tag { get; set; }
}

/// <summary>
/// 即将发布版本与线上运行版本一致的项目
/// </summary>
public class PipelineVersionMatch
{
    public required BuildProject Project { get; init; }

    public required string Host { get; init; }

    public required string LiveVersion { get; init; }

    public required string PublishVersion { get; init; }
}

/// <summary>
/// 构建消息
/// </summary>
/// <param name="RunId">运行构建的ID</param>
/// <param name="Server">服务器名称</param>
/// <param name="Project">构建的项目</param>
/// <param name="Message">SSH终端输出的内容</param>
public record BuildMessage(string RunId, string Server, BuildProject Project, string Message);
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码定义了一组用于远程 SSH 构建/部署场景的数据模型,通常配合 Hangfire 后台任务使用。下面按类型逐一说明其用途和关系。


1. 基础模型:SshServer

public record SshServer(string Host, int Port, string Username, string Password);
  • 一个不可变的 record,表示一台远程 SSH 服务器的基础连接信息。
  • 参数分别是主机地址、端口、用户名、密码。
  • 后续的构建服务器和部署服务器都继承自它。

2. 构建服务器:SshBuildServer

public record SshBuildServer(
    string Host, int Port, string Username, string Password, string Workspace
) : SshServer(Host, Port, Username, Password);
  • 继承自 SshServer,额外增加了 Workspace(工作目录)。
  • 表示一台专门用于编译/构建的服务器,构建前会进入该工作目录执行命令。

3. 部署服务器:SshDeploymentServer

public record SshDeploymentServer(
    string Host, int Port, string Username, string Password, BuildProject Project
) : SshServer(Host, Port, Username, Password);
  • 同样继承自 SshServer,额外包含 ProjectBuildProject 枚举),指明这台服务器负责部署哪个项目。
  • 用于部署场景:将构建产物发布到远程机器的指定项目中。

4. 整体配置:SshConfiguration

public record SshConfiguration(
    SshBuildServer Build,
    string Registry,
    Dictionary<string, SshDeploymentServer> Servers
);
  • 汇总所有 SSH 相关配置:
    • Build:唯一的构建服务器。
    • Registry:可能指 Docker Registry 或版本仓库地址。
    • Servers:一个字典,键为服务器名称(字符串),值为对应的 SshDeploymentServer 部署服务器。
  • 这类结构便于在配置文件中定义多台部署服务器,并按名称索引。

5. 构建选项:BuildOption

public class BuildOption
{
    public BuildProject Project { get; set; } =
        BuildProject.DpzCore | BuildProject.DpzWebApi | BuildProject.DpzCoreAuth;

    public string? Tag { get; set; }
}
  • 一个可变的配置类,用于指定一次构建要构建哪些项目以及版本标签。
  • ProjectBuildProject 枚举,支持位组合,默认构建三个项目。
  • Tag 是可选的版本标签(如 v1.0.0)。

6. 版本匹配检测:PipelineVersionMatch

public class PipelineVersionMatch
{
    public required BuildProject Project { get; init; }
    public required string Host { get; init; }
    public required string LiveVersion { get; init; }
    public required string PublishVersion { get; init; }
}
  • 用于记录“待发布版本”和“线上运行版本”一致的项目。
  • 属性:
    • Project:项目名(枚举)。
    • Host:服务器地址。
    • LiveVersion:线上当前运行的版本。
    • PublishVersion:本次要发布的版本。
  • required 关键字,强制要求初始化,防止遗漏。

7. 构建消息:BuildMessage

public record BuildMessage(string RunId, string Server, BuildProject Project, string Message);
  • 表示一条构建过程产生的日志/消息。
  • 包含:
    • RunId:一次构建运行的唯一标识。
    • Server:产生消息的服务器名称。
    • Project:当前构建的项目。
    • Message:具体输出内容(如 SSH 终端输出)。

整体设计意图

这些类型共同构成了一个远程构建与部署流水线的数据层:

  • 使用 SshServer 及其派生类型封装 SSH 连接信息。
  • SshConfiguration 承载所有环境配置(构建服务器 + 部署服务器 + 镜像仓库)。
  • BuildOption 控制构建范围,PipelineVersionMatch 用于发布前版本核对,BuildMessage 用于在后台任务中传递构建日志。

整体上,代码结构清晰,利用 record 的不可变性和模式匹配,适合在 Hangfire 后台任务中传递配置和状态数据。

评论加载中...