Инструментарий — Примеры
Пример 1 — Один бинарный файл для целевой платформы
Небольшая служба заказов собирается и запускается на ноутбуке разработчика с x86-64, тогда как развёртывание идёт на хосте с Linux и arm64, а шаг выпуска просто копирует то, что произвёл ноутбук. Напишите команду сборки, которая выдаст артефакт, пригодный для запуска на этом хосте, и объясните, за счёт чего результат самодостаточен.
$ go build -o orders ./cmd/orders
$ ./orders
listening on port 8080 # работает на машине сборки
$ ./orders # после копирования на хост развёртывания
cannot execute binary file: Exec format error
Решение
$ GOOS=linux GOARCH=arm64 go build -ldflags "-s -w" -o dist/orders ./cmd/orders
$ file dist/orders
dist/orders: ELF 64-bit LSB executable, ARM aarch64, statically linked (иллюстративно)
Две настройки в команде называют целевую операционную систему и архитектуру, а флаги компоновщика опускают отладочную информацию, — поэтому на хост копируется один небольшой файл, которому ничего не нужно установленным. В этот файл компиляция свела все зависимости, поэтому образ, куда его кладут, может не содержать больше ничего, а обычно ошибаются иначе: целевую платформу оставляют на момент выпуска, и тогда сбой всплывает ошибкой формата Exec в конвейере, где пересборка дорога, а не на самой сборке.
Пример 2 — Дифф с одним видом изменений
Обработчик приходит с авторскими отступами, и в пул-реквесте файл переформатируют, одновременно меняя вычисление. Приведите файл к тому виду, который оставляет форматтер, и организуйте изменение так, чтобы рецензент видел только один вид различий.
func Total(items []Item) Money {
var sum Money
for _,it:=range items {
sum = sum.Add(it.Price)
}
return sum
}
Решение
func Total(items []Item) Money {
var sum Money
for _, it := range items {
sum = sum.Add(it.Price)
}
return sum
}
Вывод форматтера детерминирован. Если применить его отдельным коммитом, изменение поведения останется в диффе, где больше ничего нет, а одна и та же команда выполняется и в редакторах, и в непрерывной интеграции. Однако ручное форматирование даёт обратный результат: проверка переписывает файл заново, и рецензенту приходится разбираться, какие различия важны.