[Cake] 1. CI中的Cake
在上一篇C#Make自动化构建-简介中,简单的介绍了下Cake的脚本如何编写以及通过Powershell或者Bash在本地运行Cake脚本。本篇在此基础上,介绍下如何在CI环境中使用Cake。
1. Cake简介续
1.1 为Task添加注释信息
Cake的每一个Task都可以添加一项描述,用来解释它的用途。比如下面的示例:
Task("restore")
.Description("还原项目依赖")
.Does(() =>
{
DotNetCoreRestore(soluction);
});
然后Cake接收一个名为 ShowsDescription 的参数,运行Powershell或者bash的时候可以传递-ShowDescription来显示Task的信息。为了方便输入,我把ShowDescription改成了Help(仅更改了build.ps1中传递参数的名称)。
1.2 Cake.exe 和 Cake.CoreCLR
Cake目前有两个版本(参见Cake Releases):
- Cake.exe是面向net461的,可以在winodws上直接运行;也可以在linux上借助 mono cake.exe (Mono已经实现net47)来运行。
- Cake.CoreCLR(0.26版本以后开始支持.net core 2的,之前是.net core 1.1)面向.netcore的,可以使用 dotnet cake.dll 来运行。
我们直接下载这两个nuget包,然后用7z解压一下(nupkg文件为zip):
cake.0.26.1.nupkg解压后如下:
在windows下可以直接通过console窗口来运行它:
cake.coreclr.0.26.1.nupkg解压后如下:
可以通过dotnet cake.dll来运行它:
2. Cake运行环境搭配
Cake脚本本身的跨平台(windows,linux,docker等)是借助于上面提到的cake.exe或cake.coreclr来实现的。基于这些,我们可以有如下的组合:
- windows:用powershell来引导执行cake.exe。
- windows:用powershell来引导执行dotnet cake.dll。
- linux:用bash来引导执行mono cake.exe。
- linux:用bash来引导执行dotnet cake.dll。
- docker:视docker镜像的os平台而定,从上面四个组合中选择一个。
由于目前dotnet cli本身的不健全,缺少独立于*.csproj文件之外来安装nuget包的命令,故而使得安装cake.coreclr变得非常恶心。参见两种变通方法:
- 借助外部工具下载cake.coreclr的nuget包:https://github.com/devlead/BitbucketPipelinesShield/blob/master/build.sh
- 构造一个临时的*.csproj文件,然后用dotnet restore来下载cake.coreclr的nuget包:https://gist.github.com/luigiberrettini/19a124d24af74039ae87065adb007e2c
故而目前在window平台下选择1,在其他平台下选择3比较合适,在docker下可以构建一个mone+dotnet的混合环境的image(https://hub.docker.com/r/lnhcode/dotnet2-mono5/)。
好消息是目前.net core的每日构建版已经添加了 dotnet install 和 dotnet install tool 的命令(https://github.com/dotnet/cli/blob/master/src/dotnet/commands/dotnet-install/InstallCommandParser.cs),可以直接用来安装nuget包。这个新功能会随着.net core 2.1的正式发布而到来。到时候就可以统一借助dotnet cli来安装cake.coreclr了。
3. 在不同的CI环境中执行相同的自动构建
cake的目的在于一次编写,可以运行在不同的构建环境和构建工具中。同时可以把构建脚本纳入到源代码管理中,而不是编写在某一特定的ci/cd工具中。正如这篇文章https://www.thoughtworks.com/radar/techniques/programming-in-your-ci-cd-tool中的观点一样。
借助Github提供的很多免费的CI服务,我在https://github.com/linianhui/cake.example上接入了3个CI服务。
3.1 Cake with AppVeyor
AppVeyor主要提供有windows的ci环境,我们只需要再github的项目根目录添加 appveyor.yml 文件,然后关联一下AppVeyor的服务即可。
version: 1.0.{build}
image: Visual Studio 2017
build: off
test_script:
- ps: ./build.ps1 -target test
上面的这个示例调用了build.ps1来运行测试https://ci.appveyor.com/project/linianhui/cake-example。
3.2 Cake with Travis
Travis提供有linux的ci环境,同样的我们添加一个 .travis.yml 文件然后关联Travis的服务即可。
language: csharp os:
- linux mono: latest dotnet: 2.1.4 script:
- chmod +x ./build.sh
- ./build.sh -target=test
上面的这个示例的运行环境是linux,安装了mone和dotnet,然后调用了build.sh来运行测试https://travis-ci.org/linianhui/cake.example。
3.3 Cake with Circle
Circle提供有docker的环境,同样的添加一个 .circleci/config.yml 文件然后关联Circle的服务即可。
version: 2 jobs:
test:
docker:
- image: lnhcode/dotnet2-mono5
steps:
- checkout
- run: chmod +x ./build.sh
- run: ./build.sh -target=test workflows:
version: 2
test:
jobs:
- test
上面的示例中我使用了自己定义的一个dotnet2-mono2的docker镜像,然后调用builds.sh来运行测试https://circleci.com/gh/linianhui/cake.example/tree/master。dotnet2-mono5的镜像位于:https://hub.docker.com/r/lnhcode/dotnet2-mono5/
4. 总结
以上简单的介绍了一下Cake的简介信息,和如何再不同的CI环境中使用Cake来维护一个相同的自动化构建的流程。如有错误,欢迎指正!
参考
dotnet2-mono5 的dockerfile:https://github.com/linianhui/dockerfiles/blob/master/dotnet2-mono5/Dockerfile
本文示例代码:https://github.com/linianhui/cake.example
不要再CI/CD中编程:https://www.thoughtworks.com/radar/techniques/programming-in-your-ci-cd-tool
[Cake] 1. CI中的Cake的更多相关文章
- [Cake] 2. dotnet 全局工具 cake
在上篇博客[Cake] 1. CI中的Cake中介绍了如何在CI中利用Cake来保持与CI/CD环境的解耦. 1. 简化cake的安装 当时dotnet 2.1还未正式发布,dotnet 还没有工具的 ...
- [Cake] 3. dotnet 本地工具 cake & dotnet format
在上一篇[Cake] 2. dotnet 全局工具 cake中介绍了通过.Net Core 2.1 的全局工具dotnet tool命令来简化cake的安装和使用.因为是全局安装,则无法适应每个项目对 ...
- CI中的数据库操作
转载于:http://blog.sina.com.cn/s/blog_76e7bdba01016p2p.html CI中第一次连接数据库,在控制器或模型的构造函数里输入以下语句 $this->l ...
- 在CI中集成phpmailer,方便使用SMTP发送邮件
直接使用phpmailer的话,有时候不是很方便,特别你的很多功能都是基于CI完成的时候,要相互依赖就不方便了,所以在想,那是否可以将phpmailer集成到CI中呢,像使用email类这样使用他,功 ...
- ***CI中的数据库操作(insert_id新增后返回记录ID)
在system/application/config 文件夹和里面的config文件里已经配置了参数 $active_group = "default";$db['default' ...
- CI中的控制器中要用model中的方法,是统一写在构造器方法中,还是在每一个方法中分别写
Q: CI中的控制器中要用model中的方法,是统一写在构造器方法中,还是在每一个方法中分别写 A: 建议统一写,CI框架会自动识别已经加载过的类,所以不用担心重复加载的问题 class C_User ...
- PHP获取http头信息和CI中获取HTTP头信息的方法
CI中获取HTTP头信息的方法: $this->input->request_headers() 在不支持apache_request_headers()的非Apache环境非常有用.返回 ...
- CI中获取读操作的结果集行数+获取写操作的影响行数
本质:读操作,用mysql_num_rows函数,写操作用mysql_affected_rows函数 mysql_num_rows() 返回结果集中行的数目.此命令仅对 SELECT 语句有效.要取得 ...
- 在CI中实现持续Web安全扫描
一. 当前Web应用安全现状 随着中国互联网金融的爆发和繁荣,Web应用在其中扮演的地位也越来越重要,比如Web支付系统.Web P2P系统.Web货币系统等.对于这些金融系统来讲,安全的重要性是不言 ...
随机推荐
- zabbix监控-percona监控MySQL(三)
监控MySQL实战 标签(linux): zabbix & mysql 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 percona为MySQL制作了专 ...
- sqlserver数据库使用技巧(一)--限制数据库的大小
如何限制数据库的大小? 随着数据库的使用,他占用的空间会越来越大,为了便于资源的合理分配和管理,我们可以限制其最大的大小,这个建议只在测试环境使用 具体操作如下: 打开sqlserver数据库管理工具 ...
- Python 定位桌面
通过注册表寻找桌面路径: (用内置的winreg) import winreg key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, \ ...
- 浅尝一个排程引擎Optaplanner,前序。
当码农有10多年了,由建筑行业软件,各种MIS,通用物流定制平台,CCTV客户端(是闭路电视,不是央视喔)啥都做过.最后小试一下创业,不过那都是闹着玩的,不到一年就回到码农的队列,重拾搬砖的行当.近些 ...
- Spring的事务管理(理论篇,下篇提供代码实现)
事务:逻辑上的一组操作,这组操作要么全部成功,要么全部失败(事务十大特性:原子性,一致性,隔离性,持久性) 原子性:事务是不可分割的工作单位,事务中的操作要么都发生了,要么都不发生.(也就是说不能单独 ...
- Go笔记-指针
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址 一个指针变量可以指向任何一个值的内存地址 它指向那个值的内存地址,在 32 位机器上占用 4 个字节,在 64 位机器 ...
- JMeter生成HTML性能报告
有时候我们写性能报告的时候需要一些性能分布图,JMeter是可以生成HTML性能报告的 一.准备工作 1:jmeter3.0版本之后开始支持动态生成测试报表 2:jdk版本1.7以上 3:需要jmx脚 ...
- BZOJ 3512: DZY Loves Math IV [杜教筛]
3512: DZY Loves Math IV 题意:求\(\sum_{i=1}^n \sum_{j=1}^m \varphi(ij)\),\(n \le 10^5, m \le 10^9\) n较小 ...
- BZOJ 2752: [HAOI2012]高速公路(road) [线段树 期望]
2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1219 Solved: 446[Submit] ...
- 豹哥嵌入式好讲堂:ARM Cortex-M调试过程探析(1)- 4线接口标准(JTAG)
大家好,我是豹哥,猎豹的豹,犀利哥的哥.今天豹哥给大家讲的是嵌入式调试里的接口标准JTAG. 在结束<ARM Cortex-M开发文件详解>系列文章之后,豹哥修整了一小段时间,但是讲课的心 ...