Skip to content

NGRsoftlab/Astra-golang-build-utils-image

Repository files navigation

NGRSOFTLAB logo

Golang build utils

Dive efficiency Made with love Powered by Docker NGR Team

Gopher image

Gopher Art под авторством Ashley McNamara.

Description

Среда для сборки контейнера с зависимостями для Golang. Основан на сборочных компонентах Google и таблице соотношения Debian-Astra

Присоединяйтесь к нашим социальным сетям:

NGR Social Telegram       NGR Social Media

Contents

Среда для сборки Golang, на основе отечественной ОС AstraLinux

Для начала работы необходимо установить pre-commit и хуки

$ pip install pre-commit
$ pre-commit --version

pre-commit 4.2.0

$ pre-commit install

pre-commit installed at .git/hooks/pre-commit
pre-commit installed at .git/hooks/commit-msg
pre-commit installed at .git/hooks/pre-push

Warning

Чтобы проверить свои изменения, воспользуйтесь командой pre-commit run --all-files. Чтобы проверить конкретную задачу, воспользуетесь командой pre-commit run <target> --all-files. Если Вы понимаете что творите и хотите пропустить проверку pre-commit-ом воспользуйтесь --no-verify, пример git commit -m "Добавил изменения и не хочу проверки" --no-verify

Собрать образ Astra Linux based

## Export Golang build utils version
export ASTRA_VERSION='1.7.5'
export GOLANG_BUILD_UTILS_VERSION="1.0.0-astra${ASTRA_VERSION}"

## Golang build utils image: 952MB
docker build \
    --progress=plain \
    --no-cache \
    -t golang-build-utils:"${GOLANG_BUILD_UTILS_VERSION}" \
    .
Имя Значение по умолчанию Тип Описание
image_registry '' string Адрес до реестра образа. Например: --build-arg image_registry=my-container-registry:1111/
image_name astra string Имя образа.
image_version 1.7.5 string Версия образа.
Таблица 1. Переопределяемые аргументы для сборки образа.

 

Представление Makefile-а, который используется в CI-е Представление Makefile-а, который используется в Svace

Особенности сборки:

Минимальная требуемая версия Go bootstrap зависит от целевой версии Go, которую необходимо собрать из исходного кода

  • Go <= 1.4: набор инструментов для языка C
  • 1.5 <= Go <= 1.19: компилятор Go 1.4
  • 1.20 <= Go <= 1.21: компилятор Go 1.17
  • 1.22 <= Go <= 1.23: компилятор Go 1.20
  • В дальнейшем Go версии 1.N потребует компилятор Go 1.M, где M - это N-2, округленное до четного числа. Пример: Go 1.24 и 1.25 требуют Go 1.22

Допустимые комбинации $GOOS и $GOARCH:

$GOOS $GOARCH
aix ppc64
android 386
android amd64
android arm
android arm64
darwin amd64
darwin arm64
dragonfly amd64
freebsd 386
freebsd amd64
freebsd arm
illumos amd64
ios arm64
js wasm
linux 386
linux amd64
linux arm
linux arm64
linux loong64
linux mips
linux mipsle
linux mips64
linux mips64le
linux ppc64
linux ppc64le
linux riscv64
linux s390x
netbsd 386
netbsd amd64
netbsd arm
openbsd 386
openbsd amd64
openbsd arm
openbsd arm64
plan9 386
plan9 amd64
plan9 arm
solaris amd64
wasip1 wasm
windows 386
windows amd64
windows arm
windows arm64
Таблица 2. Соотнесение переменной GOOS к переменной GOARCH.

 

Данные переменные могут использоваться как для локальной сборки, так и для сборки через CI. Данные переменные применимы и оказывают эффект на скрипт. Данный скрипт работает в двух режимах:

  • Обеспечивает сборку набора ПО для компиляции Golang-a старших версий/поколений(далее bootstrap)
  • Сборка бинарного файла go и gofmt
Имя Значение по умолчанию Тип Описание
GOLANG_BUILD_ENTITY ${CI_COMMIT_REF_NAME} stringspec Ветка/тег собираемого интерпретатора. Если не указно, то использует предопределенные переменные GitLab-a.
GOLANG_IS_BOOTSTRAP '' string Проверка, является ли данная сборка bootstrap-ом. Если указано true, то происходит кросс-компиляция цепочки инструментов для этой GOOS/GOARCH сборки. В дальнейшем, этот набор инструментов используется как компилятор для старших поколений golang.
GOOS тут string Тип ОС, если не будет указано/предустановлено иное, будет использовано значение по умолчанию.
GOARCH тут string Архитектура ОС, если не будет указано/предустановлено иное, будет использовано значение по умолчанию.
DEBUG '' string Включить режим отладки для входной точки. Установите переменную как -e DEBUG=ON чтобы включить режим отладки.
PUBLISH_REGISTRY_UPLOAD_URL '' string Относится к шаблону загрузки артефактов. Корневой URL до реестра артефактов. Пример: https://my-registry:8118.
PUBLISH_REGISTRY_UPLOAD_REPOSITORY_NAME '' string Относится к шаблону загрузки артефактов. Имя репозитория реестра, куда будет сложен артефакт сборки.
PUBLISH_REGISTRY_UPLOAD_DESTINATION_DIRECTORY_NAME '' string Относится к шаблону загрузки артефактов. Имя вложенности внутри реестра, куда будет сложен артефакт сборки.
Таблица 3. Переопределяемые аргументы для скрипта сборки.

 

  1. Склонировать репозиторий с компилятором
  2. Войти в интерактивную среду данного образа: docker run -it --rm -v "$(pwd):/build" -w /build golang-build-utils:1.0.0-astra1.7.5 bash
  3. Объявить необходимые переменные, чтобы сформировать окружение для работы скрипта
  4. Запустить сборщик: go-builder

