Написав очередную поделку на Go решил поделиться с сообществом, а чтобы никто не компилировал ее у себя дома можно воспользоваться тем скудным механизмом релизов, что предлагает Github. Но собирать и заливать артефакты сборки руками это не наш путь, ищем готовые решения. Собираем список качеств для такого инструмента:
- Сборка бинарников под Linux/Mac, с установкой значений для ldflags флагов;
- Автоматическая генерация описания релиза из сообщений к коммитам;
- Единообразие - чтобы не собирать релиз из палок и веревок.
Вооружившись списком идем на Github в поисках подходящего инструмента.
aktau/github-release
Простой как дверь, не умеет ничего кроме заведения нового или редактирования существующего релиза. И даже не умеет, создавая релиз, заливать в него файлы пачкой, страдай заливая по одному файлу.
Имея такой скудный набор функций заставляет помнить тонну флагов, без которых отказывается работать. Не умеет сам билдить и не предлагает примеров по построению такого процесса. Выбирать такой инструмент смысла нет, несмотря на такое количество звезд на Github.
$ github-release release \
--user aktau \
--repo gofinance \
--tag v0.1.0 \
--name "the wolf of source street" \
--description "Not a movie, contrary to popular opinion. Still, my first release!" \
$ github-release upload \
--user aktau \
--repo gofinance \
--tag v0.1.0 \
--name "gofinance-osx-amd64" \
--file bin/darwin/amd64/gofinance
tcnksm/ghr
Сам автор сравнивает свой инструмент с предыдущим кандидатом говоря, что его поделка еще проще. Местами он проще и умеет читать из файла .git/config
название репозитория для создания релиза, а еще умеет заливать все файлы разом в параллель. На этом плюсы заканчиваются, сборка релиза и описание остаются без внимания.
$ ghr -b "Release description" v0.1.0 pkg/
c4milo/github-release
Похож на ghr но не умеет читать настройки из git. Единственный из претендентов кто решил помочь советом как из gox и Makefile сделать готовый релиз и залить на Github, собрав при этом описание из сообщений к коммитам.
$ gox -ldflags "-X main.Version=v0.1.0" \
-osarch="darwin/amd64" \
-os="linux" \
-output "dist/{{.Dir}}_$(VERSION)_{{.OS}}_{{.Arch}}/$(NAME)" \
./...
$ github-release \
c4milo/release \
v0.1.0 \
"$$(git rev-parse --abbrev-ref HEAD)" \
"**Changelog**<br/>$$(git log $$comparison --oneline --no-merges)" \
"dist/*";
goreleaser/goreleaser
Просто комбайн, умеет много и при этом тщательно это скрывает. Редкий случай когда такой монстр может быть таким простым в управлении. Конфигурация по сборке хранится в файле .goreleaser.yml
, а потому для сборки флагами можно пренебречь. Умеет собирать, запаковывать и заливать билды под все платформы, генерить описание из сообщений к коммитам и даже делать формулы для Homebrew.
Но есть и минусы - излишня любовь к саморекламе, описания к релизам будут содержать подпись “Automated with GoReleaser…”. А еще у него сносит башню если текущий git HEAD не указывает на тег с номеров версии. Но если смириться с этим, то вариантов выбирать что-то отличное от goreleaser просто нет.