CoreCRM 開發實錄——Travis-CI 實現 .NET Core 程度在 macOS 上的構建和測試 [無水乾貨]

来源:http://www.cnblogs.com/holmescn/archive/2016/12/30/corecrm-travis-macos.html
-Advertisement-
Play Games

上一篇文章我提到:為了使用“國貨”,我把 Linux 上的構建和測試委托給了 DaoCloud,而 Travis-CI 不能放著不用啊。還好,這貨支持 macOS 系統。所以就把 CoreCRM 在 macOS 上的構建和測試任務交給它了。 我想國內已經有很多寫怎麼用 Travis-CI 的博客文章 ...


上一篇文章我提到:為了使用“國貨”,我把 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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 應用場景 應用場景 angular2(下文中標註位NG2)項目和.net mvc項目分別開發,前期採用跨域訪問進行並行開發,後期只需要將NG2項目的生產版本合併到.net項目。 NG2項目概述 NG2項目概述 ng2項目採用的是angular-cli搭建的框架。 使用type script、rxjs ...
  • 在我上篇隨筆《在DevExpress程式中使用Winform分頁控制項直接錄入數據並保存》中介紹了在GridView以及在其封裝的分頁控制項上做數據的直接錄入的處理,介紹情況下數據的保存和校驗等操作,不過還沒有涉及到數據列表選擇的這種方式,而這種在項目應用也是比較廣泛的一種輸入方式。本篇隨筆繼續探討在G... ...
  • //我的C#是跟著猛哥(劉鐵猛)(算是我的正式老師)《C#語言入門詳解》學習的,微信上猛哥也給我講解了一些不懂得地方,對於我來說簡直是一筆巨額財富,難得良師! 這次與大家一起學習C#中的值參數 傳值參數(也叫值參數) 值參數 (value parameter) 什麼是值參數? 這是從《C#語言規範5 ...
  • 看下組織結構: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex System.Threading.Semaphore System.Threading.EventWa ...
  • 恢復內容開始 第一次發表博文,發表博文的目的是鞏固自己的技術,也能夠共用給大家。寫的不好的地方,希望大家多給給意見。老司機勿噴 數據結構() NewsTypeId 新聞ID, NewsTypeName 新聞名稱 NewsTypeParentId 父級ID 後臺語言:ASP.NET MVC4 後臺代碼 ...
  • 一、效果 和12306是一樣的,運行一張圖上點擊多個位置,橫線以上和左邊框還有有邊框位置不允許點擊,點擊按鈕輸出坐標集合,也就是12306登陸的時候,需要向後臺傳遞的參數。 二、實現思路 1、獲取驗證碼圖片 首先,我們看12306登陸頁面,F12,通過如圖的位置,我們可以觀察到,驗證碼的請求URL是 ...
  • 前言:前幾天從博客園看了些技術小伙伴的年終總結,都覺得好豐盛哦,猶如饕餮盛宴,於是乎向著自己了,也從技術和生活上 總結一下2016年吧: @技術篇>>> >技術範疇看上去有點雜,有點多,但都有一個起點 2015-2016,是我職業生涯的一個歷史轉折點。四月份的時候,開始瞭解微服務-MicroServ ...
  • 1 概述 數通暢聯某綜合SOA集成項目的統一身份認證工作,需要第三方系統配合進行單點登錄的配置改造,在項目中有需要進行單點登錄配置的.NET應用系統,本文專門記錄.NET應用和AEAI CAS的集成過程步驟,為後續類似的統一認證配置實現提供參考指導。 2 預期讀者 數通暢聯新員工  廣大技術愛好者 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...