建立、測試及部署 .NET Core 應用程式
Azure DevOps Services |Azure DevOps Server 2022 - Azure DevOps Server 2019 |TFS 2018
使用管線自動建置及測試 .NET Core 專案。 瞭解如何執行下列工作:
- 使用Microsoft裝載或自我裝載的代理程式來設定組建環境。
- 還原相依性、建置您的專案,並使用 .NET Core CLI 工作 或 腳本進行測試。
- 使用 發佈程式碼涵蓋範圍工作 來發佈程式碼涵蓋範圍結果。
- 使用 .NET Core CLI 工作 和 發佈組建成品工作封裝並傳遞程式碼。
- 發佈至 NuGet 摘要。
- 將您的 Web 應用程式部署至 Azure。
注意
如需.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
上傳您的程式碼
將您的程式碼上傳至新的 Webapp GitHub 或Azure Repos:
登入 Azure Pipelines
登入 Azure Pipelines。 登入之後,您的瀏覽器會前往 https://dev.azure.com/my-organization-name
並顯示您的 Azure DevOps 儀表板。
在您選取的組織內,建立一個「專案」。 如果您的組織中沒有任何專案,您會看到 [建立專案開始使用] 畫面。 否則,請選取儀表板右上角的 [ 新增專案 ] 按鈕。
建立管線
登入您的 Azure DevOps 組織並移至您的專案。
前往 [管線],然後選取 [新增管線]。
執行精靈的步驟,首先選取 [GitHub] 作為您的原始程式碼位置。
系統可能會將您重新導向至 GitHub 以進行登入。 若是如此,請輸入您的 GitHub 認證。
當您看到存放庫清單時,請選取您的存放庫。
系統可能會將您重新導向至 GitHub 以安裝 Azure Pipelines 應用程式。 如果發生此情況,請選取 [核准] & [安裝]。
在 [設定] 索引標籤出現時,選取 [ASP.NET Core]。
檢查您的新管線,以查看 YAML 的功能。 當您準備好時,請選取 [儲存並執行]。
將新的 azure-pipelines.yml 檔案認可至您的存放庫。 當您滿意訊息之後,請選取 [ 儲存],然後再次執行 。
如果您想要監看管線運作,請選取建置作業。
由於您的程式碼似乎與ASP.NET Core範本相符,因此我們會自動為您建立管線。
您現在已在存放庫中 () 運作中的 YAML 管線
azure-pipelines.yml
,可供您自訂!當您準備好變更管線時,請在 [ 管線 ] 頁面中選取它,然後 編輯 檔案
azure-pipelines.yml
。
深入瞭解自訂管線的一些更常見方式。
YAML
- 在您的存放庫中新增檔案
azure-pipelines.yml
。 為您的組建自訂下列程式碼片段。
trigger:
- main
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)'
建立管線 並選取 YAML 範本。
設定管線的 Agent 集區和YAML 檔案路徑 。
儲存管線並將組建排入佇列。 當 [組建#nnnnnnnn.n] 已排入佇列 訊息時,請選取數位連結以查看管線運作情形。
當您準備好對管線進行變更時, 請加以編輯 。
深入瞭解自訂管線的一些更常見方式。
傳統
建立管線 並選取 空白管線 範本。
在工作目錄中,尋找並新增 .NET Core 工作。 下列工作會執行
dotnet build
以在範例存放庫中建置程式碼。儲存管線並將組建排入佇列。 當 [組建#nnnnnnnn.n] 已排入佇列 訊息時,請選取數位連結以查看管線運作情形。
您現在已有可自訂的工作管線!
當您準備好對管線進行變更時, 請加以編輯 。
深入瞭解自訂管線的一些更常見方式。
建置環境
使用 Azure Pipelines 建置 .NET Core 專案。 在 Windows、Linux 或 macOS 上建置專案,而不需要設定基礎結構。 Azure Pipelines 中的Microsoft裝載代理程式包含數個預先安裝的 .NET Core SDK 版本。
Ubuntu 是在 YAML 檔案中設定的。
pool:
vmImage: 'ubuntu-latest'
如需映射的完整清單和集區,請參閱Microsoft裝載的代理程式,以取得進一步的範例。
Microsoft裝載的代理程式不包含某些舊版的 .NET Core SDK。 它們通常也不會包含發行前版本。 如果您需要Microsoft裝載代理程式上的這類 SDK,請將UseDotNet@2工作新增至 YAML 檔案。
若要安裝 6.0.x SDK 以進行建置,請新增下列程式碼片段:
steps:
- task: UseDotNet@2
inputs:
version: '6.x'
Windows 代理程式已經包含 .NET Core 執行時間。 若要安裝較新的 SDK,請在下列程式碼片段中設定 performMultiLevelLookup
為 true
:
steps:
- task: UseDotNet@2
displayName: 'Install .NET Core SDK'
inputs:
version: 6.x
performMultiLevelLookup: true
includePreviewVersions: true # Required for preview versions
您可以在 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:
- main
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.exe
版本。 dotnet 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 Collection Build Service 帳戶。
如果您想要指定 NuGet 存放庫,請將 URL NuGet.config
放在存放庫中的檔案中。
如果您的摘要經過驗證,請在 [專案設定] 下的 [服務] 索引標籤中建立 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 摘要。
選取管線中的 [ 工作 ]。 選取執行建置工作的作業。 然後,選取 + 即可將新工作新增至該作業。
在工作目錄中,尋找並新增 .NET Core 工作。
選取工作,然後針對 [命令] 選取 [還原]。
指定此工作所需的任何其他選項。 然後儲存組建。
注意
請確定已在檔案 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'
Build
選取管線中的 [ 工作 ]。 選取執行建置工作的作業。 然後選取 + 以將新工作新增至該作業。
在工作目錄中,尋找並新增 .NET Core 工作。
選取工作,然後針對 [命令] 選取 [建置 或 發佈]。
指定此工作所需的任何其他選項,然後儲存組建。
安裝工具
若要在 Windows 上執行的組建中安裝 .NET Core 全域工具,例如 dotnetsay ,請執行下列步驟:
新增 .NET Core 工作並設定下列屬性:
- 命令:自訂。
- 專案的路徑: 保留空白。
- 自訂命令:工具。
- 引數:
install -g dotnetsay
。
- 命令:自訂。
新增 命令列 工作並設定下列屬性:
- 腳本:
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'
將 .NET Core 工作新增至建置作業,並設定下列屬性:
- 命令:測試。
- 專案的路徑: 應該參考方案中的測試專案。
- 引數:
--configuration $(BuildConfiguration) --collect "Code coverage"
。
確定 [ 發佈測試結果 ] 選項維持選取狀態。
使用 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: '6.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'
封裝並傳遞您的程式碼
將組建輸出上傳至 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
使用 [發佈成品] 工作 ,將組建的輸出發佈至 Azure Pipelines。
發佈至 NuGet 摘要
如果您想要將程式碼發佈至 NuGet 摘要,請執行下列步驟:
使用 .NET Core 工作搭配 命令 設定為 pack。
部署 Web 應用程式
使用 .NET Core 工作搭配 命令 集來發佈。
請確定您已選取選項來建立.zip檔案封存。
若要將此封存發佈至 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
套件。 新增MSBuild或Visual 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 套件管理服務?
問:我可以在哪裡深入瞭解 .NET Core 命令?
問:我可以在哪裡深入瞭解如何在解決方案中執行測試?
問:我可以在哪裡深入瞭解工作?
答: 建置和發行工作