通过 Nuke 为 Dotnet Core 应用构建自动化流程
笔记哥 /
05-12 /
20点赞 /
0评论 /
841阅读
## 为什么使用Nuke
最开始了解Nuke,是浏览github时,刷到了这个项目,看简介可以通过C# 来定义构建任务和流程,这一点很新颖,对我来讲,c# 显然更容易理解和维护。
再看给出的示例,确实比较清晰,简洁。看了下官方文档,也提供了大量第三方CLI的支持,工具支持比较好,也就是可以使用C#方法调用,代替直接使用cli 命令。
还可以与 gitlab jenkins 结合,实现CI、CD,兼容windows 与 linux。
看文档介绍,是不错的,对于缺少运维人员的团队,可以尝试使用。

## 示例场景
1. 为同一个解决方案下的多个Dotnet Core 项目构建dokcer镜像
2. 使用Gitversion的版本策略,生成镜像标签
3. 并推送至镜像仓库
逻辑比较简单,可以拆分为,通过 gitversion 生成版本号,通过docker build 生成镜像,以及通过docker push 推送镜像。
## Nuke 初始化
按需安装Nuke 版本,以及在项目跟目录下,进行初始化。
```csharp
dotnet tool install Nuke.GlobalTool --globalnuke :setup
```
## 调整构建流程
通过 LoginDocker 实现了登录docker镜像仓库;
通过 BuildDockerImages 实现了多个项目的镜像构建,并采用 GitVersion 的 FullSemVer 作为版本号,构建时启用了DOCKER\_BUILDKIT;
通过 PushImages 实现了镜像推送;
通过 CleanImages 清除本地镜像;
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using Nuke.Common;
using Nuke.Common.ProjectModel;
using Nuke.Common.Tooling;
using Nuke.Common.Tools.Docker;
using Nuke.Common.Tools.GitVersion;
using Serilog;
using static Nuke.Common.IO.FileSystemTasks;
using static Nuke.Common.Tools.Docker.DockerTasks;
class Build : NukeBuild
{
[GitVersion] readonly GitVersion GitVersion;
[Solution] readonly Solution Solution;
[Parameter(Name = "proj")] readonly string ProjectName;
public Build()
{
DockerLogger = (s, e) => Log.Debug(e);
}
public static int Main() => Execute(x => x.RunDockerTasks);
string RegistryUrl => "registry.mydomain.com";
string ImagePrefix => $"{RegistryUrl}/products";
IEnumerable Projects => Solution.AllProjects.Where(p => p.Name.EndWith("Host"));
readonly List localImages = new();
Target LoginDocker => _ => _
.Executes(() =>
{
DockerLogin(_ => _
.SetServer(RegistryUrl)
.SetUsername("xxx")
.SetPassword("xxxxx"));
});
Target BuildDockerImages => _ => _
.Executes(() =>
{
foreach (var project in Projects)
{
var tag = $"{ImagePrefix}{project.Name}:{GitVersion.FullSemVer}";
localImages.Add(tag);
DockerBuild(_ => _
.SetProcessEnvironmentVariable("DOCKER_BUILDKIT", "1")
.SetPath(“./”)
.SetFile(project.Directory / "Dockerfile")
.SetTag(tag));
}
});
Target PushImages => _ => _
.DependsOn(BuildDockerImages)
.DependsOn(LoginDocker)
.Executes(() =>
{
foreach (var image in localImages)
{
DockerPush(_ =>
_.SetName(image));
}
});
Target CleanImages => _ => _
.DependsOn(PushImages)
.Executes(() =>
{
foreach (var image in localImages)
{
DockerImageRm(s => s
.SetImages(image)
.SetForce(true));
}
});
Target RunDockerTasks => _ => _
.DependsOn(CleanImages)
.Executes(() =>
{
Serilog.Log.Information($"{ProjectName} 构建结束");
});
}
```
## 调试
本地运行代码,既可以执行以上逻辑,以及调试;非常方便。
## 调用
通过 执行命令行:dotnet nuke RunDockerTasks 即可执行镜像的构建与推送,可以很方便的与gitlab、github、jenkins 等结合。

## 优化
1. 执行以上CI,需要宿主机,安装Dotnet SDK,以实现 Dotnet tools 的安装,以及Docker 客户端的安装;可以考虑使用Docker In Docker的方式,减少对服务器的要求;
2. 默认会对所有的项目进行构建并推送,可以结合 Parameter 的方式,按需指定需构建的项目;
3. 可以使用compose 方式构建,隐藏项目细节;
## 总结
对于功能不复杂、脚本不熟悉、或者缺少运维的场景下,可以尝试使用。
本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/3303
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利
- 相关联分享
- 常用的 Visual Studio 2022 扩展插件推荐:生产力必备工具
- 使用MCP C# SDK开发MCP Server + Client
- EF Core 10 中 LeftJoin 和 RightJoin 运算符在 LINQ 查询中的应用
- 通过 Nuke 为 Dotnet Core 应用构建自动化流程
- .NET 10 Preview 4中ASP.NET Core 改进
- ASP.NET Core 实现的领域驱动设计框架推荐
- 如何把ASP.NET Core WebApi打造成Mcp Server
- C#/.NET/.NET Core技术前沿周刊 | 第 39 期(2025年5.19-5.25)
- dotnet-trace 分析.net程序性能
- C# LINQ 快速入门实战指南,建议收藏学习!
- ASP.NET Core EFCore 属性配置与DbContext 详解