Go модули с приватными Git репозиториями
Модули значительно улучшили процесс управления зависимостями в Go. Если вы новичок в Go Modules и хотите узнать больше о том, как начать, ознакомьтесь с официальной документацией .
После того, как все настроено правильно, довольно просто включить определенные версии пакетов Go из общедоступных репозиториев . Одна из моих типичных отправных точек может выглядеть примерно так:
module github.com/samplerepo/sampleproject go 1.12 require ( github.com/pkg/errors v0.8.0 github.com/spf13/cobra v0.0.4 github.com/spf13/viper v1.3.2 )
Что, если мы хотим расширить это поведение для импорта пакетов Go из приватных репозиториев ? На самом деле все довольно просто: убедитесь, что у вашего установщика Go есть доступ к приватным репозиториям Git. Но как мы можем это сделать?
Приватные хранилища
Под капотом Go использует Git для извлечения указанных версий ваших зависимостей. Итак, конфигурация git используется везде, где работает Go (например, контейнер Docker или ваш ноутбук), должна иметь соответствующие учетные данные для доступа к любым частным репозиториям.
К счастью для нас, для этого есть команда git. Приведенные ниже команды поместят в ваш файл .gitconfig запись, в которой git будет указывать использовать URL-адрес в формате авторизации с помощью токена, когда ему требуется доступ к стандартному URL-адресу. Для этого мы используем личный токен доступа вместо пароля, потому что это будет хранить записи в виде простого текста. В этом вопросе о переполнении стека можно найти несколько хороших обсуждений и альтернатив.
Ваш токен авторизации должен быть в кодировке URL!
Следующие списки отформатированы в отдельных строках, чтобы избежать боковой прокрутки:
BitBucket
git config \ --global \ url."https://${bitbucket_id}:${bitbucket_token}@privatebitbucket.com".insteadOf \ "https://privatebitbucket.com"
GitHub
git config \ --global \ url."https://${user}:${personal_access_token}@github.com".insteadOf \ "https://github.com"
GitLab
git config \ --global \ url."https://oauth2:${personal_access_token}@privategitlab.com".insteadOf \ "https://privategitlab.com" # или git config \ --global \ url."https://${user}:${personal_access_token}@privategitlab.com".insteadOf \ "https://privategitlab.com"
Это отлично подходит для локальной разработки, но как насчет моего конвейера CI / CD?
Я рад, что ты спросил! Вот пример Dockerfile, который позволяет вводить учетные данные во время сборки:
# --------------------------------------------------------------------- # Контейнер первого этапа, для сборки приложения # --------------------------------------------------------------------- FROM golang:1.12.1-stretch as builder COPY . /app # Добавить ключи ARG bitbucket_id ENV bitbucket_id=$bitbucket_id ARG bitbucket_token ENV bitbucket_token=$bitbucket_token WORKDIR /app/cmd/webapp RUN git config \ --global \ url."https://${bitbucket_id}:${bitbucket_token}@privatebitbucket.com/".insteadOf \ "https://privatebitbucket.com/" RUN GIT_TERMINAL_PROMPT=1 \ GOARCH=amd64 \ GOOS=linux \ CGO_ENABLED=0 \ go build -v --installsuffix cgo --ldflags="-s" -o myapp # --------------------------------------------------------------------- # Контейнер второго уровня, для запуска приложения # --------------------------------------------------------------------- FROM alpine:3.8 COPY --from=builder /app/cmd/webapp/myapp /app/myapp WORKDIR /app ENTRYPOINT ["/myapp"]
Мне нравится работать с docker compose, так что вот пример файла compose, который я бы использовал для запуска этого Dockerfile:
version: '3.0' services: app: container_name: my_go_app_container build: # context can/may/will be different per-project setup context: ../ dockerfile: GitDockerfile args: - bitbucket_id=private_user - bitbucket_token=private_token image: my_go_app_image # другие конфиги...
Конечно, Jenkins, Travis или кто-то еще может предоставить аргументы сборки при построении образа Docker, так что модули Go могут выполнять свою работу, не блокируясь надоедливой аутентификацией.
Альтернатива с SSH
Другой способ настроить это - использовать ваш SSH-ключ для подключения и установить ваш .gitconfig, как показано ниже, чтобы убедиться, что SSH используется каждый раз:
git config \ --global \ url."git@github.com".insteadOf \ "https://github.com"
Лично я обнаружил, что эту настройку немного сложнее отладить, когда столкнулся с проблемой, поэтому я предпочитаю использовать URL-адрес токена авторизации.
Перевод статьи: Go Modules with Private Git Repositories