![](/img/trans.png)
[英]Azure DevOps pipeline get DACPAC from Solution with Asp.Net MVC + Database Projects
[英]Azure DevOps Pipepine with YAML for solution with many projects
我在 Visual Studio 2019 中有一個 .NET MVC 解決方案,其中包含 3 個項目:
在 Azure DevOps Pipelines 中,我想為
AdminWebApp
和
FrontWebApp
這兩者都將包含
共享代碼
因為它包含助手等。我想用 YAML 方式來做。 我應該創建 1 個還是 2 個管道(每個工件稍后將發布到它自己的 Azure 應用服務)? 實現它的YAML代碼是什么?
管理和發布周期的樣子真的很重要。 最純粹的方法是每次都重新部署所有內容。 現實的方法是在有意義時將部署管道組合在一起。
關於以“YAML方式”做什么。 會考慮使用YAML 模板
模板參數將至少由項目的目錄來構建。 這是 .net 核心模板的示例,但會讓您了解思考過程:例如,此 YAML 文件將被稱為 build-corewebapp.yml
parameters:
SolutionPath: ''
BuildConfiguration: 'Release'
projectName: ''
DependsOn: []
publish: 'false'
jobs:
- job: Build_${{ parameters.projectName }}
dependsOn: ${{ parameters.DependsOn }}
steps:
- task: DotNetCoreCLI@2
displayName: 'dotnet restore'
inputs:
command: 'restore'
projects: '$(Build.SourcesDirectory)/${{ parameters.SolutionPath }}/${{ parameters.projectName }}**/*.csproj'
- task: DotNetCoreCLI@2
displayName: 'dotnet build'
inputs:
projects: '$(Build.SourcesDirectory)/${{ parameters.SolutionPath }}/${{ parameters.projectName }}**/*.csproj'
arguments: '--configuration ${{ parameters.BuildConfiguration }}'
- task: DotNetCoreCLI@2
displayName: 'dotnet test'
inputs:
command: test
projects: '$(Build.SourcesDirectory)/${{ parameters.SolutionPath }}/${{ parameters.projectName }}.Tests/*.csproj'
arguments: '--configuration ${{ parameters.BuildConfiguration }} --collect "Code coverage" '
- job: Publish_${{ parameters.projectName }}
dependsOn: Build_${{ parameters.projectName }}
condition: and(succeeded(),eq( ${{ parameters.publish }}, 'true'))
steps:
- task: DotNetCoreCLI@2
displayName: 'dotnet publish'
inputs:
command: publish
publishWebProjects: false
projects: '$(Build.SourcesDirectory)/${{ parameters.SolutionPath }}/${{ parameters.projectName }}**/*.csproj'
arguments: '--configuration ${{ parameters.BuildConfiguration }} --output $(build.artifactstagingdirectory)'
zipAfterPublish: True
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: drop'
模板會被類似的東西調用:
jobs:
- template: build-corewebapp.yml
parameters:
projectName: ${{ variables.appProjectName }}
solutionPath: $(solutionPath)
publish: 'true'
為了最大的可重用性,我建議將任何類型的構建模板存在於單獨的存儲庫中,以便其他存儲庫可以使用它。 這將通過引用類似於以下內容的 repo 在您的管道中進行設置:
resources:
repositories:
- repository: repositoryTemplate
type: git
name: ProjectName/YAMLTEMPLATERepoName
然后,使用模板的優點是更新任務版本或更改構建/部署策略,可以在一個地方更新和引用。
您可以使用條件進行單獨的構建,以便您可以將所有構建步驟放在一個管道中。 這是類似的主題。
構建步驟的簡單示例:
steps:
- task: PowerShell@2
inputs:
targetType: 'inline'
script: |
$files=$(git diff HEAD HEAD~ --name-only)
$temp=$files -split ' '
$count=$temp.Length
For ($i=0; $i -lt $temp.Length; $i++)
{
$name=$temp[$i]
echo "this is $name file"
if ($name -like "AdminWebApp/*")
{
Write-Host "##vso[task.setvariable variable=RunAdminWebApp]True"
}
if ($name -like "SharedCode/*")
{
Write-Host "##vso[task.setvariable variable=RunSharedCode]True"
}
if ($name -like "FrontWebApp/*")
{
Write-Host "##vso[task.setvariable variable=RunFrontWebApp]True"
}
}
- task: MSBuild@1
inputs:
solution: '**/AdminWebApp.csproj'
msbuildArguments: 'xxx'
condition: or(variables['RunAdminWebApp'], variables['RunSharedCode'])
- task: MSBuild@1
inputs:
solution: '**/FrontWebApp.csproj'
msbuildArguments: 'xxx'
condition: or(variables['RunFrontWebApp'], variables['RunSharedCode'])
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
如果您的AdminWebApp
項目中的任何文件發生更改,則僅構建AdminWebApp
和SharedCode
項目。(第一個構建任務)
如果您的FrontWebApp
項目中的任何文件發生更改,則僅構建FrontWebApp
和SharedCode
項目。(第二次構建任務)
如果SharedCode
中的文件發生變化,由於兩個項目都依賴它,兩個構建任務都會運行。
您應該指定 msbuild 參數(/t:publish...),以便構建任務可以生成 zip package 進行部署。 (否則您需要向 zip 和 output 文件添加額外的任務)
因為一旦SharedCode
項目發生更改,您將獲得兩個已發布的 zip 文件。 那么你的發布管道應該至少有兩個部署任務。 為您發布:一個 PS 任務(確定 A.zip/B.zip 是否存在,然后設置自定義變量 DeployA/DeployB)和兩個基於 DeployA/DeployB 值的條件部署任務。(只是一個建議,它不是關於你原來的問題,所以我不會在這里多說......)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.