Git Sparse checkout во время конвейеров Azure, занимающих ~15 минут

У нас есть одно репо с исходным кодом, размер которого при загрузке составляет около 2,8 ГБ. У нас есть 4 агента с собственным хостингом и более 100 конвейеров сборки. При этом невозможно загрузить весь исходный код, закодированный для каждой сборки / агента.

Подход, который я выбрал, заключается в том, чтобы отключить проверку для этого конвейера, а затем запустить сценарий командной строки для выполнения разреженной проверки Git. Однако получение исходного кода объемом ~100 МБ занимает около 15 минут.

Мы используем автономные агенты Linux.

              steps:
          - checkout: none
          - task: CmdLine@2
            displayName: "Project Specific Checkout"
            inputs:
              script: |
                cd $(Build.SourcesDirectory)
                git init

                git config --global user.email ""
                git config --global user.name ""
                git config --global core.sparsecheckout true

                echo STARS/Source/A/ >> .git/info/sparse-checkout
                echo STARS/Source/B/ >> .git/info/sparse-checkout
                echo STARS/Source/C/ >> .git/info/sparse-checkout

                git remote rm origin
                git remote add origin https://service:$(Service.Account.Personal.Access.Token)@dev.azure.com/Organization/Project/_git/STARS
                git reset --hard
                git pull origin $(Build.SourceBranch)

Есть ли что-то, что я делаю здесь неправильно, из-за чего требуется так много времени, чтобы вытащить эти данные.

1 ответ

1. Поскольку вы используете собственный агент, вы можете перейти на машину с агентом, чтобы вручную запустить команды git и посмотреть, получите ли вы такую ​​же производительность.

2. установить переменную system.debug к true, чтобы проверить, какая команда требует больше времени.

3.Вместо проверки Git Sparse вы можете указать path в checkout шаг:

      steps:
- checkout: self | none | repository name # self represents the repo where the initial Pipelines YAML file was found
  clean: boolean  # if true, run `execute git clean -ffdx && git reset --hard HEAD` before fetching
  fetchDepth: number  # the depth of commits to ask Git to fetch; defaults to no limit
  lfs: boolean  # whether to download Git-LFS files; defaults to false
  submodules: true | recursive  # set to 'true' for a single level of submodules or 'recursive' to get submodules of submodules; defaults to not checking out submodules
  path: string  # path to check out source code, relative to the agent's build directory (e.g. \_work\1); defaults to a directory called `s`
  persistCredentials: boolean  # if 'true', leave the OAuth token in the Git config after the initial fetch; defaults to false

https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&tabs=schema%2Cparameter-schema#checkout

4. Поскольку вы запускаете конвейер на собственном агенте, по умолчанию ни один из подкаталогов не очищается между двумя последовательными запусками. В результате вы можете выполнять инкрементные сборки и развертывания при условии, что задачи реализованы так, чтобы использовать это. Таким образом, вы можете установить для параметра Clean значение false.

https://docs.microsoft.com/en-us/azure/devops/pipelines/process/phases?view=azure-devops&tabs=yaml#workspace

Другие вопросы по тегам