建立、測試及部署 .NET Core 應用程式

Azure DevOps Services |Azure DevOps Server 2020 |Azure DevOps Server 2019 |TFS 2018

使用管線自動建置及測試 .NET Core 專案。 瞭解如何執行下列工作:

注意

如需.NET Framework專案的協助,請參閱使用 .NET Framework 建置 ASP.NET 應用程式

注意

在 Microsoft Team Foundation Server (TFS) 2018 和舊版中,組建和發行管線稱為定義執行稱為組建服務連線稱為服務端點階段稱為環境,而作業稱為階段

建立您的第一個管線

您不熟悉Azure Pipelines嗎? 如果是,建議您先嘗試下一節。

建立 .NET 專案

如果您沒有要使用的 .NET 專案,請建立新的專案,並將程式碼上傳至GitHub存放庫或Azure Repos。 從安裝 最新的 .NET 6.0 SDK 開始。

建立新的 .NET 6 webapp。

dotnet new webapp -f net6.0

從相同的終端機會話,使用專案目錄中的 命令在 dotnet run 本機執行應用程式。

dotnet run

上傳您的程式碼

將程式碼Upload至新的 webapp GitHub或Azure Repos:

登入Azure Pipelines

登入Azure Pipelines。 登入之後,瀏覽器會前往 https://dev.azure.com/my-organization-name 並顯示您的Azure DevOps儀表板。

在您選取的組織內,建立 專案。 如果您的組織中沒有任何專案,您會看到建立 專案以開始使用 畫面。 否則,請選取儀表板右上角的 [建立Project] 按鈕。

建立管線

  1. 登入您的Azure DevOps組織,並移至您的專案。

  2. 移至Pipelines,然後選取 [新增管線]。

  3. 請先選取GitHub作為原始程式碼的位置,以執行精靈的步驟。

  4. 系統可能會將您重新導向至 GitHub 以進行登入。 若是如此,請輸入您的 GitHub 認證。

  5. 當您看到存放庫清單時,請選取您的存放庫。

  6. 您可能會重新導向至GitHub以安裝Azure Pipelines應用程式。 如果是,請選取 [核准 & 安裝]。

當 [設定] 索引標籤出現時,請選取[ASP.NET Core]。

  1. 檢查您的新管線,以查看 YAML 的功能。 當您準備好時,請選取 [ 儲存並執行]。

    Save and run button in a new YAML pipeline

  2. 將新的 azure-pipelines.yml 檔案認可至您的存放庫。 當您滿意訊息之後,請選取 [ 儲存],然後再次執行

    如果您想要監看管線運作,請選取建置作業。

    由於您的程式碼似乎與ASP.NET Core範本相符,因此我們會自動為您建立管線。

    您現在已在存放庫中 () 運作中的 YAML 管線 azure-pipelines.yml ,可供您自訂!

  3. 當您準備好變更管線時,請在[Pipelines]頁面中選取它,然後編輯檔案 azure-pipelines.yml

深入瞭解自訂管線的一些更常見方式。

YAML

  1. 在您的存放庫中新增檔案 azure-pipelines.yml 。 為您的組建自訂下列程式碼片段。
trigger:
- master

pool: Default

variables:
  buildConfiguration: 'Release'

