繁体   English   中英

Azure DevOps Pipepine 与 YAML 用于许多项目的解决方案

[英]Azure DevOps Pipepine with YAML for solution with many projects

我在 Visual Studio 2019 中有一个 .NET MVC 解决方案,其中包含 3 个项目:

  1. AdminWebApp
  2. SharedCode(在 VS 的其他两个项目中都设置为依赖项)
  3. FrontWebApp

在 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项目中的任何文件发生更改,则仅构建AdminWebAppSharedCode项目。(第一个构建任务)

  • 如果您的FrontWebApp项目中的任何文件发生更改,则仅构建FrontWebAppSharedCode项目。(第二次构建任务)

  • 如果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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM