#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
? Вы проверяли, работает ли sshssh -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
, что пакет также находится в репозитории зависимостей.