为什么使用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. __I、 __O 、__IO是什么意思?volatile,const 怎么用?

    原文:https://blog.csdn.net/qq_27312943/article/details/51273064 __I. __O .__IO是什么意思? 这是ST库里面的宏定义,定义如下: ...

  2. Android app:回调方式实现Service向activity传递数据

    一.开启服务的时候,如果我们是通过bindService来绑定服务并且要向服务传递数据,可以直接在Intent中设置bundle来达到效果,但是如果是我们需要从服务中返回一些数据到Activity中的 ...

  3. autMan奥特曼机器人-自建autMan插件市场

    一.自建市场配置 配置参数 二.上架设置 设置哪些插件上架,哪些不上架 三.检测是否成功 怎样检查是否成功了?订阅一下自己,然后看应用市场上是否显示 四.用户怎样购买插件 用户想买自建市场作者的插件, ...

  4. Flink学习(三) 批流版本的wordcount JAVA版本

    Flink 开发环境通常来讲,任何一门大数据框架在实际生产环境中都是以集群的形式运行,而我们调试代码大多数会在本地搭建一个模板工程,Flink 也不例外. Flink 一个以 Java 及 Scala ...

  5. 通过fetch_mcp,让Cline能够获取网页内容。

    fetch_mcp介绍 GitHub地址:https://github.com/zcaceres/fetch-mcp 此MCP服务器提供了以多种格式(包括HTML.JSON.纯文本和Markdown) ...

  6. 分享一个裁剪图片Chrome 扩展 —— Crop Image

    1. 前言 在日常工作和设计过程中,我们常常需要对图片进行裁剪,以适配不同的使用场景.无论是社交媒体头像.网站图片优化,还是艺术设计,精确的图片裁剪都是必不可少的.然而,许多在线工具使用复杂,或者功能 ...

  7. 【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(6)

    1.问题描述: 使用华为内置的MapComponent, 发现显示不出来.查看日志, MapRender底层有报错. 解决方案: 麻烦按以下步骤检查下地图服务,特别是签名证书指纹那部分. 1.一般没有 ...

  8. 什么是单点登录?什么是SSO?什么是CAS?

    目录 单点登录简介 SSO&CAS是什么 单点登录适合什么场景 单点登录的三种实现方式 CAS的几个重要知识点 CAS的实现过程 单点登录简介 单点登录(SingleSignOn,SSO),就 ...

  9. LaTeX配置说明

    LaTex_intro 1.VSCode 安装 微软编辑器:VSCode 配置 安装 LaTeX Workshop 插件 settings.json 路径为:C:\Users\Administrato ...

  10. dotnet 命令启动报错

    Windows 7 或 Windows Server 2008 R2 上安装 .NET Core SDK 2.x 后 dotnet 命令启动报错 可以通过下载以下系统补丁解决 感谢下载 Windows ...