在持續整合 (CI) 環境中使用 .NET SDK

本文概述如何在組建伺服器上使用 .NET SDK 及其工具。 .NET 工具組可透過互動的方式運作,其中開發人員會在命令提示字元中輸入命令,然後持續整合 (CI) 伺服器便會自動執行組建指令碼。 命令、選項、輸入和輸出都是相同的,您只需要提供取得工具的方式和建置應用程式的系統。 本文著重於 CI 的工具取得案例,並包含設計建置指令碼並建立其結構的相關建議。

CI 組建伺服器的安裝選項

如果您使用 GitHub,則安裝很簡單。 您可以依賴 GitHub Actions 在工作流程中安裝 .NET SDK。 在工作流程中安裝 .NET SDK 的建議方式是使用 actions/setup-net-core-sdk 動作。 如需詳細資訊,請參閱 GitHub Marketplace 中的 設定 .NET Core SDK 動作。 如需運作方式的範例,請參閱快速入門:建立組建驗證 GitHub 工作流程

原生安裝程式

有針對 macOS、Linux 及 Windows 提供原生安裝程式。 安裝程式需要組建伺服器的管理員 (sudo) 存取權。 使用原生安裝程式的優點在於它會安裝工具執行時所需的所有原生相依性。 原生安裝程式也提供 SDK 的全系統安裝。

macOS 使用者應使用 PKG 安裝程式。 在 Linux 上,您可以選擇使用摘要套件管理員 (例如適用於 Ubuntu 的 apt-get 或適用於 CentOS 的 yum),或使用套件本身 (DEB 或 RPM)。 在 Windows 上請使用 MSI 安裝程式。

您可以在 .NET Core 下載 \(英文\) 找到最新的穩定二進位檔。 如果您想要使用最新 (但可能不穩定) 的發行前版本工具,請使用 dotnet/installer GitHub 存放庫所提供的連結。 針對 Linux 發行版本,可使用 tar.gz 封存 (也稱為 tarballs);請使用封存內的安裝指令碼來安裝 .NET。

安裝程式指令碼

使用安裝程式指令碼可以在您的組建伺服器上進行非系統管理安裝,以及輕鬆地將取得工具的作業自動化。 指令碼會負責下載工具,然後將工具解壓縮至預設或指定位置以供使用。 您也可以指定要安裝的工具版本,以及指定要安裝整個 SDK 或只安裝共用執行階段。

在建置開始時,安裝程式指令碼會自動執行,以擷取和安裝所需的 SDK 版本。 「所需版本」是您專案所需建置的任何 SDK 版本。 指令碼可讓您將 SDK 安裝在伺服器上的本機目錄中,從安裝位置執行工具,然後在建置之後清除 (或讓 CI 服務清除)。 這可以為整個建置程序提供封裝和隔離。 您可以在 dotnet-install 一文中找到安裝指令碼參考。

注意

Azure DevOps Services

使用安裝程式指令碼時,不會自動安裝原生相依性。 如果作業系統沒有原生相依性,您必須加以安裝。 如需詳細資訊,請參閱 .NET 相依性和需求

CI 設定範例

本節描述如何使用 PowerShell 或 Bash 指令碼進行手動設定,以及描述軟體即服務 (SaaS) CI 解決方案。 涵蓋的 SaaS CI 解決方案包括 Travis CIAppVeyorAzure Pipelines。 如需 GitHub Actions,請參閱 GitHub Actions 和 .NET

手動設定

每個 SaaS 服務都有自己用於建立和設定建置程序的方法。 如果您使用上面未列出的其他 SaaS 解決方案,或需要進行超出預先封裝支援的自訂作業,就必須至少執行一些手動設定。

在一般情況下,手動設定需要您取得某一版本的工具 (或該工具的最新每晚組建),然後執行您的建置指令碼。 您可以使用 PowerShell 或 Bash 指令碼協調 .NET 命令,或使用概述組建流程的專案檔。 協調流程小節能提供這些選項的更多詳細資料。

在您建立執行手動 CI 組建伺服器設定的指令碼之後,請在您的開發電腦上使用該指令碼,以在本機針對測試目的建置程式碼。 一旦您確認指令碼可在本機正常執行之後,請將它部署到 CI 組建伺服器。 一個相對簡單的 PowerShell 指令碼能示範如何取得 .NET SDK,並將它安裝在 Windows 組建伺服器上:

您可以在指令碼結尾處提供建置程序的實作。 指令碼會取得工具,然後執行您的建置程序。

$ErrorActionPreference="Stop"
$ProgressPreference="SilentlyContinue"

# $LocalDotnet is the path to the locally-installed SDK to ensure the
#   correct version of the tools are executed.
$LocalDotnet=""
# $InstallDir and $CliVersion variables can come from options to the
#   script.
$InstallDir = "./cli-tools"
$CliVersion = "6.0.7"

# Test the path provided by $InstallDir to confirm it exists. If it
#   does, it's removed. This is not strictly required, but it's a
#   good way to reset the environment.
if (Test-Path $InstallDir)
{
    rm -Recurse $InstallDir
}
New-Item -Type "directory" -Path $InstallDir

Write-Host "Downloading the CLI installer..."

# Use the Invoke-WebRequest PowerShell cmdlet to obtain the
#   installation script and save it into the installation directory.
Invoke-WebRequest `
    -Uri "https://dot.net/v1/dotnet-install.ps1" `
    -OutFile "$InstallDir/dotnet-install.ps1"

Write-Host "Installing the CLI requested version ($CliVersion) ..."

# Install the SDK of the version specified in $CliVersion into the
#   specified location ($InstallDir).
& $InstallDir/dotnet-install.ps1 -Version $CliVersion `
    -InstallDir $InstallDir

Write-Host "Downloading and installation of the SDK is complete."

# $LocalDotnet holds the path to dotnet.exe for future use by the
#   script.
$LocalDotnet = "$InstallDir/dotnet"

# Run the build process now. Implement your build script here.

Travis CI

您可以將 Travis CI 設定成使用 csharp 語言和 dotnet 索引鍵來安裝 .NET SDK。 如需詳細資訊,請參閱有關建置 C#、F# 或 Visual Basic 專案 \(英文\) 的官方 Travis CI 文件。 在您存取 Travis CI 資訊時,請留意這個由社群維護的 language: csharp 語言識別碼可適用於所有 .NET 語言,包括 F# 和 Mono。

Travis CI 會在建置矩陣中執行 macOS 和 Linux 作業,您可以在該矩陣中指定執行階段、環境及排除項/包含項的組合,以涵蓋應用程式的組建組合。 如需詳細資訊,請參閱 Travis CI 文件中的 Customizing the Build (自訂組建) 一文。 MSBuild 型工具組套件中包含長期支援 (LTS) 和標準長期支援 (STS) 執行階段;因此,藉由安裝 SDK,您會獲得建置所需的一切項目。

AppVeyor

AppVeyor 會搭配 Visual Studio 2022 組建背景工作角色映像安裝 .NET 6 SDK。 還有其他具有不同 .NET SDK 版本的組建映像可供使用。 如需詳細資訊,請參閱 AppVeyor 文件中的 組建背景工作角色映像 文章。

系統會使用安裝指令碼將 .NET SDK 二進位下載至子目錄並加以解壓縮,然後將它們新增至 PATH 環境變數。 新增一個組建矩陣,以執行與多個 .NET SDK 版本的整合測試:

environment:
  matrix:
    - CLI_VERSION: 6.0.7
    - CLI_VERSION: Latest

Azure DevOps Services

設定 Azure DevOps Services 以使用以下其中一種方式組建 .NET 專案:

  • 使用您的命令從手動設定步驟執行指令碼。
  • 建立由數個設定為使用 .NET 工具的 Azure DevOps Services 內建組建工作所組成的組建。

這兩種解決方案都是可行的。 您可以使用手動設定指令碼來控制接收到的工具版本,因為那些工具是以組建之一部分的形式下載的。 組建會從您必須建立的指令碼執行。 本文僅涵蓋手動選項。 如需有關使用 Azure DevOps Services 建置工作來組成組建的詳細資訊,請參閱 Azure Pipelines\(英文\) 文件。

若要在 Azure DevOps Services 中使用手動設定指令碼,請建立新的組建定義,並指定要針對建置步驟執行的指令碼。 這可使用 Azure DevOps Services 使用者介面來完成:

  1. 從建立新的組建定義開始。 當您抵達會提供選項以定義要建立哪一種組建的畫面時,請選取 [空] 選項。

    Selecting an empty build definition

  2. 設定要建置的存放庫之後,系統就會將您導向至組建定義。 選取 [加入建置步驟]

    Adding a build step

  3. 系統會向您顯示 [工作目錄]。 目錄中包含您在組建中使用的工作。 因為您有指令碼,請選取 [PowerShell: 執行 PowerShell 指令碼] 的 [新增] 按鈕。

    Adding a PowerShell script step

  4. 設定建置步驟。 從您正在建置的存放庫加入指令碼:

    Specifying the PowerShell script to run

協調組建

本文件大部分內容為描述如何取得 .NET 工具及設定各種 CI 服務,並沒有提供如何使用 .NET 來協調或 實際組建 程式碼的相關資訊。 建置程序的結構方式取決於許多因素,無法在這裡以一一涵蓋。 如需有關使用各項技術來協調組建的詳細資訊,請探索 Travis CIAppVeyorAzure Pipelines 文件集內所提供的資源與範例。

使用 .NET 工具建立 .NET 程式碼組建流程的結構時,可以採取兩種方法: 直接使用 MSBuild,或使用 .NET 命令列命令。 您可以視自己對特定方法的熟悉程度並權衡其複雜度,來選擇要使用的方法。 MSBuild 可讓您以工作和目標的形式表示建置程序,但使用此方法必須額外學習 MSBuild 專案檔語法。 使用 .NET 命令列工具或許比較簡單,但您必須使用如 bash 或 PowerShell 之類的指令碼語言撰寫協調流程邏輯。

提示

您要為 true 設定的其中一個 MSBuild 屬性是 ContinuousIntegrationBuild。 此屬性可啟用僅適用官方組建 (而非本機開發組建) 的設定。

另請參閱