首頁

目前文章總數:203 篇

  

最後更新:2025年 10月 25日

0104. 避免 .NET Runtime 版本差異:開發與 Jenkins 的對策 & 如何查閱最新 .Net Runtime 更新

日期:2025年 11月 29日

標籤: Asp.NET Core Asp.NET Core Web MVC C# Docker dotnet runtime Jenkins Continuous Integration(CI) Continuous Deployment(CD)

摘要:C# 學習筆記


範例所需:1. Visual Studio 2022 以上版本
     2. Linux 主機(本篇用 Ubuntu 22.04)
     3. Linux 主機已安裝 Docker
     4. CICD 環境(本篇用 Jenkins)
解決問題:1. 如何排查自己的開發專案用的 .NET 版本
     2. 如何查閱官方的 .NET 版本更新內容
     3. 如何容器化 CID 中指定固定的 .NET 版本,並且說明常見的問題
基本介紹:本篇分為五大部分。
第一部分:問題描述
第二部分:檢查版本更新
第三部分:架構環境 & 解決方案
第四部分:DEMO 成果
第五部分:補充 CICD 實際遇到的問題 & 解法






第一部分:問題描述

Step 1:問題描述 - MicroSoft 釋出更新

進入官方的.Net 下載首頁,可以看到最新發行日期
問題1:我們怎麼知道自己 開發的專案 .NET 主版本與當前使用的是哪個版本號呢?
問題2:怎麼查閱官方的更新內容




第二部分:檢查專案版本

Step 1:專案使用的主版本 - 專案屬性

開啟專案 -> 滑鼠右鍵選擇自己的專案 -> 滑鼠左鍵點擊屬性


Step 2:專案使用的主版本 - 獲得主版本號

可以觀察到 目標Framework 的值為 .NET 8.0


對比官方的.Net 下載首頁,可以知道此專案主版本號為 .NET 8.0


Step 3:專案使用的修訂版本號 - 獲得當前 Runtime

無論 windows , Linux 可以在執行 dotnet 運行的機器上輸入以下指令

dotnet --info


可取得該機器當前運行 dotnet 指令時,使用的 runtime
※以此例該機器為 .NET 8.0.10


Step 4:補充 - 版本號定義

以 .NET 8.0.10 範例來說,有以下定義

主版本號.次版本號.修補版本號
項目 說明
主版本號 8 代表主要版本,通常對應一個長期支援 (LTS) 或標準支援 (STS) 的重大更新。
次版本號 0 表示 功能階段 或 大方向維持不變 的版本; .NET 中通常固定為 0,代表這是該主版本下的基礎系列(例如 8.0.x)。
修補版本號 10 代表 累積修補 (Patch) 或 安全性更新 的版本次數,因此 8.0.10 表示 8 版修補了 10 次



Step 5:補充 - 如何知道更新內容

進入官方的英文.Net 下載首頁,點擊黑框處


以 .NET 8.0 舉例,選擇 All .NET 8.0 downloads


選擇 Release Notes


.NET 8.0 SDK 對應的 .NET Runtime 有 8.0.415 / 8.0.318 / 8.0.121 ,但我們目的是知道最新的更新內容為何


繼續往下拉到 Notable Changes ,會列出最新版本的更新內容,有三個項目

CVE-2025-55248
CVE-2025-55315
CVE-2025-55247




點擊 CVE-2025-55248 會跳轉到 CVE 的報告內容,可以知道 Microsoft 修正了的內容、嚴重性為何




第三部分:架構環境 & 解決方案

Step 1:架構環境 - 容器化部署

以此架構為例

1. Jenkins(CI) 建立 Docker Container 的 Image 依照自己的 Web App 的 Dokcerfile 生成
2. Deploy(CD) 將 Image 上傳到遠端伺服器
3. 遠端機器運行(CD) 容器化運行 Web 應用程式(App)




Step 2:生成 Image 使用版本判斷 - CI端檢查

以此架構為例,使用的 .NET runitme 會在 Jenkins Server 上,生成 Image 時會決定使用的版本

1. Jenkins(CI) 建立 Docker Container 的 Image 依照自己的 Web App 的 Dokcerfile 生成
2. Deploy(CD) 將 Image 上傳到遠端伺服器
3. 遠端機器運行(CD) 容器化運行 Web 應用程式(App)




Step 3:生成 Image 使用版本判斷 - 浮動 - DockerFile

容器化的部署中,Jenkins 扮演 CI 角色,能定義容器化的使用過程在 DockerFile
以此腳本為例 aspnet:8.0 會基於 .NET 8.0 主版本,然後自動找出合適的 .NET runtime,依此資料來看 2025/10/14 的 8.0.21 是當前最新版本
通常修訂號會讓其 自動 抓最新,因為都是修復主版本號的問題,多半與 安全性漏洞 相關的問題,建議自動更新

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base

ENV ASPNETCORE_ENVIRONMENT=Development

WORKDIR /app
EXPOSE 8080
EXPOSE 8081

COPY ./publish .

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone

ENTRYPOINT ["dotnet", "YourWebApplication.dll"]



Step 4:指定固定版本 - DockerFile

若要指定特別版本號,可以將第一行替換成以下,貼上固定的 Patch 修訂號 (21)

FROM mcr.microsoft.com/dotnet/aspnet:8.0.21 AS base



補充評估方式:

※是否自動更新還需考量來源的更新頻率、是否穩定。EX: Beta 版本建議用 **固定** 而非 **浮動**,因為主版本都尚未穩定,會很頻繁更新
※從而導致當前可相依版本異常





第四部分:DEMO 成果

Step 1:檢查容器運行的版本 - 架構位置

我們在調整完畢 DockerFile 後,在進行 CICD 部署,最終只需確認 Container 上使用的 .NET 版本為何
因此要遠端登入 CD 的機器


Step 2:檢查容器運行的版本 - 訪問機器

登入容器運行的機器,輸入以下

docker exec -it 您的容器名稱 bash


輸入以下檢視 .NET 安裝的內容

docker --info




Step 3:檢查容器運行的版本 - 檢查內容

可以獲得以下的資訊,其中最關鍵的是版號資訊 => 8.0.21

.NET runtimes installed:
  Microsoft.AspNetCore.App 8.0.21 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 8.0.21 [/usr/share/dotnet/shared/Microsoft.NETCore.App]


可以確定我們容器化的 Web 應用程式使用的版本號為何




第五部分:補充 CICD 實際遇到的問題 & 解法

Step 1:自動化遇到的問題 - 用到舊的版本

在此 DockerFile 腳本中,會抓取 aspnet:8.0 的映像檔案當 Base
有可能遇到為何 使用到舊的版本 以此 DockerFile 為例應為 8.0.21(自動抓取),但是自動化部署永遠都是固定版本 (EX: 8.0.7 等等)

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base

ENV ASPNETCORE_ENVIRONMENT=Development

WORKDIR /app
EXPOSE 8080
EXPOSE 8081

COPY ./publish .

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' > /etc/timezone

ENTRYPOINT ["dotnet", "YourWebApplication.dll"]



Step 3:舊的版本解法 - 檢查映像檔案

輸入以下指令,檢查 DockerFile 中使用的 Image

docker images


以此範例為使用

docker images |grep mcr.microsoft.com/dotnet/aspnet


我們可以觀察到有可能第一次抓取 aspnet 映像檔案在很久以前,因此版本每次更新時都會使用此版本,不會重抓


Step 3:舊的版本解法 - 刪除緩存映像檔 - 完成

因此遇到此狀況,可以手動刪除映像檔,如下指令:

docker image rm mcr.microsoft.com/dotnet/aspnet:8.0


再次進行 CICD 自動化建置就能 自動 使用最新版本的 .NET runtime