为什么使用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 版本,以及在项目跟目录下,进行初始化。

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 等结合。

优化

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

总结

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

通过 Nuke 为 Dotnet Core 应用构建自动化流程的更多相关文章

  1. 边缘化搭建 DotNet Core 2.1 自动化构建和部署环境(下)

    写在前面 本篇文章是上一篇边缘化搭建 DotNet Core 2.1 自动化发布和部署(上)的后续操作,本文主要讲解如何开启Docker Remote API,开启Remote API后的权限安全问题 ...

  2. 边缘化搭建 DotNet Core 2.1 自动化构建和部署环境(上)

    写在前面 写这篇文章的缘由是由于笔者的对新兴技术方向有所追求,但个人资产有限,只能容许购买一台阿里云低配1核2G服务器.服务器上搭建了 Centos7 & Docker & Jenki ...

  3. windows jenkins dotnet core 自动化构建webapi

    jenkins环境搭建好 注意一下几点: - 需要安装git - 需要安装dotnet core sdk环境 - 遇到这里报错,提示 Repository URL 错误的话,如果确实没有配置错误,重启 ...

  4. Jenkins 构建自动化 .NET Core 发布镜像

    Jenkins 构建自动化 .NET Core 发布镜像 导读 在本章中,将介绍如何在 Linux 下使用 Docker 部署.启动 Jenkins,编写脚本,自动化构建 .NET Core 应用,最 ...

  5. 本地Docker Jenkins构建dotnet core web应用到Linux服务器 Docker上

    1.准备工作 环境 本地: Windows.Docker 代码仓库:Git 服务器:Linux.Docker 前提准备 创建个有dockerfile文件的dotnet core 3 web项目 新建一 ...

  6. 流程自动化RPA,Power Automate Desktop系列 - DotNet Core打包并发布Nuget Package

    一.背景 DotNet Core通常基于Nuget来实现包管理,如果你想要把自己的实现共享给其他人,通常我们需要把本地项目打包好,然后发布到对应的Nuget Server上,以便于其他人可以查找.安装 ...

  7. Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)

    上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1) 服务器版本 Ubuntu 16.04 LTS. 本 ...

  8. 使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例)

    作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何基于dotnet core(微软.NET的最新版本,支持跨平台,跨设备的应用开发,详情请参考 https ...

  9. 手把手教你用Jenkins自动发布dotnet core程序

    Jenkins部分 首先,我们要有个Jenkins咯,下载链接:https://jenkins.io/download/ 我们安装官网教程安装好jenkins,安装教程略.... 嗯?不是说好手把手么 ...

  10. devOps开发(Web API 实例)dotnet core 和 Azure PaaS服务

    使用 dotnet core 和 Azure PaaS服务进行devOps开发(Web API 实例) 作者:陈希章 发表于 2017年12月19日 引子 这一篇文章将用一个完整的实例,给大家介绍如何 ...

随机推荐

  1. C# 设计模式(一)

    转自:http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html C#设计模式学习笔记-单例模式 最近在学设计模式,学到创建型模式的时候 ...

  2. 反范式设计,冗余用户姓名,修改用户姓名后,业务表同步更新 -- MySQL 存储过程

    反范式设计,冗余用户姓名,通过存储过程进行业务表的同步更新. 所有的表,在创建的时候,都加了创建人.修改人的字段..用户姓名发生变化时,要将所有的表都更新一遍. 创建存储过程 MySQL CREATE ...

  3. Processing多窗口程序范例(二)

    多窗口范例(二),做一个划线生成图像的应用,最后结果: 子窗口划线,主窗口复制多个画布叠加并添加了旋转动画. 范例程序 主程序: package syf.demo.multiwindow2; impo ...

  4. C#弃元表达式的用法

    原文地址:http://cshelloworld.com/home/detail/1803462343674433536 弃元符号是什么 弃元符号在C#中只是一个下划线 _,当程序员不想关注某些变量的 ...

  5. go语言中iota和左移<< 右移<<

    iota 特殊常量 在go语言中iota比较特殊,是一个被编译器修改的常量,在每一个const关键字出现时被重置为0,然后在下一个const出现之前,每出现一次iota,其所代表的数字就会自动加1 p ...

  6. Golang 1.16新特性-embed包及其使用

    embed 是什么 embed是在Go 1.16中新加入的包.它通过//go:embed指令,可以在编译阶段将静态资源文件打包进编译好的程序中,并提供访问这些文件的能力. 为什么需要 embed 包 ...

  7. CompletableFuture API介绍及使用

    1. 介绍 CompletableFuture 是 Java 8 引入的一个用于异步编程的类,位于 java.util.concurrent 包中.它是对 Future 的增强,提供了更强大的功能来支 ...

  8. 基础指令:三剑客之sed、三剑客之awk详解

    目录 4.9 三剑客之sed(查找.替换.删除.插入) 作用: 语法格式: 4.9.1 sed指定行输出 [行数]p 4.9.2 sed模糊搜索 /[字符串]/p 4.9.3 按照区间进行过滤查找 [ ...

  9. AspNetCore MVC 跨域

    通过XMLHttpRequest或者ajax去请求一个AspNetCore API接口服务时,Firefox提示我 已拦截跨源请求:同源策略禁止读取位于 http://localhost:33694/ ...

  10. TensorFlow重新导入restore报错: OP_REQUIRES failed at save_restore_v2_ops.cc:184 : Not found: Key Variable not found in checkpoint

    最近在解决TensorFlow模型重新导入时遇到下面这个问题,发现网上很多解决办法都在误导,其实报错已经很明显说明问题的根源,只是我们不一定找到问题的根源.报错显示 不能在快照中找到 对应的键值. 报 ...