Пример запуска сборщика

export GOLANG_BUILD_ENTITY='release-branch.go1.4'
export GOLANG_IS_BOOTSTRAP=true
export PUBLISH_REGISTRY_UPLOAD_URL='https://my-registry:8118'
export PUBLISH_REGISTRY_UPLOAD_REPOSITORY_NAME='golang-bootstrap'
export PUBLISH_REGISTRY_UPLOAD_DESTINATION_DIRECTORY_NAME='golang'
go-builder

Caution

Негативное влияние тестов: при сборке golang в режиме all.bash(где проходят и тесты) существует данная ошибка. По сути, это не ошибка, а проблема в тех, кто пишет эти тесты. Дело в том, что они 'встраивают' как хендшейки, так и сертификаты внутрь, проводят их проверку, что приводит к их невозможности выполнения, из-за разности в датах. Решением проблемы может послужить ЯВНОЕ ИГНОРИРОВАНИЕ тестов или запуск make.bash, что тождественно равно в обоих случаях.

  • Альтернативное и, пожалуй, эффективное средство использовать патчи на нашей стороне
# https://github.com/golang/go/issues/71077
--- FAIL: TestVerifyConnection (0.01s)
    --- FAIL: TestVerifyConnection/TLSv12 (0.00s)
        handshake_client_test.go:1721: RequireAndVerifyClientCert-FullHandshake: handshake failed: remote error: tls: bad certificate
    --- FAIL: TestVerifyConnection/TLSv13 (0.01s)
        handshake_client_test.go:1721: RequireAndVerifyClientCert-FullHandshake: handshake failed: remote error: tls: bad certificate
--- FAIL: TestResumptionKeepsOCSPAndSCT (0.00s)
    --- FAIL: TestResumptionKeepsOCSPAndSCT/TLSv12 (0.00s)
        handshake_client_test.go:2512: handshake failed: remote error: tls: bad certificate
    --- FAIL: TestResumptionKeepsOCSPAndSCT/TLSv13 (0.00s)
        handshake_client_test.go:2512: handshake failed: remote error: tls: bad certificate
FAIL
FAIL    crypto/tls      0.947s

# https://github.com/golang/go/issues/68564
--- FAIL: TestCrossVersionResume (0.02s)
    --- FAIL: TestCrossVersionResume/TLSv12 (0.01s)
        handshake_server_test.go:526: handshake did not resume at the same version
    --- FAIL: TestCrossVersionResume/TLSv13 (0.01s)
        handshake_server_test.go:526: handshake did not resume at the same version
FAIL
FAIL    crypto/tls    0.713s
  • Периодически возникающая ошибка. Может означать повышенную нагрузку на стенды. Она временного характера и не является ошибкой сборки
# https://github.com/golang/go/issues/67599
--- FAIL: TestLongAdjustTimers (8.69s)
    tick_test.go:226: failed to read work, iteration 10274
FAIL
FAIL time 41.078s

Warning

Скачиванию подлежат артефакты, без окончания *-bootstrap.tgz

Шаги по установке продукта:

  1. Скачать необходимый компилятор из реестра артефактов
  2. Удалить старые бинарные файлы и экспортировать новые rm -rf /usr/local/go && tar -C /usr/local -xzf go1.24.1-linux-amd64.tgz
  3. Добавить новый бинарный файл в переменные среды export PATH="${PATH}:/usr/local/go/bin"
  4. Проверить версию установленного бинарного файла go version

Пример:

## Удаляем старую версию Golang-a
rm -rf /usr/local/go

## Скачиваем артефакт
curl --silent \
    https://example.registry.com/golang/go1.24.1-linux-amd64.tgz | tar -C "/usr/local" -zx

## Обновляем переменные среды
export PATH="${PATH}:/usr/local/go/bin"

## В качестве проверки проверяем версию продукта
go version

## Попробуем установить пакет
go install golang.org/x/tools/gopls@latest
Gopher panic image
Gopher Art под авторством tottie / Renée French.

About

Проект сборочного образа Golang на основе отечественной ОС Astra Linux

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Contributors