![](/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.