無網路環境下,使用 Jenkins 編譯 .NET Core 並解決 NuGet 套件缺失問題

近期需要在無網路的環境下透過 Jenkins 來編譯 Dotnet Core,在編譯的過程中發生了以下錯誤訊息,但是我卻又無法透過錯誤訊息得知到底是缺少了哪個 nuget package

示意圖

會有這樣的問題,主因當然是缺少了必要的 nuget package,在執行 dotnet build 的時候,如果有缺少 package,就會連線到 api.nuget.org 來抓取,而我的環境又無法連外,所以當然會出現錯誤訊息。

dotnet resore 錯誤訊息

warning NU1900: 取得套件弱點資料時發生錯誤: 無法載入來源 https://api.nuget.org/v3/index.json 的服務索引。

為了要得知到底是缺少了哪個 package,首先要先確認 Jenkins 執行時是使用哪個帳號執行,因為這會和你在命令列處理時使用的帳號不一樣,帳號不一樣,設定檔的位置也會有所不同。

先在 pipeline 來判斷是使用哪個帳號執行

stage('Debug NuGet Config') {
	steps {
		bat '''
			whoami
			echo %APPDATA%
			dir %APPDATA%\\NuGet
			dotnet nuget locals all --list
		'''
	}
}
像我自己 Jenkins 執行時使用的帳號是 nt authority\system ,而對應的 nuget.config 如下
C:\Windows\System32\config\systemprofile\AppData\Roaming\NuGet
接下來修改以下內容,加入 clear 的目的在於,我不想要讓他最後又連接到 api.nuget.org 
<?xml version="1.0" encoding="utf-8"?>
<configuration>    
  <packageSources>
    <clear/>        
    <add key="offline" value="C:\nuget\packages" />
  </packageSources>
</configuration>
如果沒有加上 clear ,實際上在執行的時候,還會再去 %ProgramFiles(x86)%\NuGet\Config\ 檢查檔案是否存在,所以訊息上面會額外顯示 Microsoft Visual Studio Offline Packages ,而我自己的習慣是加上 clear 。

之後再執行 dotnet build 就會逐一列出缺少哪些項目,再把這些項目補齊就可以正常編譯了。

 ※延伸閱讀


    Blogger Comment

0 意見: