Jenkins持續集成學習-搭建jenkins問題匯總


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,安裝完成后解決。
20190226153328.png

編譯問題

  1. 使用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工具安裝
    20190225093152.png

  2. 由於VS2017支持以PackageReference方式引用nuget包。通過PackageReference的方式引用在Nuget包還原的時候會在obj目錄下自動生成Nuget包引用的配置文件project.assets.jsonAsyncModule.NetMQ.2017.csproj.nuget.cacheAsyncModule.NetMQ.2017.csproj.nuget.g.propsAsyncModule.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創建的配置文件有什么差異。
    20190226162055.png
    左圖是在本地通過命令行進行包還原創建的配置文件,右圖是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.5Cannot 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路徑
    20190226180258.png

    添加后必須重啟jenkins才能生效。再次編譯就成功了。

  • 設置Jenkins內部環境變量添加NUGET_PACKAGES
    既然是環境變量,那直接添加到jenkins內部即可,通過插件EnvInject Plugin可以設置Jenkins內置的環境變量,在Build Environment勾選Inject environment variables to the build process設置環境變量,這樣設置不需要重啟,但是每個job如果需要都需要額外設置環境變量。
    20190226182444.png

    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的包文件路徑
    20190226174044.png
    再次構建就成功了。

SVN更新問題

jenkins檢出的代碼,若右鍵顯示svn 升級工作副本,原因是Jenkins的SVN插件默認使用的是1.4版本的SVN客戶端,在系統管理-系統設置中找到SVN的配置修改為高版本即可。

參考文檔

  1. Package Restore
  2. NuGet is now fully integrated into MSBuild
  3. Support for .NET Framework 3.5
  4. Cannot find reference assemblies for .NET 3.5 or lower using core msbuild
  5. 管理全局包、緩存和臨時文件夾
  6. nuget.config 引用
  7. Jenkins:無效版本的SVN工作副本

20191127212134.png
微信掃一掃二維碼關注訂閱號傑哥技術分享
本文地址:https://www.cnblogs.com/Jack-Blog/p/10439325.html
作者博客:傑哥很忙
歡迎轉載,請在明顯位置給出出處及鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM