Azure Конвейер сборки - несколько репозиториев, построенных с несколькими заданиями - как повторно использовать одни и те же рабочие каталоги в каждой сборке? - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть основное решение и N других решений в разных репозиториях. Каждый раз, когда создается основное решение, мне приходится создавать N других и создавать артефакт основного решения, содержащего другие. Мой текущий конвейер сборки выглядит следующим образом.

  • [Этап 1]

    • [Job 1] Build Основное решение -> publi sh конвейер Артефакт (необходим для других решений) [папка агента 1]

    • [Задание 2..N] Проверка решения "n" -> build -> publi sh конвейерный артефакт [папки агента 2..N]

  • [Этап 2] - После успешного завершения всех заданий
    • [Задание 1] - Загрузить основной артефакт -> Загрузить другие артефакты -> поместите их в один артефакт -> publi sh [папка агента N + 1]

Моя проблема заключается в том, что при следующем запуске этого конвейера мой агент перезапускает последнюю папку и остальные там тают много памяти. Есть ли способ сообщить конвейеру о запуске каждого задания в одном и том же рабочем каталоге агента? Или повторно использовать первый созданный каталог (тот, что используется для построения основного решения)?

РЕДАКТИРОВАТЬ: Вот код моего конвейера

resources:
  repositories:
  - repository: Repo.With.Templates
    type: git
    name: Repo.With.Templates
    ref: feature/templates

  - repository: Secondary.Repository.1
    type: git
    name: Secondary.Repository.1
    ref: f/refactor/cd

  - repository: Secondary.Repository.2
    type: git
    name: Secondary.Repository.2
    ref: f/refactor/cd

trigger:
  batch: true
  branches:
    include:
    - 'f/core/cd-updates'

pool: 'Example pool'

variables:
 solution: '**/*.sln'
 buildPlatform: 'Any CPU'
 buildConfiguration: 'Release'
 scriptSetBuildNumber: 'CI\SetBuildNumber.ps1'
 nugetConfigFile: '$(Build.SourcesDirectory)/NuGet.config'
 checkoutFolderRoot: '$(Build.SourcesDirectory)'

stages:
- stage: BuildingStage
  jobs:
  - job: Main_Solution_Build
    steps:
    - task: VSBuild@1
      displayName: 'Build'
      inputs:
        solution: '$(solution)'
        msbuildArgs: '
            /p:DefineConstants="TESTENV"
            /p:TreatWarningsAsErrors=true
            /p:DeployDefaultTarget=WebPublish
            /p:WebPublishMethod=FileSystem
            /p:DeleteExistingFiles=True
            /p:SkipInvalidConfigurations=false
            /p:VisualStudioVersion=11.0
            /p:publishUrl="$(Build.ArtifactStagingDirectory)\"
            '
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'

    # Zip bin folder and move to artifact folder
    - task: ArchiveFiles@2
      name: 'MovingMainSolutionBinToArtifacts'
      inputs:
        rootFolderOrFile: '$(Build.SourcesDirectory)/MainSolution/bin'
        includeRootFolder: true
        archiveType: 'zip'
        archiveFile: '$(Build.ArtifactStagingDirectory)/Artifacts/MainSolution.zip'
        replaceExistingArchive: true

    - task: PublishPipelineArtifact@1
      name: PublishMainSolutionBinPipeArtifact
      inputs:
        targetPath: '$(Build.ArtifactStagingDirectory)\Artifacts\MainSolution.zip'
        artifact: 'MainSolutionBinDrop'
        publishLocation: 'pipeline'

  - job: SecondarySolution1
    dependsOn: Main_Solution_Build
    steps:
    - checkout: Secondary.Repository
    - template: build-service-template.yml@Repo.With.Templates
      parameters:
        serviceName: "SecondarySolution1"


## Stage for assembling MainSolution and all the services together
- stage: Assemble
  dependsOn: BuildingStage
  jobs:
  - job: AssembleArtifact
    steps:
    - checkout: none

    - task: DownloadPipelineArtifact@2
      name: "MainSolutionBinDrop"
      inputs:
        buildType: 'specific'
        project: 'a12e0163-b207-400d-ac93-fa47964d5010'
        definition: '2'
        buildVersionToDownload: 'latest'
        artifactName: 'MainSolutionBinDrop'
        targetPath: '$(Build.ArtifactStagingDirectory)/MainSolutionBinDrop'

    - task: DownloadBuildArtifacts@0
      name: "DownloadServicesDrop"
      inputs:
        buildType: 'specific'
        project: 'a12e0163-b207-400d-ac93-fa47964d5010'
        pipeline: '2'
        buildVersionToDownload: 'latest'
        downloadType: 'single'
        artifactName: 'ServicesDrop'
        downloadPath: '$(Build.ArtifactStagingDirectory)'

    # Tasks that produce one artifact out of Main artifact and all Secondary solution artifacts
    # .....
    # .....

      # Publish
    - task: PublishPipelineArtifact@1
      inputs:
        targetPath: '$(Build.ArtifactStagingDirectory)/MainWithSecondary.zip'
        artifact: 'MainWithSecondary'
        publishLocation: 'pipeline'

