Часть извлечения из ветви в Azure DevOps Pipelines (GetSources) - PullRequest
1 голос
/ 04 июня 2019

Мой репозиторий в проекте devops моей организации содержит множество решений .net, а также несколько проектов по объединению. Когда я запускаю свой конвейер сборки, он выходит из строя из-за нескольких из них:

Ошибка MSB3491: не удалось записать строки в файл "obj \ Release \ path \ to \ file". На диске недостаточно места.

Я бы хотел, чтобы конвейер извлекал и извлекал только те части репозитория, которые необходимы для успешной сборки. Это также может помочь со временем выполнения конвейера, поскольку в настоящее время он также получает все мои проекты Unity с гигабайтами ресурсов, что занимает вечно.

Я хотел бы распределить свои проекты по нескольким репозиториям, но админ не даст мне больше, чем тот, который у меня уже есть. Это стало намного лучше, когда я настроил git fetch как мелкий (--depth=1), но время от времени я все еще получаю ошибку.

Вот как я настроил оформление заказа:

  steps:
  - checkout: self
    clean: true
    # shallow fetch
    fetchDepth: 1
    lfs: false
    submodules: false

Сборка выполняется с помощью задачи VSBuild@1.

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

Редактировать: Решение № 1 Шайки Абрамчика работает отлично. Вот моя полная реализация.

GitSparseCheckout.yml:

parameters:
  access: ''
  repository: ''
  sourcePath: ''

steps:
- checkout: none

- task: CmdLine@2
  inputs:
    script: |
      ECHO ##[command] git init
      git init
      ECHO ##[command] git sparse-checkout: ${{ parameters.sourcePath }}
      git config core.sparsecheckout true
      echo ${{ parameters.sourcePath }} >> .git/info/sparse-checkout
      ECHO ##[command] git remote add origin https://${{ parameters.repository }}
      git remote add origin https://${{ parameters.access }}@${{ parameters.repository }}
      ECHO ##[command] git fetch --progress --verbose --depth=1 origin master
      git fetch --progress --verbose --depth=1 origin master
      ECHO ##[command] git pull --progress --verbose origin master
      git pull --progress --verbose origin master

Оформить заказ называется следующим образом (где необходимо изменить путь к шаблону):

  - template: ../steps/GitSparseCheckout.yml
    parameters:
      access: anything:<YOUR_PERSONAL_ACCESS_TOKEN>
      repository: dev.azure.com/organisation/project/_git/repository
      sourcePath: path/to/files/

1 Ответ

1 голос
/ 04 июня 2019

В DevOps Azure у вас нет возможности получить только часть хранилища, но есть обходной путь, отключите шаг «Получить источники» и получите источники вручную (только то, что вы хотите):

Чтобы отключить «Получить источники» по умолчанию, просто укажите none в оформлении заказа:

- checkout: none

В конвейере добавьте задачу CMD / PowerShell, чтобы вручную получить источники с одним из следующих 2 параметров:

1) Получить только часть репо с помощью git sparse-checkout , например, получить только папку src в папке test:

- script: |
   mkdir myRepo
   cd myRepo
   git init
   git config.core.sparsecheckout true
   echo test/src/ >> .git/info/sparse-checkout
   git remote add -f origin path/to/your/repo
   git pull origin master
  displayName: 'Get only test/src folder'

Теперь в задаче сборки сделайте myRepo рабочим каталогом.

2) Получить части репозитория с помощью Azure DevOps Rest API (Git - Items - Get Items Batch).

В конце конвейера вы можете захотетьдобавить шаг для очистки папки репо.

...