Перейти к содержимому
10 / 15

Воспроизводимые сборки: trimpath, детерминизм и одинаковые бинарники

Воспроизводимая сборка означает, что два запуска на одних исходниках дают побайтово одинаковый бинарник — это позволяет проверить, что выложенный артефакт собран именно из заявленного кода. Go к этому близок по устройству: компилятор детерминирован, а версии зависимостей зафиксированы алгоритмом минимальных версий и go.sum. Мешают три вещи. Абсолютные пути попадают в бинарник для трассировок и отладки — убирает флаг -trimpath. Значения, меняющиеся от сборки к сборке, — время сборки в -ldflags -X ломает воспроизводимость, поэтому либо его не подставляют вовсе, либо берут время коммита. Различия окружения: версия тулчейна, GOOS/GOARCH, CGO_ENABLED и переменные вроде GOEXPERIMENT входят в результат, поэтому их фиксируют. Проверяется всё просто: собрать дважды в разных каталогах и сравнить контрольные суммы. В цепочке поставок это основа для подписи артефактов и проверки происхождения.