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,额外包含Project(BuildProject枚举),指明这台服务器负责部署哪个项目。 - 用于部署场景:将构建产物发布到远程机器的指定项目中。
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; }
}
- 一个可变的配置类,用于指定一次构建要构建哪些项目以及版本标签。
Project是BuildProject枚举,支持位组合,默认构建三个项目。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 后台任务中传递配置和状态数据。
AI 正在分析代码…
评论加载中...