利用FlubuCore用C#来写持续集成和持续部署脚本
前言
随着近些年微服务的流行,有越来越多的开发者和团队所采纳和使用,它的确提供了很多的优势也解决了很多的问题,但是我们也知道也并不是银弹,提供优势的同时它也给我们的开发人员和团队也带来了很多的挑战。
为了迎接或者采用这些新技术,开发团队需要更加注重一些流程或工具的使用,这样才能更好的适应这些新技术所带来的一些问题。 对于流程行问题,敏捷的Scrum能够很好的提升产品开发团队之间的协作问题,那么对于应用变的越来越复杂这种情况,它最直接的问题就是带来了开发运维的复杂性,这个时候我们就需要使用工具来解决了。
开发运维的复杂性
从字面意思可以看出开发运维的复杂性指的是开发的复杂以及运维的复杂,然后我们具体来说一下到底是怎么复杂的。
我们先说开发的复杂性, 应用由单体变成分布式,需要处理分布式系统遇到的所有问题。 我在之前的博客里面大致都说过遇到的一些挑战,感兴趣的同学可以跳过去看下。
除此之外就是遇到的另外一个也会导致变得复杂就是应用的构建和发布以及部署,因为涉及到的服务特别多就带来了很多的问题,所以遇到的这些问题你可以认为应该开发处理也可以认为应该运维处理,那么就合在一起叫开发运维问题吧。
针对这种开发运维问题,业内提出了DevOps支持。
DevOps
DevOps (Development和Operations的组合词),他是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。
这种整合在微服务团队变得尤其重要,在整合的过程中需要用到很多的一些工具来解决遇到的问题,总之一图胜千言。

从上图可以看出在 Build 和 CI/CD 阶段需要用到很多的工具,我们需要写脚本对这些工具进行调用以便于让他们能够协同工作,通常我们会使用 shell 脚本,然后来调用这些工具提供的 cli 命令行,然后由构建平台来触发,比如 Jenkins 或者 GitLab CI, Team City 等等。
那么对于不熟悉 shell 的同学,或者觉得使用 shell 效率太低又不方便维护有没有其他的工具可以使用呢,最好是C#可以直接写? 答案当然是有的,今天就给大家强烈推荐一款利器 FlubuCore.
FlubuCore 是什么?

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,让你写起来根本停不下来。 看图:

