找回密码
 立即注册
首页 业界区 业界 通过 Nuke 为 Dotnet Core 应用构建自动化流程 ...

通过 Nuke 为 Dotnet Core 应用构建自动化流程

仲秀娟 2025-6-2 23:33:52
为什么使用Nuke

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

 
示例场景


  • 为同一个解决方案下的多个Dotnet Core 项目构建dokcer镜像
  • 使用Gitversion的版本策略,生成镜像标签
  • 并推送至镜像仓库
 逻辑比较简单,可以拆分为,通过 gitversion 生成版本号,通过docker build 生成镜像,以及通过docker push 推送镜像。
Nuke 初始化

按需安装Nuke 版本,以及在项目跟目录下,进行初始化。
  1. dotnet tool install Nuke.GlobalTool --global<br>nuke :setup
复制代码
 
调整构建流程

通过 LoginDocker 实现了登录docker镜像仓库;
通过 BuildDockerImages 实现了多个项目的镜像构建,并采用 GitVersion 的 FullSemVer 作为版本号,构建时启用了DOCKER_BUILDKIT;
通过 PushImages 实现了镜像推送;
通过 CleanImages 清除本地镜像;
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Nuke.Common;
  5. using Nuke.Common.ProjectModel;
  6. using Nuke.Common.Tooling;
  7. using Nuke.Common.Tools.Docker;
  8. using Nuke.Common.Tools.GitVersion;
  9. using Serilog;
  10. using static Nuke.Common.IO.FileSystemTasks;
  11. using static Nuke.Common.Tools.Docker.DockerTasks;
  12. class Build : NukeBuild
  13. {
  14.     [GitVersion] readonly GitVersion GitVersion;
  15.     [Solution] readonly Solution Solution;
  16.     [Parameter(Name = "proj")] readonly string ProjectName;
  17.     public Build()
  18.     {
  19.         DockerLogger = (s, e) => Log.Debug(e);
  20.     }
  21.     public static int Main() => Execute<Build>(x => x.RunDockerTasks);
  22.     string RegistryUrl => "registry.mydomain.com";
  23.     string ImagePrefix => $"{RegistryUrl}/products";
  24.     IEnumerable<Project> Projects => Solution.AllProjects.Where(p => p.Name.EndWith("Host"));
  25.     readonly List<string> localImages = new();
  26.     Target LoginDocker => _ => _
  27.         .Executes(() =>
  28.         {
  29.             DockerLogin(_ => _
  30.                 .SetServer(RegistryUrl)
  31.                 .SetUsername("xxx")
  32.                 .SetPassword("xxxxx"));
  33.         });
  34.     Target BuildDockerImages => _ => _
  35.         .Executes(() =>
  36.         {
  37.             foreach (var project in Projects)
  38.             {
  39.                 var tag = $"{ImagePrefix}{project.Name}:{GitVersion.FullSemVer}";
  40.                 localImages.Add(tag);
  41.                 DockerBuild(_ => _
  42.                     .SetProcessEnvironmentVariable("DOCKER_BUILDKIT", "1")
  43.                     .SetPath(“./”)
  44.                     .SetFile(project.Directory / "Dockerfile")
  45.                     .SetTag(tag));
  46.             }
  47.         });
  48.     Target PushImages => _ => _
  49.         .DependsOn(BuildDockerImages)
  50.         .DependsOn(LoginDocker)
  51.         .Executes(() =>
  52.         {
  53.             foreach (var image in localImages)
  54.             {
  55.                 DockerPush(_ =>
  56.                 _.SetName(image));
  57.             }
  58.         });
  59.     Target CleanImages => _ => _
  60.         .DependsOn(PushImages)
  61.         .Executes(() =>
  62.         {
  63.             foreach (var image in localImages)
  64.             {
  65.                 DockerImageRm(s => s
  66.                 .SetImages(image)
  67.                 .SetForce(true));
  68.             }
  69.         });
  70.     Target RunDockerTasks => _ => _
  71.         .DependsOn(CleanImages)
  72.         .Executes(() =>
  73.         {
  74.             Serilog.Log.Information($"{ProjectName} 构建结束");
  75.         });
  76. }
复制代码
调试

本地运行代码,既可以执行以上逻辑,以及调试;非常方便。
调用

通过 执行命令行:dotnet nuke RunDockerTasks 即可执行镜像的构建与推送,可以很方便的与gitlab、github、jenkins 等结合。
2.png

优化


  • 执行以上CI,需要宿主机,安装Dotnet SDK,以实现 Dotnet tools 的安装,以及Docker 客户端的安装;可以考虑使用Docker In Docker的方式,减少对服务器的要求;
  • 默认会对所有的项目进行构建并推送,可以结合 Parameter 的方式,按需指定需构建的项目;
  • 可以使用compose 方式构建,隐藏项目细节;
总结

对于功能不复杂、脚本不熟悉、或者缺少运维的场景下,可以尝试使用。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册