Jenkins持續集成學習5-搭建jenkins問題匯總
目錄
Jenkins持續集成學習-Windows環境進行.Net開發1
Jenkins持續集成學習-Windows環境進行.Net開發2
Jenkins持續集成學習-Windows環境進行.Net開發3
Jenkins持續集成學習-Windows環境進行.Net開發4
Jenkins持續集成學習-搭建jenkins問題匯總
前言
前面幾篇文字講解了在開發環境部署jenkins並通過SVN、Github、Gitlab進行持續集成。
由於工作需要,需要在一個干凈的服務器上部署jenkins用於測試環境的持續集成。由於我本地的開發環境基本的環境及插件都已經存在了,因此部署的時候沒有碰到任何問題,但是在一個干凈的開發環境部署的時候碰到了許多問題,且存在部分問題在網絡上找不到解決辦法,最終自己解決。
問題列表
nuget還原包問題
nuget重置包的時候報錯,未經處理的異常: System.TypeLoadException: 未能從程序集“mscorlib, Version=4.0...
由於很多項目仍然使用的是.net framework 3.5
,因此仍然需要用msbuild 工具進行編譯,通過反編譯可以看到我當前使用的4.9版本的nuget使用的是.net framework 4.6
版本,而服務器上沒有安裝.net framework 4.6
,安裝完成后解決。
編譯問題
-
使用12.0版本的MSBuild編譯報錯。
MSBUILD : error MSB1025: An internal failure occurred while running MSBuild.
原因:沒有安裝MSBuild編譯工具,我從我本地開發環境直接拷貝MSBuild工具C:\Program Files (x86)\MSBuild\12.0\Bin
到服務器,調用MsBuild命令報錯Could not load file or assembly 'System.Threading.Tasks.Dataflow'...
,最后通過安裝Microsoft Build Tools 2013成功編譯。同理編譯VS2015(MSBuild 14.0)項目需要安裝Microsoft Build Tools 2015。
需要注意由於VS2017安裝已經采用可選安裝,因此不再提供Microsoft Build Tools 2017
工具,需要通過VS2017安裝工具選擇MSBuild工具安裝
-
由於VS2017支持以PackageReference方式引用nuget包。通過
PackageReference
的方式引用在Nuget包還原的時候會在obj目錄下自動生成Nuget包引用的配置文件project.assets.json
、AsyncModule.NetMQ.2017.csproj.nuget.cache
、AsyncModule.NetMQ.2017.csproj.nuget.g.props
、AsyncModule.NetMQ.2017.csproj.nuget.g.targets
。
但是在本地使用Nuget Restore
進行包還原后,在通過MSBuild
編譯可以通過,但是在Jenkins上一直通不過。
-
查看日志檢查根本問題
項目“D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ\AsyncModule.NetMQ.2017.csproj”(2)正在節點 1 上生成 “D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ\AsyncModule.NetMQ.2017.csproj”(2:2) (Build 個目標)。 15:23:53 C:\Program Files\dotnet\sdk\2.2.103\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets(208,5): error NETSDK1064: 未找到版本為 0.1.26 的包 AsyncIO。它可能已在 NuGet 還原后刪除。否則,NuGet 還原可能只是部分完成,這種情況可能是最大路徑長度限制所導致。 [D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ\AsyncModule.NetMQ.2017.csproj]
由於之前對於VS2017新的包引用方式不是很理解,且被其他文章誤導認為
project.assets.json
只是存放包的依賴關系,認為它是在VS中引用包時生成的,而實際該配置文件以及obj下其他三個名為*.csproj.nuget*
的配置文件都是在Nuget包還原的時候自動創建的。由於Jenkins一直報錯說找不到包(路徑可以肯定絕對沒有超長),因此通過對比直接nuget命令創建的配置文件和jenkins創建的配置文件有什么差異。
左圖是在本地通過命令行進行包還原創建的配置文件,右圖是jenkins上調用命令行創建的配置文件。可以發現兩個路徑是不一樣的。初步判斷編譯的時候會去配置的packageFolders
查找包而由於"C:\WINDOWS\system32\config\systemprofile\.nuget\packages\"
路徑根本不存在,因此再去C:\Program Files\dotnet\sdk\2.2.103\Sdks
下查找安裝的SDK包目錄,都找不到最終報錯。 -
使用
dotnet build
命令編譯在Package Restore一文中和NuGet is now fully integrated into MSBuild提到Nuget已經被集成到MSBuild了,因此在安裝過
.net core sdk
可以直接通過dotnet build
命令編譯自動重置nuget包。嘗試使用結果報錯D:\Jenkins\workspace\AsyncModule.NetMQ-V2>dotnet build AsyncModule.NetMQ\AsyncModule.NetMQ.2017.sln 用於 .NET Core 的 Microsoft (R) 生成引擎版本 15.9.20+g88f5fadfbe 版權所有(C) Microsoft Corporation。保留所有權利。 正在還原 D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ\AsyncModule.NetMQ.2017.csproj 的包... 正在還原 D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ.Client.2017\AsyncModule.NetMQ.Client.2017.csproj 的包... 正在還原 D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ.Test\AsyncModule.NetMQ.Test.2017.csproj 的包... 正在生成 MSBuild 文件 D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ\obj\AsyncModule.NetMQ.2017.csproj.nuget.g.props。 正在生成 MSBuild 文件 D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ.Test\obj\AsyncModule.NetMQ.Test.2017.csproj.nuget.g.props。 正在生成 MSBuild 文件 D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ.Client.2017\obj\AsyncModule.NetMQ.Client.2017.csproj.nuget.g.props。 D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ.Client.2017\AsyncModule.NetMQ.Client.2017.csproj 的還原在 223.01 ms 內完成。 D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ.Test\AsyncModule.NetMQ.Test.2017.csproj 的還原在 223.01 ms 內完成。 D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ\AsyncModule.NetMQ.2017.csproj 的還原在 223.01 ms 內完成。 C:\Program Files\dotnet\sdk\2.2.103\Microsoft.Common.CurrentVersion.targets(1179,5): error MSB3644: 未找到框架“.NETFramework,Version=v3.5”的引用程序集。若要解決此問題,請安裝此框架版 本的 SDK 或 Targeting Pack,或將應用程序的目標重新指向已裝有 SDK 或 Targeting Pack 的框架版本。請注意,將從全局程序集緩存(GAC)解析程序集,並將使用這些程序集替換引用程序集。因此,程序集 的目標可能未正確指向您所預期的框架。 [D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ.Client.2017\AsyncModule.NetMQ.Client.2017.csproj] C:\Program Files\dotnet\sdk\2.2.103\Microsoft.Common.CurrentVersion.targets(1179,5): error MSB3644: 未找到框架“.NETFramework,Version=v3.5”的引用程序集。若要解決此問題,請安裝此框架版 本的 SDK 或 Targeting Pack,或將應用程序的目標重新指向已裝有 SDK 或 Targeting Pack 的框架版本。請注意,將從全局程序集緩存(GAC)解析程序集,並將使用這些程序集替換引用程序集。因此,程序集 的目標可能未正確指向您所預期的框架。 [D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ\AsyncModule.NetMQ.2017.csproj] SocketSenderManager.cs(294,6): warning CS0162: 檢測到無法訪問的代碼 [D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ\AsyncModule.NetMQ.2017.csproj] AsyncModule.NetMQ.2017 -> D:\Jenkins\workspace\AsyncModule.NetMQ-V2\AsyncModule.NetMQ\bin\Debug\net40\AsyncModule.NetMQ.dll
可以發現編譯之前確實自動還原了包,但是最后編譯的時候報錯
error MSB3644: 未找到框架“.NETFramework,Version=v3.5”的引用程序集
。實際我本地開發環境是安裝過了.Net Framework 3.5
,查找資料發現dotnet build
不支持編譯.net 3.5 framework
,可以查看Support for .NET Framework 3.5和Cannot find reference assemblies for .NET 3.5 or lower using core msbuild。 -
jenkins環境變量問題。
現在可以基本確定是包路徑問題,而為什么命令行直接編譯生成的配置文件和jenkins調用window命令生成的配置文件會不一樣呢,懷疑可能是由於jenkins的環境變量和windows的環境變量不一樣導致的。
原來package.config
的包管理方式會將包下載到程序目錄下,而PackageReference
的包管理方式直接使用全局引用的方式,性能得到了極大提升,在管理全局包、緩存和臨時文件夾一文提到關於global‑packages
包路徑。global-packages 文件夾是 NuGet 安裝任何下載包的位置。 每個包完全展開到匹配包標識符和版本號的子文件夾。
使用 PackageReference 格式的項目總是直接從該文件夾中使用包。 使用 packages.config 時,包將安裝到 global-packages 文件夾,然后復制到項目的 packages 文件夾。
Windows:%userprofile%.nuget\packages
Mac/Linux:~/.nuget/packages
使用 NUGET_PACKAGES 重寫環境變量 globalPackagesFolder 或 repositoryPath 配置設置(分別在使用 PackageReference 和 packages.config 時)或 RestorePackagesPath MSBuild 屬性(僅限 MSBuild)。 環境變量優先於配置設置。 -
設置環境變量添加NUGET_PACKAGES路徑
添加后必須重啟jenkins才能生效。再次編譯就成功了。
-
設置Jenkins內部環境變量添加NUGET_PACKAGES
既然是環境變量,那直接添加到jenkins內部即可,通過插件EnvInject Plugin
可以設置Jenkins內置的環境變量,在Build Environment勾選Inject environment variables to the build process
設置環境變量,這樣設置不需要重啟,但是每個job如果需要都需要額外設置環境變量。
17:14:06 [EnvInject] - Executing scripts and injecting environment variables after the SCM step. 17:14:06 [EnvInject] - Injecting as environment variables the properties content 17:14:06 userprofile=C:\Users\Dm_ca 17:14:06 17:14:06 [EnvInject] - Variables injected successfully. 17:14:06 [AsyncModule.NetMQ-V2] $ cmd /c call C:\WINDOWS\TEMP\jenkins3711651605143255297.bat 17:14:06 17:14:06 D:\Jenkins\workspace\AsyncModule.NetMQ-V2>echo C:\Users\Dm_ca\.nuget\packages 17:14:06 C:\Users\Dm_ca\.nuget\packages
可以看到環境變量已經設置成功,同時編譯也通過了。
-
設置nuget全局包文件夾
除了通過環境變量設置以外,還可以在nuget.config
配置中設置全局包文件夾。在nuget.config 引用文章中介紹了關於nuget配置獲取與設置的方法。通過在nuget.config
配置文件中添加globalPackagesFolder
設置全局的nuget的包文件路徑
再次構建就成功了。
SVN更新問題
jenkins檢出的代碼,若右鍵顯示svn 升級工作副本
,原因是Jenkins的SVN插件默認使用的是1.4版本的SVN客戶端,在系統管理-系統設置
中找到SVN的配置修改為高版本即可。
參考文檔
- Package Restore
- NuGet is now fully integrated into MSBuild
- Support for .NET Framework 3.5
- Cannot find reference assemblies for .NET 3.5 or lower using core msbuild
- 管理全局包、緩存和臨時文件夾
- nuget.config 引用
- Jenkins:無效版本的SVN工作副本
微信掃一掃二維碼關注訂閱號傑哥技術分享
本文地址:https://www.cnblogs.com/Jack-Blog/p/10439325.html
作者博客:傑哥很忙
歡迎轉載,請在明顯位置給出出處及鏈接