# do this before all your .NET Core tasks
steps:
- task: DotNetCoreInstaller@2
  inputs:
    version: '2.2.402' # replace this value with the version that you need for your project
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
  1. 建立管線 並選取 YAML 範本。

  2. 設定管線的 Agent 集區和YAML 檔案路徑

  3. 儲存管線並將組建排入佇列。 當 [組建#nnnnnnnn.n] 已排入佇列 訊息時,請選取數位連結以查看管線運作情形。

  4. 當您準備好對管線進行變更時, 請加以編輯

深入瞭解自訂管線的一些更常見方式。

傳統

  1. 建立管線 並選取 空白管線 範本。

  2. 在工作目錄中,尋找並新增 .NET Core 工作。 下列工作會執行 dotnet build 以在範例存放庫中建置程式碼。

  3. 儲存管線並將組建排入佇列。 當 [組建#nnnnnnnn.n] 已排入佇列 訊息時,請選取數位連結以查看管線運作情形。

    您現在已有可自訂的工作管線!

  4. 當您準備好對管線進行變更時, 請加以編輯

深入瞭解自訂管線的一些更常見方式。

建置環境

使用 Azure Pipelines 建置 .NET Core 專案。 在Windows、Linux 或 macOS 上建置專案,而不需要設定基礎結構。 Azure Pipelines中的 Microsoft 裝載代理程式包含數個預先安裝的 .NET Core SDK 版本。

Ubuntu 18.04 是在 YAML 檔案中設定的。

pool:
  vmImage: 'ubuntu-18.04' # examples of other options: 'macOS-10.15', 'windows-2019'

如需進一步的範例,請參閱 Microsoft 裝載的代理程式 ,以取得完整的映射清單和 集區

Microsoft 裝載的代理程式不包含某些舊版的 .NET Core SDK。 它們通常也不會包含發行前版本。 如果您需要 Microsoft 裝載代理程式上的這類 SDK,請將 UseDotNet@2 工作新增至 YAML 檔案。

若要安裝用於建置的 5.0.x SDK 預覽版本,並安裝 3.0.x 以執行以 NET Core 3.0.x 為目標的測試,請新增下列程式碼片段:

steps:
- task: UseDotNet@2
  inputs:
    version: '5.0.x'
    includePreviewVersions: true # Required for preview versions

- task: UseDotNet@2
  inputs:
    version: '3.0.x'
    packageType: runtime

Windows代理程式已經包含 .NET Core 執行時間。 若要安裝較新的 SDK,請在下列程式碼片段中設定 performMultiLevelLookuptrue

steps:
- task: UseDotNet@2
  displayName: 'Install .NET Core SDK'
  inputs:
    version: 5.0.x
    performMultiLevelLookup: true
    includePreviewVersions: true # Required for preview versions

提示

若要節省執行工具安裝程式的成本,您可以設定 自我裝載的代理程式。 請參閱LinuxmacOSWindows。 如果您有大型存放庫或執行累加組建,您也可以使用自我裝載代理程式來節省額外的時間。 自我裝載代理程式也可以協助您使用預覽版或私人 SDK,這些 SDK 不是由Azure DevOps正式支援,或只有公司或內部部署環境才提供。

您可以在 Windows、Linux 或 macOS 上使用 .NET Core SDK 和執行時間來建置 .NET Core 專案。 您的組建會在 自我裝載代理程式上執行。 請確定您已在代理程式上安裝必要的 .NET Core SDK 和執行時間版本。

還原相依性

NuGet是依賴您未建置之程式碼的熱門方式。 您可以透過.NET Core工作或直接在管線的腳本中執行 dotnet restore 命令,下載專案檔中指定的NuGet套件和專案特定工具。

您可以從 Azure Artifacts、NuGet.org 或其他外部或內部NuGet存放庫下載NuGet套件。 .NET Core工作特別適用于從已驗證NuGet摘要還原套件。

此管線會在.NET Core CLI工作中使用 dotnet restore 成品摘要。

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  buildConfiguration: 'Release'

steps:
- task: DotNetCoreCLI@2
  inputs:
    command: 'restore'
    feedsToUse: 'select'
    vstsFeed: 'my-vsts-feed' # A series of numbers and letters

- task: DotNetCoreCLI@2
  inputs:
    command: 'build'
    arguments: '--configuration $(buildConfiguration)'
  displayName: 'dotnet build $(buildConfiguration)'

您可以從 NuGet.org 下載NuGet套件。

dotnet restore 內部會使用以 .NET Core SDK 封裝的 版本 NuGet.exedotnet restore 只能還原 .NET Core 專案 .csproj 檔中指定的套件。 如果您的方案中也有 Microsoft .NET Framework 專案,或使用 package.json 來指定相依性,請使用NuGet工作來還原這些相依性。

在 .NET Core SDK 2.0 版和更新版本中,執行 的其他命令 dotnet build 時,套件會自動還原。

在 .NET Core SDK 2.0 版和更新版本中,執行 的其他命令 dotnet build 時,套件會自動還原。 不過,如果您使用已驗證的摘要,您可能仍然需要使用 .NET Core 工作來還原套件。

當您從 NuGet.org 還原套件時,您的組建有時會失敗。您可以搭配上游來源使用Azure Artifacts,並快取套件。 當管線連接到Azure Artifacts時,會自動使用管線的認證。 這些認證通常衍生自Project 集合組建服務帳戶。

如果您想要指定NuGet存放庫,請將 URL NuGet.config 放在存放庫中的檔案中。 如果您的摘要經過驗證,請在 [服務] 索引標籤的 [Project 設定]底下建立NuGet服務連線來管理其認證。

如果您使用 Microsoft 裝載的代理程式,每次執行組建時都會取得新的電腦,這表示每次還原套件。 還原可能需要很長的時間。 若要減輕問題,您可以使用Azure Artifacts或自我裝載代理程式,並利用套件快取的優點。

若要從外部自訂摘要還原套件,請使用下列 .NET Core 工作:

# do this before your build tasks
steps:
- task: DotNetCoreCLI@2
  displayName: Restore
  inputs:
    command: restore
    projects: '**/*.csproj'
    feedsToUse: config
    nugetConfigPath: NuGet.config    # Relative to root of the repository
    externalFeedCredentials: <Name of the NuGet service connection>
# ...

如需NuGet服務連線的詳細資訊,請參閱發佈至NuGet摘要

  1. 選取管線中的 [ 工作 ]。 選取執行建置工作的作業。 然後,選取 + 即可將新工作新增至該作業。

  2. 在工作目錄中,尋找並新增 .NET Core 工作。

  3. 選取工作,然後針對 [命令] 選取 [還原]。

  4. 指定此工作所需的任何其他選項。 然後儲存組建。

注意

請確定已在檔案 NuGet.config 中指定自訂摘要,並在NuGet服務連線中指定認證。

建置您的專案

您可以在管線中執行 dotnet build 命令或使用 .NET Core 工作來建置 .NET Core 專案。

若要使用 .NET Core 工作來建置專案,請將下列程式碼片段新增至您的 azure-pipelines.yml 檔案:

steps:
- task: DotNetCoreCLI@2
  displayName: Build
  inputs:
    command: build
    projects: '**/*.csproj'
    arguments: '--configuration $(buildConfiguration)' # Update this to match your need

您可以在管線中執行任何自訂 dotnet 命令。 下列範例示範如何安裝和使用 .NET 全域工具 dotnetsay

steps:
- task: DotNetCoreCLI@2
  displayName: 'Install dotnetsay'
  inputs:
    command: custom
    custom: tool
    arguments: 'install -g dotnetsay'

組建

  1. 選取管線中的 [ 工作 ]。 選取執行建置工作的作業。 然後選取 + 以將新工作新增至該作業。

  2. 在工作目錄中,尋找並新增 .NET Core 工作。

  3. 選取工作,然後針對 [命令] 選取 [建置發佈]。

  4. 指定此工作所需的任何其他選項,然後儲存組建。

安裝工具

若要在 Windows 上執行的組建中安裝 .NET Core 全域工具,例如dotnetsay,請執行下列步驟:

  1. 新增 .NET Core 工作並設定下列屬性:

    • 命令:自訂。
      • 專案的路徑保留空白
    • 自訂命令:工具。
    • 引數install -g dotnetsay
  2. 新增 命令列 工作並設定下列屬性:

    • 腳本:dotnetsay

執行您的測試

如果您的存放庫中有測試專案,請使用 .NET Core 工作來執行單元測試,方法是使用 MSTest、xUnit 和 NUnit 等測試架構。測試專案必須參考 Microsoft.NET.Test.SDK 15.8.0 版或更高版本。 測試結果會自動發佈至服務。 您可以在組建摘要中取得這些結果,並可用於針對失敗的測試與測試計時分析進行疑難排解。

將下列程式碼片段新增至您的 azure-pipelines.yml 檔案:

steps:
# ...
# do this after other tasks such as building
- task: DotNetCoreCLI@2
  inputs:
    command: test
    projects: '**/*Tests/*.csproj'
    arguments: '--configuration $(buildConfiguration)'

替代方法是使用特定記錄器執行 dotnet test 命令,然後使用 發佈測試結果 工作:

steps:
# ...
# do this after your tests have run
- script: dotnet test <test-project> --logger trx
- task: PublishTestResults@2
  condition: succeededOrFailed()
  inputs:
    testRunner: VSTest
    testResultsFiles: '**/*.trx'

使用.NET Core工作搭配命令集進行測試。 專案的路徑 應該參考方案中的測試專案。

收集程式碼涵蓋範圍

如果您要建置在 Windows 平臺上,可以使用內建涵蓋範圍資料收集器來收集程式碼涵蓋範圍計量。 測試專案必須參考 Microsoft.NET.Test.SDK 15.8.0 版或更高版本。 如果您使用 .NET Core 工作來執行測試,則會自動將涵蓋範圍資料發佈至伺服器。 您可以從組建摘要下載.coverage檔案,以檢視Visual Studio。

將下列程式碼片段新增至您的 azure-pipelines.yml 檔案:

steps:
# ...
# do this after other tasks such as building
- task: DotNetCoreCLI@2
  inputs:
    command: test
    projects: '**/*Tests/*.csproj'
    arguments: '--configuration $(buildConfiguration) --collect "Code coverage"'

如果您選擇執行 dotnet test 命令,請指定測試結果記錄器和涵蓋範圍選項。 然後使用 [發佈測試結果] 工作:

steps:
# ...
# do this after your tests have run
- script: dotnet test <test-project> --logger trx --collect "Code coverage"
- task: PublishTestResults@2
  inputs:
    testRunner: VSTest
    testResultsFiles: '**/*.trx'
  1. 將 .NET Core 工作新增至建置作業,並設定下列屬性:

    • 命令:測試。
    • 專案的路徑應該參考方案中的測試專案
    • 引數--configuration $(BuildConfiguration) --collect "Code coverage"
  2. 確定 [ 發佈測試結果 ] 選項維持選取狀態。

使用 Coverlet 收集程式碼涵蓋範圍計量

如果您要在 Linux 或 macOS 上建置,您可以使用 Coverlet 或類似工具來收集程式碼涵蓋範圍計量。

您可以使用 [ 發佈程式碼涵蓋範圍結果 ] 工作,將程式碼涵蓋範圍結果發佈至伺服器。 涵蓋範圍工具必須設定為以 Cobertura 或 JaCoCo 涵蓋範圍格式產生結果。

若要使用 Coverlet 執行測試和發佈程式碼涵蓋範圍,請執行下列工作:

  • 在測試專案中新增NuGet套件的參考 coverlet.msbuild , (.NET 專案低於 .NET 5 的) 。 針對 .NET 5,新增NuGet套件的 coverlet.collector 參考。
  • 將下列程式碼片段新增至您的 azure-pipelines.yml 檔案:
- task: UseDotNet@2
  inputs:
    version: '5.0.x'
    includePreviewVersions: true # Required for preview versions
  
- task: DotNetCoreCLI@2
  displayName: 'dotnet build'
  inputs:
    command: 'build'
    configuration: $(buildConfiguration)
  
- task: DotNetCoreCLI@2
  displayName: 'dotnet test'
  inputs:
    command: 'test'
    arguments: '--configuration $(buildConfiguration) --collect:"XPlat Code Coverage" -- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=cobertura'
    publishTestResults: true
    projects: 'MyTestLibrary' # update with your test project directory
  
- task: PublishCodeCoverageResults@1
  displayName: 'Publish code coverage report'
  inputs:
    codeCoverageTool: 'Cobertura'
    summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'

封裝並傳遞您的程式碼

Upload要Azure Pipelines的組建輸出。 您可以建立和發佈NuGet套件,或將組建輸出封裝到要部署至 Web 應用程式的.zip檔案。

將成品發佈至Azure Pipelines

若要發佈 .NET 組建的輸出,請執行下列工作:

  • 在 CLI 上執行 dotnet publish --output $(Build.ArtifactStagingDirectory) ,或使用 publish 命令新增DotNetCoreCLI@2工作。
  • 使用 [發佈成品] 工作發佈成品。

將下列程式碼片段新增至您的 azure-pipelines.yml 檔案:

steps:

- task: DotNetCoreCLI@2
  inputs:
    command: publish
    publishWebProjects: True
    arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)'
    zipAfterPublish: True

# this code takes all the files in $(Build.ArtifactStagingDirectory) and uploads them as an artifact of your build.
- task: PublishPipelineArtifact@1
  inputs:
    targetPath: '$(Build.ArtifactStagingDirectory)' 
    artifactName: 'myWebsiteName'

注意

工作 dotNetCoreCLI@2 具有 publishWebProjects 預設設定為 true 的輸入。 此工作預設會發佈存放庫中 的所有 Web 專案。 您可以在GitHub 的開放原始碼工作中找到更多說明和資訊。

若要在發佈之前將更多檔案複製到建置目錄,請使用 公用程式:複製檔案

發佈至NuGet摘要

若要建立和發佈NuGet套件,請新增下列程式碼片段:

steps:
# ...
# do this near the end of your pipeline in most cases
- script: dotnet pack /p:PackageVersion=$(version)  # define version variable elsewhere in your pipeline
- task: NuGetAuthenticate@0
  input:
    nuGetServiceConnections: '<Name of the NuGet service connection>'
- task: NuGetCommand@2
  inputs:
    command: push
    nuGetFeedType: external
    publishFeedCredentials: '<Name of the NuGet service connection>'
    versioningScheme: byEnvVar
    versionEnvVar: version

如需版本設定和發佈NuGet套件的詳細資訊,請參閱發行至NuGet摘要

部署 Web 應用程式

若要建立可供發佈至 Web 應用程式的.zip檔案封存,請新增下列程式碼片段:

steps:
# ...
# do this after you've built your app, near the end of your pipeline in most cases
# for example, you do this before you deploy to an Azure web app on Windows
- task: DotNetCoreCLI@2
  inputs:
    command: publish
    publishWebProjects: True
    arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)'
    zipAfterPublish: True

若要將此封存發佈至 Web 應用程式,請參閱Azure Web Apps部署

將成品發佈至Azure Pipelines

使用[發佈Artifacts] 工作,將組建的輸出發佈至Azure Pipelines。

發佈至NuGet摘要

如果您想要將程式碼發佈至NuGet摘要,請執行下列步驟:

  1. 使用 .NET Core 工作搭配 命令 設定為 pack。

  2. 將您的套件發佈至NuGet摘要

部署 Web 應用程式

  1. 使用具有 命令 集的 .NET Core 工作來發佈。

  2. 請確定您已選取選項來建立.zip檔案封存。

  3. 若要將此封存發佈至 Web 應用程式,請參閱Azure Web Apps部署

建置映射並推送至容器登錄

針對您的應用程式,您也可以 建置映射 ,並將其 推送至容器登錄

疑難排解

如果您可以在開發電腦上建置專案,但無法在Azure Pipelines上建置專案,請探索下列可能的原因和更正動作:

  • 我們不會在 Microsoft 裝載的代理程式上安裝 .NET Core SDK 的發行前版本。 發行新版本的 .NET Core SDK 之後,可能需要數周才會推出至所有Azure Pipelines資料中心。 您不需要等候此首度發行完成。 您可以使用 .NET Core 工具安裝程式 ,在 Microsoft 裝載的代理程式上安裝您想要的 .NET Core SDK 版本。
  • 檢查開發電腦上的 .NET Core SDK 版本和執行時間,並確定它們符合代理程式。 您可以在管線中包含命令列腳本 dotnet --version ,以列印 .NET Core SDK 的版本。 使用 .NET Core 工具安裝程式 在代理程式上部署相同的版本,或將您的專案和開發電腦更新為較新版本的 .NET Core SDK。

  • 您可能在管線中未編碼的 Visual Studio IDE 中使用一些邏輯。 Azure Pipelines會在新進程中逐一執行工作中指定的每個命令。 檢查管線組建中的記錄,以查看在組建中執行的確切命令。 在開發電腦上以相同順序重複相同的命令,以找出問題。

  • 如果您有混合的解決方案包含一些 .NET Core 專案和一些.NET Framework專案,則也應該使用NuGet工作來還原檔案中指定的 packages.config 套件。 新增MSBuildVisual Studio建置工作,以建置.NET Framework專案。

  • 還原套件時,您的組建可能會間歇性失敗:NuGet.org 發生問題,或 Azure 資料中心與 NuGet.org 之間有網路問題。您可能會想要探索是否將 Azure Artifacts 與 NuGet.org 搭配使用,作為上游來源可改善組建的可靠性,因為它不在我們的控制中。

  • 有時候,當我們推出新版本的 .NET Core SDK 或Visual Studio時,您的組建可能會中斷。 例如,如果NuGet工具的較新版本或功能隨附于 SDK。 若要隔離此問題,請使用 .NET Core 工具安裝程式 工作來指定組建中使用的 .NET Core SDK 版本。

常見問題集

問:我可以在哪裡深入瞭解Azure Artifacts和 TFS 套件管理服務?

答:Azure Artifacts中的套件管理

問:我可以在哪裡深入瞭解 .NET Core 命令?

答: .NET Core CLI 工具

問:我可以在哪裡深入瞭解如何在解決方案中執行測試?

答: .NET Core 專案中的單元測試

問:我可以在哪裡深入瞭解工作?

答: 建置和發行工作