Путь Golang
411 subscribers
16 photos
2 files
37 links
Всё о Golang

Ресурсы и материалы: https://t.iss.one/waygolang/12

Кроме чата, Golang обсудить можно тут: https://t.iss.one/gogolang
Download Telegram
#go #git #windows #ssh Часть I. Так получилось, что на работе мы используем Windows. Мне для одного проекта потребовалось использовать пакеты из приватных репозиториев. И из шкафа посыпались скелеты.

☝️ Современный GO умеет работать с Git, Subversion, Mercurial, Bazaar, и Fossil [1], но я рассматриваю только Git.

👉 Отмечу одну важную деталь: go mod ... и go get ... «ходят» не напрямую в ваш репозиторий, а через прокси, контролируемый значением переменной GOPROXY. Посмотрите, что говорит go env [2]. GO не просто пользуется прокси, а сверяет с базой контрольных сумм из переменной GOSUMDB. Переменные GONOPROXY и GONOSUMDB указывают, для каких путей импорта не будет использоваться прокси и/или база сумм. Переменная GOPRIVATE перечисляет пути импорта, для которых не будут использоваться ни прокси, ни суммы. Работу с приватными репозиториями следует начинать с настройки GOPRIVATE, ключ -w запишет переменную:
go env -w GOPRIVATE="git.mysecret.com/myrepo,git.supersecret.com"

🌧 Подвох кроется в том, что GO подавляет ввод пароля при работе с git. Что-то с этим придется делать.

🍏 Первый способ заключается в сохранении логина и пароля через настройку конфигурации [3]:
git config credential.helper store
или
git config credential.helper cache
Затем надо «поработать» с нужными приватным репозиториями напрямую командами git, чтобы он запросил, а затем запомнил логин/пароль:
git clone или git pull или git push
В случае store git запомнит логин/пароль в файл, в случае cache — временно в память. Строго говоря, там довольно гибкая система этих credentials, можете почитать для себя. Это работает для доступа по https (умолчание). Можно сразу задать пользователя:
git config credential.https://example.com.username myusername
Ещё один способ — указать git переписывать URL [4]:
git config --global url."https://api:$[email protected]/".insteadOf "https://github.com/"

🍐 Но что, если требуется использовать SSH (например, используется gitolite) и соответственно с ключами SSH? ...

Продолжение дальше...

[1]
https://go.dev/ref/mod
[2] https://proxy.golang.org/
[3] https://git-scm.com/docs/gitcredentials
[4] https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf
#go #git #windows #ssh Часть II. Так получилось, что на работе мы используем Windows. Мне для одного проекта потребовалось использовать пакеты из приватных репозиториев. И из шкафа посыпались скелеты.

... продолжение

🍐 Но что, если требуется использовать SSH (например, используется gitolite) и соотвественно с ключами SSH? Используем перенаправление:
git config --global url."ssh://git@examples.com/".insteadOf "https://examples.com/"
Это заставит git использовать протокол SSH для выбранного URL.

🌶 Если ключ SSH можно хранить прямо на машине, то всё относительно просто. А вот если на ключе SSH должен стоять пароль, то начинаются вопросы. Нам требуется ssh-agent

На современных Windows 10 и 11 прямо в поставке идёт Windows-порт OpenSSH [5], его из коробки видит Git для Windows. Всё будет работать само. Кроме ssh-agent. После выполнения в PowerShell этих простых команд, в Windows появится сервис ssh-agent, который будет запускаться автоматически при перезагрузке компьютера [6][7]:
Get-Service -Name sshd | Set-Service -StartupType Automatic
Start-Service sshd
Командой ssh-add можно добавить ключи в агента. Никаких переменных окружения не надо настраивать. Современный агент работает через именованный канал (named pipe) [8]. Переменная SSH_AUTH_SOCK не используется ssh-agent в Windows.

В Windows OpenSSH ssh-agent запоминает добавленные ключи в реестр Windows, откуда считывает их при перезагрузке.Эти ключи может использовать только тот пользователь, который их добавил. Но если у пользователя Windows нет пароля, то ключ оказывается доступен для всех [9], и придется каждый раз удалять его через ssh-agent -d или ssh-agent -D

☣️ Этим недостатком не обладает старый добрый PuTTY. Можно настроить его.

☝️ Стандартная поставка Git для Windows включает команды start-ssh-agent.cmd и start-putty-agent.cmd. Представляют исторический интерес.

🏆 В современном Windows есть подсистема WSL2 (Windows Subsystem for Linux), и можно пользоваться ею. Ставим Windows Terminal (предупреждаю, без него без слез невозможно работать в Linux-консоли), инициализируем WSL2 [10] и просто работаем. Там и агент сразу запустится. С WSL2 умеют работать и vim, и VSCode [11] и GoLand [12]. Смотрите, для VSCode достаточно набрать code . внутри вашего воркспейса в WSL!

🛠 Важно! И PowerShell, и WSL2, и OpenSSH — это часть поставки Windows. Они просто есть. Windows Terminal является родной программой Microsoft, но в Windows 10 его придется через «Приложения Microsoft», а в Windows 11 он идет в поставке системы.

[5] https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse
[6] https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement
[7] https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-service
[8] https://github.com/PowerShell/Win32-OpenSSH/issues/1136
[9] https://github.com/PowerShell/Win32-OpenSSH/issues/1487
[10] https://docs.microsoft.com/en-us/windows/wsl/install
[11] https://code.visualstudio.com/docs/remote/wsl
[12] https://www.jetbrains.com/help/go/2022.1/how-to-use-wsl-development-environment-in-product.html