Проблемы при попытке получить частные зависимости golang от CircleCI

#git #go #circleci #circleci-2.0

#git #Вперед #circleci #circleci-2.0

Вопрос:

Я использую CircleCI в качестве инструмента для создания своих изображений для публикации в Kubernetes.

В моих проектах используется Golang, и я использую модули Go.

Оказывается, у меня возникают проблемы, когда после проверки моего кода go get -v -t -d ./... выполняется шаг.

В какой-то момент для некоторых зависимостей (которые являются внутренними зависимостями от моей компании, и они находятся в проекте github моей компании) я получаю unknown revision сообщение.

Я уже настроил учетную запись компьютера, так как у меня есть собственная учетная запись github.

Я попытался добавить следующие строки

 - run: echo -e "Host github.comntStrictHostKeyChecking non" > ~/.ssh/config
- run: cp key ~/.ssh/id_rsa
- run: git config --global url."ssh://git@github.com".insteadOf "https://github.com" || true
- run: git config --global gc.auto 0 || true
- run: go get -v -t -d ./...
  

Команда cp key ~/.ssh/id_rsa копирует a ssh key , которая имеет доступ к проектам github, и я могу использовать ее локально для выполнения тех же действий, что и выше.

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

Спасибо.

Комментарии:

1. У меня есть пара вопросов, у вас есть GO111MODULE=on , о чем GOPRIVATE ? Вы проверяли, работает ли ssh ssh -T git@github.com на каком-то шаге?

2. unknown revision подразумевает, что ваш go.mod указывает на зависимость от версии, которая не существует в удаленном репозитории. Есть ли у вас replace в локальной копии директивы, которые могут переопределять некоторые действия по разрешению зависимостей?

3. @Зелёный Да, я GO111MODULE включил, а также GOPRIVATE установил. Кроме того, SSH работает правильно, только что проверил ssh -T git@github.com .

4. @Adrian да, по какой-то причине он не находит конкретный тег (в моем случае, v0.0.3 ), но он существует. У меня нет никакой директивы replace, я перепроверил сейчас.

5. Вы уверены, что тег существует в удаленной, а не только в вашей локальной копии?

Ответ №1:

Отвечая на мой собственный вопрос:

  • Github блокирует пользователям доступ к go get частным репозиториям, даже если запущенный пользователь является владельцем (в docker — потому что CircleCI использует контейнеры docker для запуска сборки)
  • Чтобы преодолеть эту проблему, я сгенерировал токен разработчика: https://github.com/settings/tokens
  • И использовал токен для разрешения доступа к частным репозиториям: git config --global url."https://<my-dev-token>:x-oauth-basic@github.com/<company-slug>".insteadOf "https://github.com/<company-slug>" || true

Я тестировал другие решения, но это было единственное, которое работало просто отлично.

Комментарии:

1. раньше это работало в нашем случае, однако похоже, что это не работает, если у вас есть дерево зависимостей, а private является вложенным (например, уровень 2)

Ответ №2:

Хорошо известное replace обходное решение может не всегда работать. Если у вас есть дерево зависимостей, а частный модуль является вложенным, проверка контрольной суммы модуля завершится неудачей. Чтобы обойти эту проблему, необходимо иметь запись в a go.mod . Кроме того, запись должна сохраниться go mod tidy . В противном случае он может быть случайно удален.

Итак, в дополнение к replace решению, аналогичному приведенному ниже:

 git config --global url."https://<token>:x-oauth-basic@github.com/<org-slug>".insteadOf "https://github.com/<org-slug>"
  

(где <token> ваш токен GH, который может хотя бы читать)

Для сохранения записи go.mod требуется использовать инструментальный подход.

Пример:

 $ cat tools.go
//  build tools

package tools

import (
    _ "github.com/<org-slug>/<dependency-name>/tools" // this is your private dependency
)
  

Убедитесь tools , что пакет также находится в репозитории зависимостей.