DevGang
Авторизоваться

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

#Golang #Git
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу