Как аутентифицировать git push на GitHub в рамках задачи Azure Pipeline Bash - PullRequest
1 голос
/ 02 июля 2019

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

Нет аутентификации, просто git push

- bash: 'git push origin $(tag)'
git push origin 2019.07.01.1
fatal: could not read Username for 'https://github.com': terminal prompts disabled

Передача AUTHORIZATION: Bearer *** в качестве дополнительного заголовка

- bash: 'git -c http.extraheader="AUTHORIZATION: Bearer $(System.AccessToken)" push origin $(tag)'
git -c http.extraheader="AUTHORIZATION: Bearer ***" push origin 2019.07.01.2
fatal: unable to access 'https://github.com/respondentinc/website/': The requested URL returned error: 400

Передача AUTHORIZATION: Bearer *** в качестве дополнительного заголовка с использованием переменных среды

От: https://github.com/microsoft/azure-pipelines-agent/issues/1582#issuecomment-392235276

- bash: 'git -c http.extraheader="AUTHORIZATION: Bearer $env:token" push origin $(tag)'
  env:
      token: $(System.AccessToken)
git -c http.extraheader="AUTHORIZATION: Bearer ***" push origin 2019.07.01.3
fatal: unable to access 'https://github.com/respondentinc/website/': The requested URL returned error: 400

Передача сценария Bash помощнику по учетным данным

На основе ответа bk2204

- bash: 'git -c credential.helper=''!f() { echo "username=token"; echo "password=$(System.AccessToken)"; }; f'' push origin $(tag)'
git -c credential.helper='!f() { echo "username=token"; echo "password=***"; }; f' push origin 2019.07.02.9
fatal: unable to access 'https://github.com/respondentinc/website/': The requested URL returned error: 400

Passсценарий Bash для помощника по учетным данным с использованием переменных среды

От ответа bk2204

- bash: 'git -c credential.helper=''!f() { echo "username=token"; echo "password=$env:token"; }; f'' push origin $(tag)'
  env:
      token: $(System.AccessToken)
git -c credential.helper='!f() { echo "username=token"; echo "password=$env:token"; }; f' push origin 2019.07.02.9
fatal: unable to access 'https://github.com/respondentinc/website/': The requested URL returned error: 400

Передача AUTHORIZATION: Basic *** в качестве дополнительного заголовка

Пытался имитировать то, как это делает задание по умолчанию для конвейера "Checkout".

- bash: 'git -c http.extraheader="AUTHORIZATION: basic $(System.AccessToken)" push origin $(tag)'
git -c http.extraheader="AUTHORIZATION: basic ***" push origin 2019.07.02.10
fatal: unable to access 'https://github.com/respondentinc/website/': The requested URL returned error: 400

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

Чего мне не хватает?

Обновление: 2019-07-02

Все вышеперечисленные механизмы являются допустимыми способами аутентификации.Проблема в том, что System.AccessToken не подходит для GitHub.Документация указывает, что она предназначена для взаимодействия со службами Azure Pipeline * только 1053 * .

Мне не удалось найти переменную для токена, предоставленного AzurePipeline GitHub App .Я не думаю, что это будет иметь значение, поскольку это установочный токен .Я попытался использовать этот токен с задачей GitHubRelease , но он все еще не удался из-за отсутствия разрешения на запись.

Чтобы это заработало, я пошел с задачей GitHubRelease и мне пришлось создать новый сервис.соединение с новым токеном OAuth с разрешением на запись.

Мне все еще интересно, как получить доступ к токену, связанному с подключением службы, из задачи Bash.

1 Ответ

0 голосов
/ 02 июля 2019

Проблема здесь в том, что вы пытаетесь использовать аутентификацию Bearer.Это верно для хостинга Azure DevOps, но не для GitHub, который использует обычную аутентификацию.

Лучший способ справиться с этим - установить переменную окружения TOKEN, чтобы получить желаемый токен (например, вашу попытку)и затем выполните команду следующим образом:

git -c credential.helper='!f() { echo "username=token"; echo "password=$TOKEN"; };f' push $(tag)

Допустимо любое имя пользователя, если вы используете токен;Я просто использовал токен, потому что вам нужно некоторое имя пользователя, и это очевидный выбор.

Используя функцию оболочки в качестве помощника по учетным данным и используя echo, который является встроенным в оболочку, вашучетные данные не будут отображаться в журналах или выходных данных процесса.

...