NuGet restore error NU1803

2023/11/26 update: Microsoft NuGet team 的新計劃:HTTPS Everywhere Update,筆記可以參考 NuGet 設定 Insecure HTTP source 或是 停用 C# 編譯時特定的警告

原本團隊使用 .NET SDK 6.0.201 ,考慮到近期幾個更新可能有助於產品減少錯誤與增進效能,所以團隊便著手相應的升級動作,因為產品建立初期,團隊就已經決定使用 container 技術,因此在升級過程中並沒有遇到什麼困難:只要把 base image 改成新版 (.NET SDK 6.0.400.NET Runtime 6.0.8) 整個升級就算完成了,跟過去逐一升級 server 的做法相比省事不少

升級完成後一周,同事反應某個專案 build fail,原本都已經 revert change 了,經過一番抽絲撥繭後釐清了問題,快速紀錄一下過程

基本環境說明

  1. macOS Monterey 12.5.1
  2. .NET SDK 6.0.400
  3. .NET Runtime 6.0.8
  4. NuGet 5.9.0.7134|6.3.0.128

錯誤訊息與截圖

  1. 錯誤訊息

    [36mtest-target_1        | [0m /src/src/xxxxxxxxx.Common.CacheData/xxxxxxxxx.Common.CacheData.csproj : error NU1803: You are running the 'restore' operation with an 'HTTP' source, 'http://team.sb.xxxxxxxxx.com:8081/repository/nuget-group/'. Non-HTTPS access will be removed in a future version. Consider migrating to an 'HTTPS' source. [/src/xxxxxxxxx.Common.sln]
    [36mtest-target_1        | [0m   Failed to restore /src/src/xxxxxxxxx.Common.CacheData/xxxxxxxxx.Common.CacheData.csproj (in 1.39 sec).
    
  2. 錯誤截圖

    1error

Troubleshoot 過程

  1. 疑點一:同個 build job 其他 project 都 build success

    • 推測是該 project 有特殊設定或是安裝特殊套件造成的
    • 檢查 .csproj 檔案發現 TreatWarningsAsErrors 設定為 true

      2treatwarningaserror

  2. 疑點二:這個設定是在 2019 加上的,為什麼現在才有問題

    • NuGet HTTPS everywhere

      經過 google 發現了 Microsoft 在 2022/08/09 發表了NuGet HTTPS everywhere 的計劃,其中重點如下

      • NuGet 6.3 開始導入 NuGet Warning NU1803 用來提示使用了非 HTTPS 的 NuGet 資源
      • 2023/11 開始會將 NU1803 (使用了非 HTTPS 的 NuGet 資源) 從 warning 改為 error,但允許設定忽略
      • 2024/11 開始 NU1803 (使用了非 HTTPS 的 NuGet 資源) 的 error 將無法設定忽略
    • NuGet 6.3 會內建在 .NET SDK 6.0.400

      3sdk604

  3. 疑點三:local build 沒有出現 NU1803 的 warning

    • 雖然已安裝 .NET SDK 6.0.400 但 NuGet 仍是舊版

      我沒有花時間去找原因,不知道是不是我透過 brew 升級 .NET SDK 的關係還是 macOS 的關係

      4nuget59

    • nuget cli 無法升級至 NuGet 6.3

      2022/08/26 只能升到 NuGet 6.2.1

      sudo nuget update -self
      

      5nuget62

心得

近期都在忙 SRE 相關工作,好一陣子沒碰 .NET 生態系,這次遇到的問題也算是跨了兩個領域:DevOps 跟 .NET,雖然是 CI/CD 過程的問題,但根本原因還是 .NET 生態系造成的,每次遇到這類問題都能展現 DevOps 跟 SRE 的價值,不過回頭重新檢查似乎也沒那麼偉大XD

2023/11/26 update: Microsoft NuGet team 的新計劃:HTTPS Everywhere Update,筆記可以參考 NuGet 設定 Insecure HTTP source 或是 停用 C# 編譯時特定的警告

參考資訊

  1. NuGet Warning NU1803
  2. HTTPS everywhere
  3. NuGet 6.3
  4. HTTPS Everywhere Update
  5. NuGet 設定 Insecure HTTP source
  6. 停用 C# 編譯時特定的警告