前言

随着近些年微服务的流行,有越来越多的开发者和团队所采纳和使用,它的确提供了很多的优势也解决了很多的问题,但是我们也知道也并不是银弹,提供优势的同时它也给我们的开发人员和团队也带来了很多的挑战。

为了迎接或者采用这些新技术,开发团队需要更加注重一些流程或工具的使用,这样才能更好的适应这些新技术所带来的一些问题。 对于流程行问题,敏捷的Scrum能够很好的提升产品开发团队之间的协作问题,那么对于应用变的越来越复杂这种情况,它最直接的问题就是带来了开发运维的复杂性,这个时候我们就需要使用工具来解决了。

开发运维的复杂性

从字面意思可以看出开发运维的复杂性指的是开发的复杂以及运维的复杂,然后我们具体来说一下到底是怎么复杂的。

我们先说开发的复杂性, 应用由单体变成分布式,需要处理分布式系统遇到的所有问题。 我在之前的博客里面大致都说过遇到的一些挑战,感兴趣的同学可以跳过去看下。

除此之外就是遇到的另外一个也会导致变得复杂就是应用的构建和发布以及部署,因为涉及到的服务特别多就带来了很多的问题,所以遇到的这些问题你可以认为应该开发处理也可以认为应该运维处理,那么就合在一起叫开发运维问题吧。

针对这种开发运维问题,业内提出了DevOps支持。

DevOps

DevOps (Development和Operations的组合词),他是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

这种整合在微服务团队变得尤其重要,在整合的过程中需要用到很多的一些工具来解决遇到的问题,总之一图胜千言。

利用FlubuCore用C#来写DevOps脚本_DevOps

从上图可以看出在 Build 和 CI/CD 阶段需要用到很多的工具,我们需要写脚本对这些工具进行调用以便于让他们能够协同工作,通常我们会使用 shell 脚本,然后来调用这些工具提供的 cli 命令行,然后由构建平台来触发,比如 Jenkins 或者 GitLab CI, Team City 等等。

那么对于不熟悉 shell 的同学,或者觉得使用 shell 效率太低又不方便维护有没有其他的工具可以使用呢,最好是C#可以直接写? 答案当然是有的,今天就给大家强烈推荐一款利器 FlubuCore.

FlubuCore 是什么?

利用FlubuCore用C#来写DevOps脚本_C#_02

FlubuCore 是一个跨平台的自动化构建和部署系统,用于使用C#代码构建项目和执行部署脚本。

Github: https://github.com/dotnetcore/FlubuCore

文档:https://flubucore-zh.dotnetcore.xyz/

FlubuCore 基于 MIT 协议开源,目前已经是 .NET Foundation 基金会项目成员,作者(Marko Zorec)也是我们 NCC 的核心项目成员之一。

现在你可以利用 C# 去编写构建和部署脚本,同时支持 .NET Framework 和 .NET Core,不需要再去学习其他工具或语言了,而且 FlubuCore 提供了一套 Fluent 式的 API,让你写起来根本停不下来。 看图:

利用FlubuCore用C#来写DevOps脚本_FlubuCore_03

香不香? 快去 Github 点个 Star 支持一下吧,你的一个小小的 Star 也是对整个 .NET 生态的贡献。

FlubuCore Getting Started

虽然 FlubuCore 提供的有中文的 Readme,不过我还是简单的带大家入个门吧。

1. 安装全局命令行工具

打开 CMD 执行一下命令:

dotnet tool install --global FlubuCore.GlobalTool

这个命令的主要作用是安装一个全局的命令行工具,持续集成的平台后续就可以利用 flube 这个命令行工具来执行C#自定义的脚本。

2. 新建一个空的解决方案

mkdir FlubuTest
cd FlubuTest
dotnet new sln
mkdir src
cd src
mkdir mywebapp
cd mywebapp
dotnet new webapp
dotnet sln ../../FlubuTest.sln add ./mywebapp.csproj

觉得麻烦的,Visual Studio 直接新建就可以搞定了。

3. 添加 Flubucore 构建项目

先切换到第2步的解决方案根目录 cd ../../,然后创建build的入口项目:

dotnet new -i FlubuCore.Template
dotnet new FlubuCore
dotnet sln FlubuTest.sln add ./BuildScript/BuildScript.csproj

将 FlubuCore 添加到解决方案主要是后续编写脚本的方便,借助于 VisualStudio 的智能提示等就像编写C#代码一样了,实际上就是C#代码, 当然也可以选择不添加到项目中。

最后的文件夹结构大概是这个样子的:

│──FlubuTest.sln
│
└──BuildScript
│      │  BuildScript.cs
│      │  BuildScript.csproj
└─src
    └─mywebapp
        │  appsettings.Development.json
        │  appsettings.json
        │  mywebapp.csproj
        │  Program.cs
        │  Startup.cs

4. 修改 BuildScript.cs 文件

打开 BuildScript/BuildScript.cs 然后将

context.Properties.Set(BuildProps.SolutionFileName, "Todo");

Todo 修改为解决方案的名字

context.Properties.Set(BuildProps.SolutionFileName, "FlubeTest.sln");

BuildProps 这个对象主要提供了在构建的过程中一些上下文信息,通过设置此对象你可以给flubu 提供更多信息以便于后续的使用等。

5. 开始使用

在项目根目录打开 cmd, 然后使用下面的命令来编译你的项目。

flubu compile

其中 compile 就是文件 _Build/BuildScript/BuildScript.cs 的这段代码里面的 compile,你可以随意更改,只需要和命令保持一致。

protected override void ConfigureTargets(ITaskContext context)
{
    var compile = context.CreateTarget("compile")
        .SetDescription("Compiles the solution.")
        .AddCoreTask(x => x.Build());
}

后面基本上你需要的构建的所有的东西都可以写到 ConfigureTargets 里面了。

最后的输出:

D:\FlubuTest>flubu compile
Flubu v.4.3.5.0
Build script file name was not explicitly specified, searching the default locations:
Found it, using the build script file 'BuildScript/BuildScript.cs'.
Executing target compile
Executing task DotnetBuildTask
   Running program 'C:\Program Files\dotnet\dotnet.exe':(work.dir='',args=' build FlubuTest.sln')
   用于 .NET Core 的 Microsoft (R) 生成引擎版本 16.6.0+5ff7b0c9e
   版权所有(C) Microsoft Corporation。保留所有权利。
     正在确定要还原的项目…
     所有项目均是最新的,无法还原。
     BuildScript -> D:\FlubuTest\BuildScript\bin\Debug\netcoreapp2.1\BuildScript.dll
     mywebapp -> D:\FlubuTest\src\mywebapp\bin\Debug\netcoreapp3.1\mywebapp.dll
     mywebapp -> D:\FlubuTest\src\mywebapp\bin\Debug\netcoreapp3.1\mywebapp.Views.dll
   已成功生成。
       0 个警告
       0 个错误
   已用时间 00:00:02.51
compile finished (took 3 seconds)

BUILD SUCCESSFUL
Build finish time: 2020/7/4 0:47
Build duration: 00:00:03 (3 seconds)

可能有人会问,这和我用 dotnet build FlubuTest.sln 有区别吗?
针对这个示例而言,是没区别,但是你可以自己扩展啊,扩展后不就有区别了。比如你想build之前先清理文件夹之类的,可以这么写。

 var compile = context.CreateTarget("compile")
                .SetDescription("Compiles the solution.")
                .AddCoreTask(x => x.Clean())
                .AddCoreTask(x => x.Build());

借助于 flubu 提供的能力,可以在 CI/CD 界面解决很多复杂的构建问题。

总结

上面的仅仅是一个入门,如果你觉得你们项目刚好需要那么你可以去官方的文档去查看,里面有更加详细的使用指南,当然也可以在这个博客下面留言或者去GitHub提交issue询问。