簡體   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