建立、測試及部署 .NET Core 應用程式
Azure DevOps Services |Azure DevOps Server 2020 |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
上傳您的程式碼
將程式碼Upload至新的 webapp GitHub或Azure Repos:
登入Azure Pipelines
登入Azure Pipelines。 登入之後,瀏覽器會前往 https://dev.azure.com/my-organization-name
並顯示您的Azure DevOps儀表板。
在您選取的組織內,建立 專案。 如果您的組織中沒有任何專案,您會看到建立 專案以開始使用 畫面。 否則,請選取儀表板右上角的 [建立Project] 按鈕。
建立管線
登入您的Azure DevOps組織,並移至您的專案。
移至Pipelines,然後選取 [新增管線]。
請先選取GitHub作為原始程式碼的位置,以執行精靈的步驟。
系統可能會將您重新導向至 GitHub 以進行登入。 若是如此,請輸入您的 GitHub 認證。
當您看到存放庫清單時,請選取您的存放庫。
您可能會重新導向至GitHub以安裝Azure Pipelines應用程式。 如果是,請選取 [核准 & 安裝]。
當 [設定] 索引標籤出現時,請選取[ASP.NET Core]。
檢查您的新管線,以查看 YAML 的功能。 當您準備好時,請選取 [ 儲存並執行]。
將新的 azure-pipelines.yml 檔案認可至您的存放庫。 當您滿意訊息之後,請選取 [ 儲存],然後再次執行 。
如果您想要監看管線運作,請選取建置作業。
由於您的程式碼似乎與ASP.NET Core範本相符,因此我們會自動為您建立管線。
您現在已在存放庫中 () 運作中的 YAML 管線
azure-pipelines.yml
,可供您自訂!當您準備好變更管線時,請在[Pipelines]頁面中選取它,然後編輯檔案
azure-pipelines.yml
。
深入瞭解自訂管線的一些更常見方式。
YAML
- 在您的存放庫中新增檔案
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)'
建立管線 並選取 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 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,請在下列程式碼片段中設定 performMultiLevelLookup
為 true
:
steps:
- task: UseDotNet@2
displayName: 'Install .NET Core SDK'
inputs:
version: 5.0.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:
- 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.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 集合組建服務帳戶。
如果您想要指定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摘要。
選取管線中的 [ 工作 ]。 選取執行建置工作的作業。 然後,選取 + 即可將新工作新增至該作業。
在工作目錄中,尋找並新增 .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'
組建
選取管線中的 [ 工作 ]。 選取執行建置工作的作業。 然後選取 + 以將新工作新增至該作業。
在工作目錄中,尋找並新增 .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: '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摘要,請執行下列步驟:
使用 .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 命令?
問:我可以在哪裡深入瞭解如何在解決方案中執行測試?
問:我可以在哪裡深入瞭解工作?
答: 建置和發行工作