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

示例场景
- 为同一个解决方案下的多个Dotnet Core 项目构建dokcer镜像
- 使用Gitversion的版本策略,生成镜像标签
- 并推送至镜像仓库
逻辑比较简单,可以拆分为,通过 gitversion 生成版本号,通过docker build 生成镜像,以及通过docker push 推送镜像。
Nuke 初始化
按需安装Nuke 版本,以及在项目跟目录下,进行初始化。
dotnet tool install Nuke.GlobalTool --global
nuke :setup
调整构建流程
通过 LoginDocker 实现了登录docker镜像仓库;
通过 BuildDockerImages 实现了多个项目的镜像构建,并采用 GitVersion 的 FullSemVer 作为版本号,构建时启用了DOCKER_BUILDKIT;
通过 PushImages 实现了镜像推送;
通过 CleanImages 清除本地镜像;
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<Build>(x => x.RunDockerTasks);
string RegistryUrl => "registry.mydomain.com";
string ImagePrefix => $"{RegistryUrl}/products"; IEnumerable<Project> Projects => Solution.AllProjects.Where(p => p.Name.EndWith("Host")); readonly List<string> 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 等结合。

优化
- 执行以上CI,需要宿主机,安装Dotnet SDK,以实现 Dotnet tools 的安装,以及Docker 客户端的安装;可以考虑使用Docker In Docker的方式,减少对服务器的要求;
- 默认会对所有的项目进行构建并推送,可以结合 Parameter 的方式,按需指定需构建的项目;
- 可以使用compose 方式构建,隐藏项目细节;
总结
对于功能不复杂、脚本不熟悉、或者缺少运维的场景下,可以尝试使用。
通过 Nuke 为 Dotnet Core 应用构建自动化流程的更多相关文章
- 边缘化搭建 DotNet Core 2.1 自动化构建和部署环境(下)
写在前面 本篇文章是上一篇边缘化搭建 DotNet Core 2.1 自动化发布和部署(上)的后续操作,本文主要讲解如何开启Docker Remote API,开启Remote API后的权限安全问题 ...
- 边缘化搭建 DotNet Core 2.1 自动化构建和部署环境(上)
写在前面 写这篇文章的缘由是由于笔者的对新兴技术方向有所追求,但个人资产有限,只能容许购买一台阿里云低配1核2G服务器.服务器上搭建了 Centos7 & Docker & Jenki ...
- windows jenkins dotnet core 自动化构建webapi
jenkins环境搭建好 注意一下几点: - 需要安装git - 需要安装dotnet core sdk环境 - 遇到这里报错,提示 Repository URL 错误的话,如果确实没有配置错误,重启 ...
- Jenkins 构建自动化 .NET Core 发布镜像
Jenkins 构建自动化 .NET Core 发布镜像 导读 在本章中,将介绍如何在 Linux 下使用 Docker 部署.启动 Jenkins,编写脚本,自动化构建 .NET Core 应用,最 ...
- 本地Docker Jenkins构建dotnet core web应用到Linux服务器 Docker上
1.准备工作 环境 本地: Windows.Docker 代码仓库:Git 服务器:Linux.Docker 前提准备 创建个有dockerfile文件的dotnet core 3 web项目 新建一 ...
- 流程自动化RPA,Power Automate Desktop系列 - DotNet Core打包并发布Nuget Package
一.背景 DotNet Core通常基于Nuget来实现包管理,如果你想要把自己的实现共享给其他人,通常我们需要把本地项目打包好,然后发布到对应的Nuget Server上,以便于其他人可以查找.安装 ...
- Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)
上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1) 服务器版本 Ubuntu 16.04 LTS. 本 ...
- 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)
作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何基于dotnet core(微软.NET的最新版本,支持跨平台,跨设备的应用开发,详情请参考 https ...
- 手把手教你用Jenkins自动发布dotnet core程序
Jenkins部分 首先,我们要有个Jenkins咯,下载链接:https://jenkins.io/download/ 我们安装官网教程安装好jenkins,安装教程略.... 嗯?不是说好手把手么 ...
- devOps开发(Web API 实例)dotnet core 和 Azure PaaS服务
使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例) 作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何 ...
随机推荐
- 使用Appflowy+AppflowyCloud搭建自己的笔记系统(个人知识库)-开篇
为什么需要自己的知识库(笔记)系统? 首先,第一点是数据隐私的担忧.因为个人笔记中包含很多内容,比如图片.代码.个人想法,甚至账号信息.我希望这些内容能部署在自己的电脑或自己的数据中心,这样数据就不容 ...
- warning C291: not every exit path returns a value 在switch分支中使用return
switch(data) { case 1: ...
- vue+elementui怎样点击table中的单元格触发事件--弹框
可以先看一下官网中table的自定义列模板代码 <template> <el-table :data="tableData" border s ...
- 万字调研——AI生成内容检测
数据集 TweepFake 地址 摘要:深度伪造(deepfakes).合成或篡改媒体的威胁正变得越来越令人担忧,尤其是对于那些已经被指控操纵公众舆论的社交媒体平台而言.即使是最简单的文本生成技术(例 ...
- 使用cy7c68013调试mt9v011 ov7670 摄像头测试 icamera视频采集调试
使用cy7c68013调试mt9v011 ov7670 摄像头测试 icamera视频采集调试 采集底板选用cp601d,原理图参考icamera设计,使用cy7c68013a芯片设计,固件刷ic ...
- win7系统安装mysql新建数据库/数据表及故障处理,安装mysql后net start mysql服务无法启动
问题描述:win7系统安装mysql,安装mysql后net start mysql服务无法启动 1.下载mysql: 官网地址:https://dev.mysql.com/downloads/mys ...
- C# 之委托的多播
1 delegate void NumberCalculator(int a); 2 class Program 3 { 4 static int num1 = 100; 5 static void ...
- Gits-命令
Git基础命令 Git是一个分布式版本控制系统,由Linus Torvalds创建,用于有效.高速地处理从小到大的项目版本管理.以下是一些基本的Git命令和概念,它们对于使用Git进行版本控制至关重要 ...
- redmine 用户没有状态内容
- 【P2】MARS使用/MIPS汇编
课上 T1 在n位数中删除N个数使剩下的(n-N)位数最大 写得似乎过于谨慎而慢了,没出现寄存器打错的问题,一遍过了 T2 拆分数字 将输入整数N拆分为几个数相加的形式,按拆分项数降序排列,每项按数字 ...