Инструментарий — Примеры

Пример 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
}

Вывод форматтера детерминирован. Если применить его отдельным коммитом, изменение поведения останется в диффе, где больше ничего нет, а одна и та же команда выполняется и в редакторах, и в непрерывной интеграции. Однако ручное форматирование даёт обратный результат: проверка переписывает файл заново, и рецензенту приходится разбираться, какие различия важны.