И код шаблона, использованного для построения N вторичные решения (в данном примере только одно)

parameters:
- name: solution
  type: string
  default: '**/*.sln'

- name: buildPlatform
  type: string
  default: 'Any CPU'

- name: buildConfiguration
  type: string
  default: 'Release'

- name: nugetConfigFile
  type: string 
  default: '$(Build.SourcesDirectory)/NuGet.config'

- name: serviceName
  type: string

steps:

# Tasks that download main build artifact, build secondary solution and publishes secondary artifact
#
#

#Download main solution artifact
- task: DownloadPipelineArtifact@2
  inputs:
    buildType: 'current'
    artifactName: 'MainSolutionDrop'
    targetPath: '$(Agent.BuildDirectory)/MainSolution'

- task: VSBuild@1
  displayName: 'Build'
  inputs:
    solution: '$(solution)'
    msbuildArgs: '
    /p:TreatWarningsAsErrors=true 
    /p:DeployOnBuild=true
    /p:SkipInvalidConfigurations=false'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

# Create artifact folder
- task: PowerShell@2
  name: "CreateArtifactFolder"
  inputs:
    targetType: 'inline'
    script: |
      if (!(Test-Path "$(Build.ArtifactStagingDirectory)\${{ parameters.serviceName }}" -PathType Container)) {    
                New-Item -ItemType Directory -Path "$(Build.ArtifactStagingDirectory)\${{ parameters.serviceName }}"
      }


- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'ServicesDrop'
    publishLocation: 'Container'

1 Ответ

0 голосов
/ 24 февраля 2020

Каждое задание имеет свой собственный рабочий каталог по умолчанию, и оно отдельно от других заданий, оно устанавливается агентом автоматически и не может быть изменено. Таким образом, вы не можете запускать каждое задание в одном и том же рабочем каталоге агента.

Существует обходной путь для загрузки нескольких репозиториев в одной рабочей папке и их построения в одном задании.

Вы можете запустить git команда в задаче powershell для клонирования нескольких репозиториев в одном рабочем каталоге. А затем установите задачи сборки для каждой папки репо, чтобы построить каждое решение. Проверьте приведенный ниже пример:

Вам потребуется использовать PAT для проверки подлинности. Отметьте здесь , чтобы сгенерировать PAT с Область чтения и записи кода

- powershell: |
    git clone https://{PAT}@dev.azure.com/{org}/{proj}/_git/Repo1  #repo1 will be cloned into folder Repo1 under $(Build.SourcesDirectory)
    #cd Repo1 #cd the code folder

- powershell: |
    git clone https://{PAT}@dev.azure.com/{org}/{proj}/_git/Repo2  #repo1 will be cloned into folder Repo2 under $(Build.SourcesDirectory)
    #cd Repo2 #cd the code folder
  ....

- task: Build tasks1 #point the solution folder to $(Build.SourcesDirectory)/Repo1
    ...
- task: Build tasks2 #point the solution folder to $(Build.SourcesDirectory)/Repo2
    ...

#- task: Copy file task # copy the built artifacts to a specified folder.

- task: publish build artifacts task  #to publish repo1 artifacts
  ....
- task: publish build artifacts task  #to publish repo2 artifacts
  ....

Вы также можете использовать Задание копирования файла для перемещения встроенные артефакты в разные папки.

Используя команду клона git в задаче powershell для клонирования репозиториев, вы можете объединить свои задания и этапы в одно задание.

Обновление:

После проверки выше конвейера yaml и тестирования я обнаружил, что - checkout: Secondary.Repository вызвал создание новых папок при повторном запуске конвейера.

Временное решение: использовать задачу powershell для клон Secondary.Repository вместо использования - checkout: Secondary.Repository. Пожалуйста, ознакомьтесь с вышеупомянутым обходным решением.

Вы также можете сообщить об этой проблеме в Microsoft, Сообщив о проблеме (Нажмите Сообщить о проблеме и выберите Azure devops)

Надеюсь выше помогает.

...