利用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实现第九届蓝桥杯字母阵列
字母阵列 题目描述 仔细寻找,会发现:在下面的8x8的方阵中,隐藏着字母序列:"LANQIAO". SLANQIAO ZOEXCCGB MOAYWKHI BCCIPLJQ SLAN ...
- java实现第五届蓝桥杯斐波那契
斐波那契 标题:斐波那契 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 .... (x=1,2) f(x) = f(x-1) + f(x-2) .... (x>2) 对于给定的整数 ...
- opencl(3)程序、内核
1:程序 1)从上下文中创建程序 cl_program clCreateProgramWithSource( cl_context context, //上下文 cl_uint count, //文本 ...
- (二)linux三剑客之awk
1.awk是什么和上一节的grep有什么区别? 2.awk解决了哪些问题? 3.awk的工作原理? 4.awk的基础用法? 5.awk技术常用[收藏] 1.awk是什么? awk 用于处理文本,gre ...
- 计算从1到n中,出现某位数字的次数
出现1-9中某位数字次数的算法 /** * @param input 整数n(1 ≤ n ≤ 1,000,000,000) * @return 1-9中某个数字在数列中出现的次数 */ public ...
- 第m大的身份证号码(局部排序代全局、结构体排序)
第m大的身份证号码(点击) 时间限制: 1 Sec 内存限制: 128 MB ...
- 2019-02-02 Python学习之多线程
1.主线程和次线程 若主线程结束则次线程也会结束 如何避免主线程先结束: 结尾处加上 while True: pass e.g. import win32api #引用系统函数 import _thr ...
- 授权函数-web_set_certificate_ex
设置证书和密钥文件属性. int web_set_certificate_ex(const char * option_list,LAST); 该函数与Loadrunner 录制设置属性中的Recor ...
- Spark文档阅读之二:Programming Guides - Quick Start
Quick Start: https://spark.apache.org/docs/latest/quick-start.html 在Spark 2.0之前,Spark的编程接口为RDD (Resi ...
- 解决mysql插入数据l出现"the table is full"的问题
需要修改Mysql的配置文件my.ini,在[mysqld]下添加/修改两行:tmp_table_size = 256Mmax_heap_table_size = 256M