Использование относительного URL для подмодуля git требует учетных данных
В документации Team Services ( https://www.visualstudio.com/en-us/docs/build/define/repository) указано, что я могу сделать $ git add submodule
если
- это немедленный подмодуль
- Не прошедший проверку подлинности (нет данных)
- Заверенные
- Содержится в одном командном проекте
- Добавлено с помощью относительного URL из основного хранилища
Они дают пример:
git submodule add /../../submodule.git mymodule
Если я ссылаюсь на git-репо в том же проекте, как
git submodule add ./../other-repo mymodule
Он разрешает правильный репо, но хочет, чтобы я предоставил учетные данные. Сбой сборки со следующим сообщением:
Cloning into 'mymodule'...
fatal: could not read Username for 'https://xxx.visualstudio.com': Invalid argument
Предоставление полного URL с учетными данными ( https://user:password@xxx.visualstudio.com/) Работает, но является IMO плохим решением.
Документация предполагает, что это должно работать с относительным URL и без учетных данных. Я ошибся?
Изменить 1:
Работает с system.debug: true
Entering OnPrepareEnvironment
Primary repository: xxx
Calculating build folder hash key.
Loading tracking config if exists: C:\a\SourceRootMapping\07a8b96d-d805-4646-83d3-e7b2fbe394c2\18\SourceFolder.json
Creating new tracking config.
Loading top-level tracking config if exists: C:\a\SourceRootMapping\Mappings.json
Writing config to file: C:\a\SourceRootMapping\Mappings.json
Writing config to file: C:\a\SourceRootMapping\07a8b96d-d805-4646-83d3-e7b2fbe394c2\18\SourceFolder.json
Checking if artifacts directory exists: C:\a\1\a
Creating artifacts directory.
Checking if test results directory exists: C:\a\1\TestResults
Creating test results directory.
Creating binaries directory.
Setting local variables.
Create the initial timeline records for the tasks
Preparing repositories
repo clean = False
Found 3 endpoints to consider
Found 1 repositories to sync
Starting: Get sources
build.fetchtags=false
Entering GitSourceProvider.PrepareRepositoryAsync
Repository type=TfsGit
localPath=C:\a\1\s
clean=False
sourceBranch=refs/heads/r_080
sourceVersion=26d5a7a6e6ed47c8f12ee5dc5b376d6731b7863a
Syncing repository: xxx (Git)
repository url=https://xxx.visualstudio.com/_git/xxx
checkoutSubmodules=False
Starting clone
Checking out 26d5a7a6e6ed47c8f12ee5dc5b376d6731b7863a to C:\a\1\s
Checked out branch refs/heads/r_080 for repository xxx at commit 26d5a7a6e6ed47c8f12ee5dc5b376d6731b7863a
Leaving GitSourceProvider.PrepareRepositoryAsync
Leaving OnPrepareEnvironment
Running tasks
Starting task: Run git
##[warning]File name doesn't indicate a full path to a executable file.
Executing the following command-line. (workingFolder = C:\a\1\s)
git submodule add ./../other_repo mymodule
Error message highlight pattern:
Warning message highlight pattern:
C:\Windows\system32\cmd.exe /c "git submodule add ./../other_repo mymodule"
Cloning into 'mymodule'...
Fatal: InvalidOperationException encountered.
bash: /dev/tty: No such device or address
error: failed to execute prompt script (exit code 1)
fatal: could not read Username for 'https://xxx.visualstudio.com': Invalid argument
fatal: clone of 'https://xxx.visualstudio.com/_git/other_repo' into submodule path 'mymodule' failed
Finishing task: CmdLine
##[error]System.Exception: Task CmdLine failed. This caused the job to fail. Look at the logs for the task for more details.
##[error] at Microsoft.TeamFoundation.DistributedTask.Worker.JobRunner.Run(IJobContext jobContext, IJobRequest job, IJobExtension jobExtension, CancellationTokenSource tokenSource)
Entering OnFinalizeJob
Leaving OnFinalizeJob
Изменить 2:
Я не могу ответить на это. Документация неверна / неясна, я выбрал опцию для проверки субмодулей, как сказал @eddie-msft, но будьте осторожны: сборка VSTS git завершается неудачно с подмодулем git
1 ответ
Из подмодулей - Azure Repos я понимаю, что проблемы возникают, когда:
- Репозиторий подмодуля требует аутентификации.
- Вы включили Ограничить область авторизации задания указанными репозиториями Azure DevOps, что по умолчанию включено.
Если вы ограничили токен доступа к заданию, как описано в разделе выше, вы не сможете этого сделать.
Я сам пробовал только номер 1, и он у нас работает.
Обходной путь 1. Для репозитория подмодулей в DevOps
- Отключить
Limit job authorization scope to referenced Azure DevOps repositories
в настройках проекта, что дает конвейеру доступ ко всем репозиториям DevOps. - Используйте относительные пути вместо https: // в URL подмодуля, например
../MySubmoduleRepo
или же../../../OtherProject/_git/MySubmoduleRepo
.
Способ 2: если требуются другие учетные данные
Обходной путь 3. Пользовательский сценарий для повторного использования токена доступа для синхронизации подмодуля
steps:
- checkout: self
submodules: false
persistCredentials : true
- powershell: |
$header = "AUTHORIZATION: bearer $(System.AccessToken)"
git -c http.extraheader="$header" submodule sync
git -c http.extraheader="$header" submodule update --init --force --depth=1
Пожалуйста, также проверьте путь ваших двух хранилищ. Если в вашем проекте только два репозитория, путь к первому созданному репо A будет следующим:
https://xxxx.visualstudio.com/_git/A
И путь второго созданного репо B будет:
https://xxxx.visualstudio.com/A/_git/B
В этом случае вам нужно использовать относительный путь, например:
../../A/_git/B