# Настройка рабочего окружения для работы с Golang ## Настройка Git ```bash git config --global user.name "My Name" git config --global user.email m.name@cyrm.ru ``` ## Настройка общего окружения Для начала нужно настроить все пути для утилит и приватных репозиториев: ```bash # Путь до конфига командной оболочки (обычно это просто ~/.bashrc) SHELL_RC=~/.$(basename $SHELL)rc echo " # Golang environment export GOPATH=$HOME/go # можно поменять на свой export GOBIN=$GOPATH/bin # это для утилит, которые ставятся через go install export PATH=$PATH:$GOBIN # чтобы пользоваться установленными чреез go install утилитами export GOPRIVATE=$GOPRIVATE,gitlab.cyrm.center " >> $SHELL_RC # или в ~/.profile # Применяем окружение к текущей сессии source $SHELL_RC ``` ## Настройка окружения для установки Go зависимостей из наших приватных репозиториев Gitlab Далее настраиваем авторизованное получение Go репозиториев черз `go get`: 1. Идем в [gitlab.cyrm.center](https://gitlab.cyrm.center/); 3. В верхнем-правом углу кликаем по профилю, далее `Settings` → `Access Tokens`. 4. Создаем себе токен с правами (`api` **или** `read_api` и `read_repository`, и `write_repository`). --- (**Вариант A**) далее выполняем команды: ```bash export GLT = "<place your personal gitlab token>" echo -e " machine gitlab.cyrm.center login gitlab-ci-token password $GLT " > ~/.netrc ``` --- (**Вариант B**): можно `~/.gitconfig` добавить: ``` # HTTPS [url https://gitlab-ci-token:{you_gitlab_token}@gitlab.cyrm.center/] insteadOf = https://gitlab.cyrm.center/ # HTTP [url http://gitlab-ci-token:{you_gitlab_token}@gitlab.cyrm.center/] insteadOf = http://gitlab.cyrm.center/` ``` --- По умолчанию рекоммендуется использовать **Вариант A**, т.к. он позволяет получать репозитории из мультигрупп GitLab'а. Например, [https://gitlab.cyrm.center/rupor/rupor-user-comments.git](https://gitlab.cyrm.center/rupor/rupor-user-comments.git) можно поставить через ```bash go get gitlab.cyrm.center/rupor/rupor-user-comments.git ``` выбрав любой из вариантов. Но вот какой-нибудь `https://gitlab.cyrm.center/group1/rupor/rupor-microservice.git` *не* утсановиться, _если_ выбрать **Вариант B** (это баг GitLab'а, который они по политическим причинам не устраняют уже год). Ну и так проще *Dockerfile* будет выглядеть: одна команда: `COPY ~/.netrc ~/.netrc` и мы можем ставить все зависимости в контейнер через `go mod download`. Во избежании утечки собственных токенов рекоммендуется, лучше завести сервисного пользователя (без прав на запись в репозитории) и его `.netrc` раздать всем (в какую-нибудь `~/.config/.bot_netrc`) и в `Dockerfile` уже прописывать `COPY ~/.config/.bot_netrc /root/.netrc`. Либо передавать токен через аргументы в `Dockerfile`: ```dockerfile FROM golang:alpine AS builder ARG GITLAB_LOGIN ARG GITLAB_TOKEN WORKDIR /app # Allow pulling private modules RUN apk add --no-cache git RUN echo "machine git.petfinder.com login ${GITLAB_LOGIN} password ${GITLAB_TOKEN}" > ~/.netrc # ... ``` B передавать через ```bash docker build --build-arg {GITLAB_LOGIN} --build-arg {GITLAB_TOKEN} . ``` --- Есть еще вариант C - через SSH-ключи (возможно, появится тут позже). ## Установка вспомогательного софта: ```bash go install golang.org/x/tools/cmd/goimports@latest go install mvdan.cc/gofumpt@latest ``` `gofumpt` - полностью обратносовместнимый форк `gofmt`, только чуть более строгий (важно, когда линтеры не настроены еще); `goimports` - сортирует импорты по определенным правилам, принятым в командах гугла для удобочитаемости; ### goimports в GoLand **Для использования вручную** В контекстном меню (правый клик по коду) в `Go Tools` должна появиться опция `Goimports file` **Для автоматического запуска** Для пользователей GoLand можно настроить автоматическую корректировку `goimports`: `File`→`Settings`→`Tools`→`File Watchers`→`+` и выбираем `goimports`. Далее в Arguments вписываем: `-local gitlab.cyrm.center -w $FilePath$` Остальные поля оставить без изменений, далее `OK`→`Apply`→`OK`. ## Получение подробных логов работы Go утилит Для получения подробной информации, почему что-то не ставится через `go get`, например, можно использовать следующие окружения: * `GIT_SSH_COMMAND="ssh -v" go get/mod/tidy/... ...` - когда пакеты ставятся через SSH и неясно, какие команды использует Go; * `GIT_TRACE=2 go get/mod/tidy/... # цифра - уровень подбробностей` - когда пакеты ставятся через HTTPS/SSH, но непонятно, какие `git` команды использует Go;