go mod download и упираются в задержку до прокси или в политику контрольных сумм. В статье: матрица решений «свой прокси модулей» против публичной цепочки GOPROXY, таблица переменных (GOPRIVATE, GONOPROXY, GOSUMDB, GOMODCACHE и др.) и готовые export для CI. Без дублирования тем npm/Homebrew/SPM — только экосистема Go. Навигация без входа: главная, список блога; см. также матрицу uv/PyPI для соседнего стека.
- Цепочка «ломается» на первом хопе: региональное зеркало отвечает медленно или отдаёт 5xx, а до
directили второго прокси очередь не доходит из‑за неверного порядка вGOPROXYили запрета на финальный источник. - Утечка приватных путей: внутренние модули уходят в публичный кеш, потому что vanity‑импорты не попали в
GOPRIVATEилиGONOPROXYне совпадает с реальными префиксами путей. - Диск и блокировки кеша: общий
GOMODCACHEна медленном томе или без политики очистки даёт всплески IO и непредсказуемое время холодногоgo testпри параллельных job.
① Матрица: свой прокси модулей и публичная цепочка GOPROXY
Используйте таблицу до правок launchd, shell‑профилей или YAML CI. Цель — предсказуемая задержка первого байта и дисциплина checksum для публичных зависимостей, а не «какой прокси ответил первым».
В GOPROXY значения разделяются запятой или |: при запятой инструмент перебирает прокси по очереди до успешного ответа; direct означает обход прокси к исходному VCS, off — полный отказ от сетевых прокси (осторожно в CI). Для трансграничных раннеров часто выгоден ближайший к машине первый хоп, а не «самый известный» глобальный URL — измерьте задержку с самого Mac, а не с ноутбука разработчика.
| Подход | Когда уместен | Риски на удалённом Mac CI |
|---|---|---|
| Свой прокси (Athens, goproxy и т.п.) | Нужен кеш в периметре, снимок zip для аудита, буфер при сбоях апстрима или политика «только разрешённые модули» | Сами ведёте квоты диска, TLS, бэкапы; нужен план failover (вторая нода, DNS, healthcheck) |
| Публичная цепочка (корп. зеркало, регион, proxy.golang.org, direct) | Мало сил на сопровождение и допустим исходящий трафик к глобальной инфраструктуре | Упорядочивайте хопы по комплаенсу и RTT; direct в конце только если разрешён доступ к VCS из раннера |
| Гибрид | Публичные модули идут через цепочку, приватные — напрямую во внутренний Git или отдельный сегмент прокси | Строго согласуйте GONOPROXY с каждым приватным префиксом; DNS Git должен совпадать на всех раннерах |
На Apple Silicon выгодно держать GOMODCACHE на локальном NVMe: модули — это мелкие zip и метаданные; узкое место редко в CPU.
② Таблица параметров: GOPROXY, приватность, sumdb и каталоги
Задавайте на уровне job, пула машин или репозитория. Пути подставьте свои; секреты не печатайте в логах шагов.
| Переменная | Роль | Пример или шаблон |
|---|---|---|
GOPROXY |
Упорядоченный список прокси модулей; перебор слева направо до успеха | https://go.corp.example,https://proxy.golang.org,direct |
GOPRIVATE |
Префиксы, для которых меняется поведение прокси/sumdb (приватность) | github.com/myorg/*,*.corp.example |
GONOPROXY |
Префиксы, которые не должны ходить через записи GOPROXY |
Часто дублирует GOPRIVATE для внутреннего Git |
GONOSUMDB |
Префиксы без обращения к checksum DB | Приватные модули без публичного sumdb |
GOSUMDB |
Сервис контрольных сумм для публичных модулей; off только по регламенту |
sum.golang.org или URL внутреннего sum |
GOMODCACHE |
Каталог скачанных модулей (исходники и zip) | /usr/local/ci/gomod-shared или подкаталог с CI_PIPELINE_ID |
GOPATH (наследие) |
Влияет на рабочие пути вне чистого modules‑режима | Не смешивайте с GOMODCACHE без необходимости |
GOFLAGS |
Глобальные флаги, напр. -mod=readonly в CI |
-mod=readonly при закоммиченном go.sum |
Другие гайды по ускорению загрузок на MacPull: Git и слои Docker (образы и реестры), Rust Cargo — отдельные цепочки зеркал и lockfile.
③ Исполняемая настройка: пять шагов для воспроизводимых загрузок
go version на раннерах стабилизирует go.sum и смысл -mod=readonly.GOPRIVATE и GONOPROXY, затем в том же shell выполните go env GOPRIVATE GONOPROXY в CI‑логе (без секретов).proxy.golang.org или direct по политике.GOSUMDB; если используете off, оформите исключение в документации пайплайна.GOMODCACHE; раздельные пулы при смешении регламентированного и публичного кода; план prune.Пример пролога для CI (подставьте свои хосты):
export GOPROXY="https://go.corp.example.com,https://proxy.golang.org,direct"
export GOPRIVATE="github.com/myorg/*,go.corp.example/*"
export GONOPROXY="github.com/myorg/*,go.corp.example/*"
export GONOSUMDB="github.com/myorg/*,go.corp.example/*"
export GOSUMDB="sum.golang.org"
export GOMODCACHE="${HOME}/.cache/go-mod-${CI_PIPELINE_ID:-local}"
export GOFLAGS="-mod=readonly"
mkdir -p "$GOMODCACHE"
Проверка перед тяжёлыми тестами: go env | grep -E 'GOPROXY|GOPRIVATE|GOSUMDB|GOMODCACHE' и go list -m all.
④ Короткий чеклист для дизайн‑доков и ревью
Задержка до первого байта от первого прокси в цепочке часто важнее «мощности CPU» при большом числе мелких модулей — снимите TTFB по каждому хопу.
GOFLAGS=-mod=readonly мешает случайно переписать граф зависимостей в середине PR в регламентированных пайплайнах.
Место на диске: закладывайте запас под GOMODCACHE вместе с образами Docker и артефактами, чтобы параллельные job не забивали корневой том APFS.
Итог
Свой прокси модулей выбирайте при необходимости хранить zip в периметре, аудировать поставки или переживать кратковременные отключения апстрима. Публичную цепочку GOPROXY — когда допустим внешний egress и мало ресурса на сопровождение. Всегда согласуйте GOPRIVATE с GONOPROXY, держите осмысленную политику GOSUMDB для публичного кода и закрепите GOMODCACHE на быстром диске каждого удалённого Mac в пуле.
Нужен выделенный Apple Silicon рядом с вашим регионом для стабильного CI: откройте тарифы, оформите покупку или загляните в центр помощи — чтение без входа.
Дальше по инфраструктуре раннера: FAQ пула Mac: параллельные загрузки и диск; вернуться к оглавлению блога.