【问题标题】:Azure DevOps Pipepine with YAML for solution with many projects带有 YAML 的 Azure DevOps Pipeline 用于解决许多项目的问题
【发布时间】:2020-11-26 16:27:09
【问题描述】:

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

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

在 Azure DevOps Pipelines 中,我想为

创建单独的构建

AdminWebApp

FrontWebApp

这两个都包含

共享代码

因为它包含助手等。我想用 YAML 方式来做。 我应该创建 1 个还是 2 个管道(每个工件稍后将发布到其自己的 Azure 应用服务)?实现它的 YAML 代码是什么?

【问题讨论】:

  • 未获得您的最新信息,如果您仍然被此问题阻止,请随时告诉我。如果有机会,请查看下面的答案。提醒一下this~

标签: asp.net-mvc azure-devops yaml azure-pipelines


【解决方案1】:

您可以使用conditions 进行单独的构建,这样您就可以将所有构建步骤放在一个管道中。这是similar topic

构建步骤的简单示例:

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 包。 (否则你需要添加额外的任务来压缩输出文件)

因为一旦 SharedCode 项目发生更改,您将获得两个已发布的 zip 文件。那么你的发布管道应该至少有两个部署任务。为您发布:一个 PS 任务(确定 A.zip/B.zip 是否存在,然后设置自定义变量 DeployA/DeployB)和两个基于 DeployA/DeployB 值的条件部署任务。(只是一个建议,它不是关于你原来的问题,所以我不会在这里多说......)

【讨论】:

    【解决方案2】:

    管理和发布周期的样子真的很重要。最简单的方法是每次都重新部署所有内容。现实的方法是在有意义时将部署管道组合在一起。

    就“YAML 方式”的操作而言。会考虑使用YAML templates

    模板参数将至少由项目的目录来构建。这是一个 .net Core 模板的示例,但会让您了解思考过程:例如,此 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'
    

    为了最大程度地重复使用,我会推荐任何类型的build template to exist in a separate repository so it can be used by other repos。这将通过引用类似于以下内容的 repo 在您的管道中进行设置:

    resources:
      repositories:
      - repository: repositoryTemplate
        type: git
        name: ProjectName/YAMLTEMPLATERepoName
    

    然后,使用模板的优点是更新任务版本或更改构建/部署策略可以在一个地方更新和引用。

    【讨论】:

      猜你喜欢
      • 2020-12-06
      • 1970-01-01
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 2019-10-27
      • 1970-01-01
      相关资源
      最近更新 更多