Fast and easy Go binaries delivery


I have some apps written in Go, which I deliver as binaries for each platform using GitHub releases. Until now, I was doing it with a very simple shell script.

But, I also wanted to dist these new releases in a homebrew tap. Adding that in the script would be kind of trivial, but I didn’t like the way I was using it all (arguments, hacks, etc).

I could, of course, change the formulas by hand, but I’m lazy and that seems just too much work for me.

So, time to my shell script to evolve!

goreleaser

I wanted a tool that:

  • provides reproducible builds
  • is fast
  • is easy to wrap with the CI
  • distributes itself

So, I created goreleaser!

goreleaser logo

GoReleaser can build and release go binaries in tar.gz for several platforms, and can create/update homebrew formulaes. All that by having a simple goreleaser.yml in the repository root:

repo: goreleaser/releaser
binary_name: release
brew:
  repo: goreleaser/homebrew-formulae
build:
  oses:
    - windows
    - darwin
    - linux

Then, I basically wire this in the .travis.yml:

after_success:
  test -n "$TRAVIS_TAG" && curl -s https://raw.githubusercontent.com/goreleaser/get/master/latest | bash

Which generates release like this on GitHub:

Release screenshot

It is so easy that I’m already using it in all my suitable Go projects:

  • GoReleaser itself!
  • Antibody - A faster and simpler antigen written in Golang
  • CloneOrg - Clone all repos of a github organization
  • ForkCleaner - Cleans up old and inactive forks on your github account
  • GithubVacations - Automagically ignore all notifications related to work when you are on vacations
  • KarmaHub - Compares the amount of issues and pull requests you created with the amount of comments and code reviews you did
  • OrgStats - Get the contributor stats summary from all repos of any given organization
  • TorrentWatcher - Automagically download torrent files to ~/Downloads

Roadmap

The roadmap is pretty much what you find in the issues, but, IMO, the highlights are:

  • bintray support
  • create linux packages (with fpm or something)
  • post/pre build hooks

I believe those features will enable GoReleaser to be even more useful!

Community Feedback

I was very glad to see the results of GoReleaser!

Thank you all!

Related Posts

Writing cli applications with Golang

Measuring production code coverage with JaCoCo

From Travis Enterprise to BuildKite in 50 repositories