CoreCRM 开发实录——Travis-CI 实现 .NET Core 程度在 macOS 上的构建和测试 [无水干货]
上一篇文章我提到:为了使用“国货”,我把 Linux 上的构建和测试委托给了 DaoCloud,而 Travis-CI 不能放着不用啊。还好,这货支持 macOS 系统。所以就把 CoreCRM 在 macOS 上的构建和测试任务交给它了。
我想国内已经有很多写怎么用 Travis-CI 的博客文章了,我就不需要在这里多费话了。当然,最好的文章其实就是 Travis-CI 的文档;最好的帮助都在 StackOverflow 和 GitHub 上。如果还觉得自己英语不够用,看不懂这些站的话,我觉得只有两条路可以选:1. 学好英语;2. 放弃做程序员。
这里我要记录的是,使用 Travis-CI 构建 CoreCRM 时遇到的两个问题。在我解决这两个问题的过程中,我发现在这是两个非常普遍的问题,基本上在现在的 .NET Core 版本下 (Microsoft.NETCore.App 1.1.0),是两个肯定会遇到的问题。我在综合了好多的 GitHub issue 之后,用了 10 个 commit 才把这两个问题解决了。
1. OpenSSL 没有安装
首先遇到的问题是,在执行 dotnet restore 的时候,出现下面的异常:
Unhandled Exception: System.TypeInitializationException: The type initializer for 'Crypto' threw an exception. ---> System.TypeInitializationException: The type initializer for 'CryptoInitializer' threw an exception. ---> System.DllNotFoundException: Unable to load DLL 'System.Security.Cryptography.Native': The specified module could not be found.
(Exception from HRESULT: 0x8007007E)
at Interop.CryptoInitializer.EnsureOpenSslInitialized()
at Interop.CryptoInitializer..cctor()
--- End of inner exception stack trace ---
at Interop.Crypto..cctor()
--- End of inner exception stack trace ---
at Interop.Crypto.GetRandomBytes(Byte* buf, Int32 num)
at System.IO.Path.GetCryptoRandomBytes(Byte* bytes, Int32 byteCount)
at System.IO.Path.GetRandomFileName()
at Microsoft.DotNet.InternalAbstractions.TemporaryDirectory..ctor()
at Microsoft.Extensions.EnvironmentAbstractions.DirectoryWrapper.CreateTemporaryDirectory()
at Microsoft.DotNet.Configurer.NuGetPackagesArchiver..ctor()
at Microsoft.DotNet.Cli.Program.ConfigureDotNetForFirstTimeUse(INuGetCacheSentinel nugetCacheSentinel)
at Microsoft.DotNet.Cli.Program.ProcessArgs(String[] args, ITelemetry telemetryClient)
at Microsoft.DotNet.Cli.Program.Main(String[] args)
/Users/travis/build.sh: line 57: 5310 Abort trap: 6 dotnet restore CoreCRM
这个问题是由于 openssl 的 libssl 这个动态库没有正确安装造成的。在 Travis-CI 的环境里,支持使用 Homebrew 来安装缺少的组件,但是有一个问题,就是 openssl 需要手动 link 到 /usr/local/lib/ 里才能使用。我最开始使用 Homebrew 提供的 link 功能,也没有解决这个问题,只能自己使用 ln 来解决:
before_install:
- brew install openssl
- ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/
- ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/
把上面的 `before_install` 加到对应的位置,就可以解决上面这个问题了。(解决这个问题花了了大概 3 个小时的时间)
2. 打开文件太多
每种系统为了性能和安全的考虑,对一个进程能打开的文件数都做了限制。不过 macOS 的限制好像是特别的严格。在完成上而 restore 的过程这后,本来是要执行 test 的。结果确遇到下面的错误:
xUnit.net .NET CLI test runner (64-bit .NET Core osx.10.12-x64)
Unhandled Exception: System.IO.IOException: Too many open files
at Interop.ThrowExceptionForIoErrno(ErrorInfo errorInfo, String path, Boolean isDirectory, Func`2 errorRewriter)
at Interop.CheckIo[TSafeHandle](TSafeHandle handle, String path, Boolean isDirectory, Func`2 errorRewriter)
at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(Func`1 fdFunc)
at System.ConsolePal.OpenStandardOutput()
at Xunit.Runner.DotNet.Program.UseTestSinksWithStandardOutputStreams()
at Xunit.Runner.DotNet.Program.Run(String[] args)
at Xunit.Runner.DotNet.Program.Main(String[] args)
SUMMARY: Total: 1 targets, Passed: 0, Failed: 1.
一开始找到的一些解决方案,可能是时间上有点久,针对的都是 Mono 下的一些方法,尝试这后都不管用。在进一步查找之后,找到了在 StackExchange 上的一个解决方案,就是增加允许打开的文件数:
script:
- ulimit -n 2048
- dotnet test CoreCRM.IntegrationTest
这样,上面打开文件太多的问题就可以解决了。
完整的 .travis.yml 请到我的 GitHub 或者 Coding.NET 里查看。在我写完这篇文章的时候,三个 CI 平台,还只有 Travis-CI 是使用版本库里的配置文件完成配置的。后面我会把 AppVeyor 和 DaoCloud 的配置文件下载下来,放到版本库里,这样大家就可以使用这些样板实现自己的 CI 流程了。不过,现在这个时候,我还没有把测试做到极致,还只是能看到全部测试是成功还是失败。随着后面的开发,我会让测试的结束更详细一些,以方便在线看到是哪些测试出了问题。
GitHub: https://github.com/holmescn/CoreCRM
Coding.NET: https://coding.net/u/holmescn/p/CoreCRM/git
CoreCRM 开发实录——Travis-CI 实现 .NET Core 程度在 macOS 上的构建和测试 [无水干货]的更多相关文章
- CoreCRM 开发实录——开始之新项目的技术选择
2016年11月,接受了一个工作,是对"悟空CRM"进行一些修补.这是一个不错的 CRM,开源,并提供一个 SaaS 的服务.正好微软的 .NET Core 和 ASP.NET C ...
- CoreCRM 开发实录——想用国货不容易
昨天(2016年12月29日)发了开始开发的文章.本来晚上准备在 Coding.NET 上添加几个任务开始搞起了.可是真的开始用的时候才发现:Coding.NET 的任务功能只针对私有的任务开放.我想 ...
- CoreCRM 开发实录 —— 单元测试、测试驱动开发和在线服务
测试不是问题,问题是怎么测试. ## 单元测试 我认为单元测试已经是无可争议的最佳开发实践之一.但是很多人并不同意这个观点.他们的说法无非是:写测试需要花很多时间,需求又经常变动,一但变动,一大片测试 ...
- CoreCRM 开发实录 —— 前后端分离的重构
虽然2月初就回来了,可 CoreCRM 一直到5月才开始恢复开发,期间是各种生活中的意外和不方便. 1. 为什么要重构 首先是一件很值得高兴的事情:CoreCRM 有了第一位 contributor! ...
- CoreCRM 开发实录 —— 单元测试之 Mock UserManager 和 SignInManager
单元测试的核心就是:只测试眼前的逻辑.这就要求所有的依赖项都要使用仿类来代替,也就是所谓的 Mock Object.在测试 ProfileRepository 和 AccountController ...
- CoreCRM 开发实录 —— Profile
再简单的功能,也需要一坨代码的支持.Profile 的编辑功能主要就是修改个人的信息.比如用户名.头像.性别.电话--虽然只是一个编辑界面,但添加下来,涉及了6个文件的修改和7个新创建的文件.各种生成 ...
- CoreCRM 开发实录 —— 基于 AntDesign 的新 UI
上一篇说到,因为有新朋友加入,对前端开发有了新的要求.原来基于 Bootstrap 的 UI 就不要了.在网上(其实是 GitHub 上)逛了几圈,最后使用了 antd-admin 这个框架做为基础模 ...
- [转]Travis Ci的最接底气的中文使用教程
相信大家对Travis Ci已经不再陌生了,Github上已经有大部分的项目已经采用了它. Travis Ci是一个基于晕的持续集成项目,目前已经支持大部分主流语言了,如:C.PHP.Ruby.Pyt ...
- 使用Travis CI自动部署Hexo到GitHub
原文链接(转载请注明出处):使用Travis CI自动部署Hexo到GitHub 前言 使用 hexo + gitPages 搭建个人博客的人都知道,每当要发表一篇博文,第一步得手动使用 hexo g ...
随机推荐
- boost强分类器的实现
boost.cpp文件下: bool CvCascadeBoost::train( const CvFeatureEvaluator* _featureEvaluator, int _numSampl ...
- 用php做注册审核
做注册审核就像前面讲的注册登录一样,也是要连接数据库 首先在数据库内要做这样一张表: 表名为users表 里面的列名分别为用户名,密码,姓名,性别,生日,账户的状态,照片 然后就可以写代码了,要注册的 ...
- 高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
- web全栈开发之网站开发二(弹出式登录注册框前端实现-类腾讯)
这次给大家分享的是目前很多网站中流行的弹出式登录框,如下面的腾讯网登录界面,采用弹出式登录的好处是大大提升了网站的用户体验和交互性,用户不用重新跳转到指定的页面就能登录,非常方便 先来个演示地址 要实 ...
- jq跑马灯效果
这几天公司产品有个无缝循环滚动的广告跑马灯要做,最开始想到的是<marquee>标签,但在PC端正常,在安卓广告屏上却怎么都跑不动,后来用的css3的animation,结果也是PC端及其 ...
- springmvc+mybatis+spring 整合 bootstrap html5
A 调用摄像头拍照,自定义裁剪编辑头像 [新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统]B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单; 技 ...
- jquery-treegrid树状表格的使用(.Net平台)
上一篇介绍了DataTable,这一篇在DT的基础之上再使用jquery的一款插件:treegrid,官网地址:http://maxazan.github.io/jquery-treegrid/ 一. ...
- webService
什么是webService WebService,顾名思义就是基于Web的服务.它使用Web(HTTP)方式,接收和响应外部系统的某种请求.从而实现远程调用. 1:从WebService的工作模式上 ...
- 执行git push出现"Everything up-to-date"
在github上git clone一个项目,在里面创建一个目录,然后git push的时候,出现报错"Everything up-to-date" 原因:1)没有git add . ...
- 微软“.Net社区虚拟大会”dotnetConf2015:关键词:.NET 创新、开源、跨平台
去年 11 月的时候,微软开源了 .NET CoreFX,然后是今年 2 月份的 .NET CoreCLR.自那时以来,已经有大约 3500 人在 GitHub 上进行了提交,而且贡献者的人数还在持续 ...