GoReleaser
GoReleaser builds Go binaries for several platforms, creates a github release and then push a homebrew formulae to a repository. All that wrapped in your favorite CI.
This project adheres to the Contributor Covenant code of conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to root@carlosbecker.com.
How it works?
The idea started with a simple shell script, but it quickly became more complex and I also wanted to publish binaries via homebrew.
So, the all-new goreleaser was born.
Usage
Create a goreleaser.yml file in the root of your repository. A minimal config
would look like this:
repo: user/repo
binary_name: my-binary
You may then run releaser at the root of your repository:
curl -s https://raw.githubusercontent.com/goreleaser/get/master/latest | bash
For that to work, you need to export a GITHUB_TOKEN environment variable with
the repo scope selected. You can create one
here.
GoReleaser uses the latest Git tag of your repository, so you need to create a tag first.
This will build main.go as my-binary, for Darwin and Linux
(amd64 and i386), archive the binary and common files as .tar.gz,
and finally, publish a new github release in the user/repo repository with
archives uploaded.
Homebrew
Add a brew section to push a formulae to a Homebrew tab repository:
repo: user/repo
binary_name: my-binary
brew:
  repo: user/homebrew-tap
  folder: optional/subfolder/inside/the/repo
  caveats: "Optional caveats to add to the formulae"
See the Homebrew docs for creating your own tap.
Build customization
Just add a build section
repo: user/repo
binary_name: my-binary
build:
  main: ./cmd/main.go
  ldflags: -s -w
  oses:
    - darwin
    - freebsd
  arches:
    - amd64
osesandarchesshould be inGOOS/GOARCH-compatible format.
-s -wis the default value forldflags.
Archive customization
You can customize the name and format of the archive adding an archive
section:
repo: user/repo
binary_name: my-binary
archive:
  name_template: "{{.BinaryName}}_{{.Version}}_{{.Os}}_{{.Arch}}"
  format: zip
  replacements:
    amd64: 64-bit
    386: 32-bit
    darwin: macOS
    linux: Tux
- Default
name_templateis{{.BinaryName}}_{{.Os}}_{{.Arch}}- Valid formats are
tar.gzandzip, default istar.gz- By default,
replacementsreplaceGOOSwithuname -svalues andGOARCHwithuname -mvalues. They keys should always be in theGOOSandGOARCHform.
Add more files
You might also want to change the files that are packaged by adding a files
section:
repo: user/repo
binary_name: my-binary
files:
  - LICENSE.txt
  - README.md
  - CHANGELOG.md
By default GoReleaser adds the binary itself,
LICENCE*,LICENSE*,README*andCHANGELOG*.
ldflags (main.version)
GoReleaser already sets a main.version ldflag, so, in you main.go program,
you can:
package main
var version = "master"
func main() {
  println(version)
}
And this version will always be the tag name.
Wire it with travis-ci
You may want to wire this to auto-deploy your new tags on travis, for example:
after_success:
  test -n "$TRAVIS_TAG" && curl -s https://raw.githubusercontent.com/goreleaser/get/master/latest | bash
What the end result looks like
The release on github looks pretty much like this:
And the homebrew formulae would look like:
class Release < Formula
  desc "Deliver Go binaries as fast and easily as possible"
  homepage "https://github.com/goreleaser/releaser"
  url "https://github.com/goreleaser/releaser/releases/download/v0.2.8/release_Darwin_x86_64.tar.gz"
  version "v0.2.8"
  sha256 "9ee30fc358fae8d248a2d7538957089885da321dca3f09e3296fe2058e7fff74"
  def install
    bin.install "release"
  end
end
How to contribute
Please refer to our contributing guidelines.
Badges
Feel free to use it in your own projects:
[](https://github.com/goreleaser)