香不香? 快去 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询问。
GitHub: https://github.com/dotnetcore/FlubuCore
FlubuCore 给我们提供了一种可以快速编写 DevOps 脚本的能力,利用这种能力可以让DevOps变得更加简单和高效,从而提高效率节约时间。
如果你觉得本篇文章对您有帮助的话,感谢您的【推荐】。
本文地址:http://www.cnblogs.com/savorboard/p/flubucore.html
作者博客:Savorboard
利用FlubuCore用C#来写持续集成和持续部署脚本的更多相关文章
- Jenkins持续集成-自动化部署脚本的实现
要实现Jenkins端的持续集成,其实在CI服务配置端很容易,难点呢?就是如何实现自动化的部署.我的脚本设计就是为了解决以下难题: 难点一.如何使得自动化部署脚本更通用 我用的脚本,依赖依赖一个配置文 ...
- 《转载》Jenkins持续集成-自动化部署脚本的实现《python》
本文转载自慕课网 读者须知:1.本手记本着记续接前面的两张手记内容整理2.本手记针对tomcat部署测试环境实现 最近工作比较繁忙,导致这章一直拖延,没有太抽出时间来总结.要实现Jenkins端的持续 ...
- 利用Travis CI+GitHub实现持续集成和自动部署
前言 如果你手动部署过项目,一定会深感持续集成的必要性,因为手动部署实在又繁琐又耗时,虽然部署流程基本固定,依然容易出错. 如果你很熟悉持续集成,一定会同意这样的观点:"使用它已经成为一种标 ...
- Azure Terraform(八)利用Azure DevOps 实现Infra资源和.NET CORE Web 应用程序的持续集成、持续部署
一,引言 上一篇讲解到利用 Azure DevOps 将整个 Azure Web App,Azure Traffic Manager profile,Azure Storage Account,Azu ...
- 使用Docker构建持续集成与自动部署的Docker集群
为什么使用Docker " 从我个人使用的角度讲的话 部署来的更方便 只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情 虚拟化让集群的管理和控制部署都更方便 hub.docke ...
- Android持续集成之Jenkins 部署
Android持续集成之Jenkins 部署 [TOC] 0x00安装 准备工作如下: Tomcat8.5下载地址 Jenkins下载链接 1 将下载的jenkins.war包放至tomcat下的we ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(三):搭建jenkins集群环境
写在前面 大家可以看到本文的配图,左边是jenkins单机环境,右边是jenkins集群.个中区别,不言而喻,形象生动. 前面我分别介绍了.net core 程序的多种部署方式(无绝对孰优孰劣): 1 ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(二):部署
前面又是废话 我之前写过: Asp.Net Core 程序部署到Linux(centos)生产环境(一):普通部署 Asp.Net Core 程序部署到Linux(centos)生产环境(二):doc ...
- Asp.net Core 使用Jenkins + Dockor 实现持续集成、自动化部署(一):Jenkins安装
2019/1/31更新,经过我一段时间的使用 建议大家的jenkins还是不要使用docker方式安装 建议大家的jenkins还是不要使用docker方式安装 建议大家的jenkins还是不要使用d ...
- .NET持续集成与自动化部署之路第一篇——半天搭建你的Jenkins持续集成与自动化部署系统
.NET持续集成与自动化部署之路第一篇(半天搭建你的Jenkins持续集成与自动化部署系统) 前言 相信每一位程序员都经历过深夜加班上线的痛苦!而作为一个加班上线如家常便饭的码农,更是深感其痛 ...
随机推荐
- java实现砝码称重
5个砝码 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量. 如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中). ...
- Java 是如何实现跨平台的?
Java 是如何实现跨平台的? 注意:跨平台的是 Java 程序,而不是 JVM.JVM 是用 C/C++ 开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的 JVM 答:我们编写的 ...
- java实现拍7游戏
** 拍7游戏** 许多人都曾经玩过"拍七"游戏.规则是:大家依次从1开始顺序数数,数到含有7或7的倍数的要拍手或其它规定的方式表示越过(比如:7,14,17等都不能数出),下一人 ...
- java实现第五届蓝桥杯扑克序列
扑克序列 AA223344,一共4对扑克牌.请你把它们排成一行. 要求:两个A中间有1张牌,两个2之间有2张牌,两个3之间有3张牌,两个4之间有4张牌. 4A3A2432, 2342A3A4 请填写出 ...
- 「持续集成实践系列 」Jenkins 2.x 构建CI自动化流水线常见技巧
在上一篇文章中,我们介绍了Jenkins 2.x实现流水线的两种语法,以及在实际工作中该如何选择脚本式语法或声明式语法.原文可查阅:「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要 ...
- opencl(5)缓存对象
//创建的内存对象由内核访问,将缓冲区作为参数传递给内核 1:创建缓存对象 cl_mem clCreateBuffer( cl_context context, //上下文 cl_mem_flags ...
- neo4j导入csv文件
neo4j导入csv文件 关于neo4j的安装 官网和网上博客提供了n中安装的方法,这里不再赘述: 普通安装: https://cloud.tencent.com/developer/article/ ...
- render props的运用
2020-04-03 render props的运用 术语 “render prop” 是指一种在 React 组件之间使用一个值为函数的 prop 共享代码的简单技术 通常的 这个值为函数的prop ...
- [Linux之旅一] .NET Core 2.2部署到Docker中
第一步,使用VS2017或者VS2019创建.NET Core 2.2或3.1的项目,如下图: 在创建项目的时候记得勾选Docker支持,这样会自动创建Dockerfile文件,这个文件用于构建Doc ...
- MySQL示例数据库导入_1
做个测试需要有适当量的数据库,于是找到了下面这个MySQL(超过30w记录), 1)先Git clone https://github.com/datacharmer/test_db ...