2017-01-14 15:01:45 +02:00
# GoReleaser
2016-12-29 17:49:01 +02:00
2017-01-12 02:59:59 +02:00
< img src = "https://avatars2.githubusercontent.com/u/24697112?v=3&s=200" alt = "goreleaser" align = "right" / >
2016-12-29 21:55:07 +02:00
2017-01-14 23:24:25 +02:00
GoReleaser builds Go binaries for several platforms, creates a GitHub release and then
2017-01-21 22:38:53 +02:00
pushes a Homebrew formula to a repository. All that wrapped in your favorite CI.
2017-01-02 17:40:15 +02:00
2017-01-22 14:49:24 +02:00
This project adheres to the Contributor Covenant [code of conduct ](CODE_OF_CONDUCT.md ). By participating, you are expected to uphold this code.
2017-04-21 21:20:48 +02:00
We appreciate your contribution. Please refer to our [contributing guidelines ](CONTRIBUTING.md ) for further information.
2017-01-22 14:49:24 +02:00
2017-01-15 13:04:12 +02:00
[![Release ](https://img.shields.io/github/release/goreleaser/goreleaser.svg?style=flat-square )](https://github.com/goreleaser/goreleaser/releases/latest)
[![Software License ](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square )](LICENSE.md)
[![Travis ](https://img.shields.io/travis/goreleaser/goreleaser.svg?style=flat-square )](https://travis-ci.org/goreleaser/goreleaser)
2017-04-22 02:43:52 +02:00
[![Codecov branch ](https://img.shields.io/codecov/c/github/goreleaser/goreleaser/master.svg?style=flat-square )](https://codecov.io/gh/goreleaser/goreleaser)
2017-01-21 16:34:40 +02:00
[![Go Report Card ](https://goreportcard.com/badge/github.com/goreleaser/goreleaser?style=flat-square )](https://goreportcard.com/report/github.com/goreleaser/goreleaser)
2017-04-22 02:47:45 +02:00
[![Go Doc ](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat-square )](http://godoc.org/github.com/goreleaser/goreleaser)
2017-01-27 22:43:32 +02:00
[![SayThanks.io ](https://img.shields.io/badge/SayThanks.io-%E2%98%BC-1EAEDB.svg?style=flat-square )](https://saythanks.io/to/caarlos0)
2017-01-15 13:04:12 +02:00
[![Powered By: GoReleaser ](https://img.shields.io/badge/powered%20by-goreleaser-green.svg?style=flat-square )](https://github.com/goreleaser)
2017-01-13 13:10:36 +02:00
2017-01-24 19:33:59 +02:00
For questions join the [#goreleaser ](https://gophers.slack.com/messages/goreleaser/ ) channel in the [Gophers Slack ](https://invite.slack.golangbridge.org/ ).
2017-01-21 22:49:34 +02:00
# Table of contents
2017-01-21 22:38:53 +02:00
- [Introduction ](#intorduction )
- [Quick start ](#quick-start )
- [Environment setup ](#environment-setup )
- [Release customization ](#release-customization )
- [Integration with CI ](#integration-with-ci )
2016-12-29 17:49:01 +02:00
2017-01-21 22:38:53 +02:00
## Introduction
2016-12-29 17:49:01 +02:00
2017-01-21 22:38:53 +02:00
GoReleaser is a release automation tool for Golang projects, the goal is to simplify the build, release and publish steps while providing variant customization options for all steps.
2016-12-29 17:49:01 +02:00
2017-02-26 19:22:36 +02:00
GoReleaser is built for CI tools; you only need to [download and execute it ](#integration-with-ci ) in your build script.
2017-01-22 14:49:24 +02:00
You can [customize ](#release-customization ) your release process by createing a `goreleaser.yml` file.
We are also working on integrating with package managers, we currently support Homebrew.
2017-01-21 16:34:40 +02:00
2017-01-21 22:38:53 +02:00
The idea started with a [simple shell script ](https://github.com/goreleaser/old-go-releaser ), but it quickly became more complex and I also wanted to publish binaries via Homebrew.
2017-01-21 16:34:40 +02:00
2017-01-21 22:38:53 +02:00
_So, the all-new GoReleaser was born._
2016-12-29 17:49:01 +02:00
2017-01-21 22:38:53 +02:00
## Quick start
2017-01-04 10:21:46 +02:00
2017-01-21 22:38:53 +02:00
In this example we will build, archive and release a Golang project.
Create a GitHub repository and add a single main package:
```go
// main.go
package main
2017-01-14 15:01:45 +02:00
2017-01-21 22:38:53 +02:00
func main() {
println("Ba dum, tss!")
}
```
2017-01-21 22:49:34 +02:00
2017-01-21 22:38:53 +02:00
By default GoReleaser will build the **main.go** file located in your current directory, but you can change the build package path in the GoReleaser configuration file.
```yml
# goreleaser.yml
# Build customization
build:
2017-03-23 02:06:37 +02:00
binary: drum-roll
2017-01-21 22:38:53 +02:00
goos:
- windows
- darwin
- linux
goarch:
- amd64
```
2017-01-14 20:30:14 +02:00
2017-04-21 18:11:01 +02:00
PS: Invalid GOOS/GOARCH combinations will automatically be skipped.
2017-01-21 22:49:34 +02:00
This configuration specifies the build operating systems to Windows, Linux and MacOS using 64bit architecture, the name of the binaries is `drum-roll` .
2017-01-21 22:38:53 +02:00
2017-03-23 02:06:37 +02:00
GoReleaser will then archive the result binaries of each Os/Arch into a separate file. The default format is `{{.Binary}}_{{.Os}}_{{.Arch}}` .
2017-01-21 22:38:53 +02:00
You can change the archives name and format. You can also replace the OS and the Architecture with your own.
Another useful feature is to add files to archives, this is very useful for integrating assets like resource files.
```yml
# goreleaser.yml
# Build customization
build:
main: main.go
2017-03-23 02:06:37 +02:00
binary: drum-roll
2017-01-21 22:38:53 +02:00
goos:
- windows
- darwin
- linux
goarch:
- amd64
# Archive customization
archive:
format: tar.gz
2017-04-21 21:01:19 +02:00
format_overrides:
- goos: windows
format: zip
2017-01-21 22:38:53 +02:00
replacements:
amd64: 64-bit
darwin: macOS
linux: Tux
files:
- drum-roll.licence.txt
```
2017-01-21 22:49:34 +02:00
This configuration will generate tar archives, contains an additional file `drum-roll.licence.txt` , the archives will be located in:
- `./dist/drum-roll_windows_64-bit.tar.gz`
- `./dist/drum-roll_macOS_64-bit.tar.gz`
- `./dist/drum-roll_Tux_64-bit.tar.gz`
2017-01-21 22:38:53 +02:00
Next export a `GITHUB_TOKEN` environment variable with the `repo` scope selected. This will be used to deploy releases to your GitHub repository. Create yours [here ](https://github.com/settings/tokens/new ).
2017-01-21 22:49:34 +02:00
```console
$ export GITHUB_TOKEN=`YOUR_TOKEN`
2017-01-14 20:30:14 +02:00
```
2017-01-21 22:38:53 +02:00
GoReleaser uses the latest [Git tag ](https://git-scm.com/book/en/v2/Git-Basics-Tagging ) of your repository.
Create a tag:
2017-01-21 22:49:34 +02:00
```console
2017-01-30 18:22:39 +02:00
$ git tag -a v0.1.0 -m "First release"
2017-01-21 22:38:53 +02:00
```
2016-12-29 17:49:01 +02:00
2017-01-30 18:22:39 +02:00
**Note**: we recommend the use of [semantic versioning ](http://semver.org/ ). We
are not enforcing it though. We do remove the `v` prefix and then enforce
that the next character is a number. So, `v0.1.0` and `0.1.0` are virtually the
same and are both accepted, while `version0.1.0` is not.
2017-01-21 22:38:53 +02:00
Now you can run GoReleaser at the root of your repository:
2017-01-21 22:49:34 +02:00
```console
$ goreleaser
2017-01-21 22:38:53 +02:00
```
2017-01-15 19:58:45 +02:00
2017-02-26 19:46:21 +02:00
That's it! Check your GitHub project's release page.
The release should look like this:
2017-01-14 20:30:14 +02:00
2017-02-26 19:46:21 +02:00
[![image ](https://cloud.githubusercontent.com/assets/245435/23342061/fbcbd506-fc31-11e6-9d2b-4c1b776dee9c.png )
2017-01-21 22:38:53 +02:00
](https://github.com/goreleaser/goreleaser/releases)
2017-01-14 20:30:14 +02:00
2017-01-21 22:38:53 +02:00
## Environment setup
2016-12-29 17:49:01 +02:00
2017-01-21 22:38:53 +02:00
### GitHub Token
2017-01-21 22:49:34 +02:00
2017-01-21 22:38:53 +02:00
GoReleaser requires a GitHub API token with the `repo` scope checked to deploy the artefacts to GitHub. You can create one [here ](https://github.com/settings/tokens/new ).
2017-01-21 22:49:34 +02:00
This token should be added to the environment variables as `GITHUB_TOKEN` . Here is how to do it with Travis CI: [Defining Variables in Repository Settings ](https://docs.travis-ci.com/user/environment-variables/#Defining-Variables-in-Repository-Settings ).
2016-12-29 17:49:01 +02:00
2017-01-14 23:24:25 +02:00
### A note about `main.version`
2016-12-29 17:49:01 +02:00
2017-01-14 23:24:25 +02:00
GoReleaser always sets a `main.version` ldflag. You can use it in your
`main.go` file:
2017-01-12 00:10:02 +02:00
```go
package main
var version = "master"
func main() {
println(version)
}
```
2017-01-21 22:38:53 +02:00
`version` will always be the name of the current Git tag.
## Release customization
2017-01-21 22:49:34 +02:00
GoReleaser provides multiple customizations. We will cover them with the help of `goreleaser.yml` :
### Build customization
2017-01-21 22:38:53 +02:00
```yml
# goreleaser.yml
build:
2017-02-26 18:01:48 +02:00
# Path to main.go file or main package.
# Default is `.`
2017-01-21 22:38:53 +02:00
main: ./cmd/main.go
2017-02-22 14:25:43 +02:00
# Name of the binary.
# Default is the name of the project directory.
2017-03-23 02:06:37 +02:00
binary: program
2017-01-21 22:38:53 +02:00
2017-02-22 14:25:43 +02:00
# Custom build tags.
# Default is empty
flags: -tags dev
2017-03-26 01:24:38 +02:00
# Custom ldflags template.
# This is parsed with Golang template engine and the following variables
# are available:
# - Version
# - Date
# - Commit
# The default is `-s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}`
# Date format is `2006-01-02_15:04:05`
ldflags_template: -s -w -X main.build={{.Version}}
2017-01-21 22:38:53 +02:00
# GOOS list to build in.
# For more info refer to https://golang.org/doc/install/source#environment
# Defaults are darwin and linux
goos:
- freebsd
- windows
# GOARCH to build in.
# For more info refer to https://golang.org/doc/install/source#environment
# Defaults are 386 and amd64
goarch:
- amd64
2017-01-22 00:02:51 +02:00
# Hooks can be used to customize the final binary, for example, to run
# generator or whatever you want.
# Default is both hooks empty.
hooks:
2017-01-22 00:08:06 +02:00
pre: rice embed-go
2017-01-22 00:02:51 +02:00
post: ./script.sh
2017-01-21 22:49:34 +02:00
```
2017-01-21 22:38:53 +02:00
2017-01-21 22:49:34 +02:00
### Archive customization
2017-01-21 22:38:53 +02:00
2017-01-21 22:49:34 +02:00
```yml
# goreleaser.yml
2017-01-21 22:38:53 +02:00
archive:
# You can change the name of the archive.
# This is parsed with Golang template engine and the following variables
# are available:
2017-03-23 02:06:37 +02:00
# - Binary
2017-01-21 22:38:53 +02:00
# - Version
# - Os
# - Arch
2017-03-23 02:06:37 +02:00
# The default is `{{.Binary}}_{{.Os}}_{{.Arch}}`
name_template: "{{.Binary}}_{{.Version}}_{{.Os}}_{{.Arch}}"
2017-01-21 22:38:53 +02:00
# Archive format. Valid options are `tar.gz` and `zip` .
# Default is `tar.gz`
format: zip
# Replacements for GOOS and GOARCH on the archive name.
# The keys should be valid GOOS or GOARCH values followed by your custom
# replacements.
# By default, `replacements` replace GOOS and GOARCH values with valid outputs
# of `uname -s` and `uname -m` respectively.
replacements:
amd64: 64-bit
386: 32-bit
darwin: macOS
linux: Tux
# Additional files you want to add to the archive.
# Defaults are any files matching `LICENCE*` , `LICENSE*` ,
# `README*` and `CHANGELOG*` (case-insensitive)
files:
- LICENSE.txt
- README.md
- CHANGELOG.md
2017-01-21 22:49:34 +02:00
```
2017-01-21 22:38:53 +02:00
2017-01-21 22:49:34 +02:00
### Release customization
2017-01-21 22:38:53 +02:00
2017-01-21 22:49:34 +02:00
```yml
# goreleaser.yml
2017-01-21 22:38:53 +02:00
release:
# Repo in which the release will be created.
# Default is extracted from the origin remote URL.
2017-03-23 02:01:29 +02:00
github:
owner: user
name: repo
2017-04-22 00:50:09 +02:00
# If set to true, will not auto-publish the release.
# Default is false
draft: true
2017-01-21 22:49:34 +02:00
```
2017-01-21 22:38:53 +02:00
2017-04-21 19:37:14 +02:00
You can also specify a release notes file in markdown format using the
`--release-notes` flag.
2017-01-21 22:49:34 +02:00
### Homebrew tap customization
2017-01-21 22:38:53 +02:00
2017-01-21 22:49:34 +02:00
The brew section specifies how the formula should be created.
2017-01-21 23:44:39 +02:00
Check [the Homebrew documentation ](https://github.com/Homebrew/brew/blob/master/docs/How-to-Create-and-Maintain-a-Tap.md ) and the [formula cookbook ](https://github.com/Homebrew/brew/blob/master/docs/Formula-Cookbook.md ) for details.
2017-01-21 22:49:34 +02:00
```yml
# goreleaser.yml
2017-01-21 22:38:53 +02:00
brew:
# Reporitory to push the tap to.
2017-03-23 02:01:29 +02:00
github:
owner: user
name: homebrew-tap
2017-01-21 22:38:53 +02:00
# Folder inside the repository to put the formula.
# Default is the root folder.
folder: Formula
# Caveats for the user of your binary.
# Default is empty.
caveats: "How to use this binary"
2017-04-21 22:02:28 +02:00
# Your app's homepage
# Default is empty
homepage: "https://example.com/"
# Your app's description
# Default is empty
description: "Software to create fast and easy drum rolls."
2017-02-01 19:42:50 +02:00
# Dependencies of your package
2017-01-21 22:38:53 +02:00
dependencies:
2017-01-21 23:44:39 +02:00
- git
- zsh
2017-02-01 19:42:50 +02:00
# Packages that conflict with your package
conflicts:
- svn
- bash
2017-02-21 17:04:57 +02:00
# Packages that run as a service
2017-03-09 19:24:49 +02:00
plist:|
2017-02-21 17:04:57 +02:00
<?xml version="1.0" encoding="UTF-8"?>
...
2017-03-09 19:24:49 +02:00
# Custom install script for brew. Default: "bin.install "program"
install:|
bin.install "program"
...
2016-12-29 17:49:01 +02:00
```
2017-01-21 23:44:39 +02:00
By defining the `brew` section, GoReleaser will take care of publishing the Homebrew tap.
Assuming that the current tag is `v1.2.3` , the above config will generate a `program.rb` formula in the `Formula` folder of `user/homebrew-tap` repository:
2016-12-29 17:49:01 +02:00
```rb
2017-01-21 22:38:53 +02:00
class Program < Formula
desc "How to use this binary"
2017-01-21 22:49:34 +02:00
homepage "https://github.com/user/repo"
2017-01-21 23:44:39 +02:00
url "https://github.com/user/repo/releases/download/v1.2.3/program_v1.2.3_macOs_64bit.zip"
2017-01-21 22:38:53 +02:00
version "v1.2.3"
2017-01-11 18:52:30 +02:00
sha256 "9ee30fc358fae8d248a2d7538957089885da321dca3f09e3296fe2058e7fff74"
2016-12-29 17:49:01 +02:00
2017-01-21 23:44:39 +02:00
depends_on "git"
depends_on "zsh"
2016-12-29 17:49:01 +02:00
def install
2017-01-21 22:38:53 +02:00
bin.install "program"
2016-12-29 17:49:01 +02:00
end
end
```
2016-12-30 01:49:58 +02:00
2017-01-30 11:59:49 +02:00
### FPM build customization
GoReleaser can be wired to [fpm]() to generate `.deb` , `.rpm` and other archives. Check it's
[wiki ](https://github.com/jordansissel/fpm/wiki ) for more info.
[fpm]: https://github.com/jordansissel/fpm
```yml
# goreleaser.yml
fpm:
2017-04-21 22:02:28 +02:00
# Your app's vendor
# Default is empty
vendor: Drum Roll Inc.
# Your app's homepage
# Default is empty
homepage: https://example.com/
# Your app's maintainer (probably you)
# Default is empty
maintainer: < Drummer drum-roll @ example . com >
# Your app's description
# Default is empty
description: Software to create fast and easy drum rolls.
# Your app's license
# Default is empty
license: Apache 2.0
2017-01-30 11:59:49 +02:00
# Formats to generate as output
formats:
- deb
- rpm
# Dependencies of your package
dependencies:
- git
2017-02-01 19:42:50 +02:00
- zsh
# Packages that conflict with your package
conflicts:
- svn
- bash
2017-01-30 11:59:49 +02:00
```
Note that GoReleaser will not install `fpm` nor any of it's dependencies for you.
2017-01-21 22:38:53 +02:00
## Integration with CI
2017-01-02 19:08:49 +02:00
2017-01-21 22:38:53 +02:00
You may want to wire this to auto-deploy your new tags on [Travis ](https://travis-ci.org ), for example:
2016-12-30 01:49:58 +02:00
2017-01-21 22:38:53 +02:00
```yaml
# .travis.yml
after_success:
2017-02-26 19:36:59 +02:00
test -n "$TRAVIS_TAG" & & curl -sL https://git.io/goreleaser | bash
2017-01-21 22:38:53 +02:00
```
2016-12-30 01:49:58 +02:00
2017-01-21 22:38:53 +02:00
Here is how to do it with [CircleCI ](https://circleci.com ):
2017-01-21 22:49:34 +02:00
2017-01-21 22:38:53 +02:00
```yml
# circle.yml
deployment:
2017-01-21 22:49:34 +02:00
tag:
tag: /v[0-9]+(\.[0-9]+)*(-.*)*/
2017-01-21 23:44:39 +02:00
owner: user
2017-01-21 22:38:53 +02:00
commands:
2017-02-26 19:36:59 +02:00
- curl -sL https://git.io/goreleaser | bash
2016-12-30 01:49:58 +02:00
```
2017-01-21 22:38:53 +02:00
2017-01-24 20:58:19 +02:00
*Note that if you test multiple versions or multiple OSes you probably want to make sure GoReleaser is just run once*
2017-01-24 20:43:43 +02:00
2017-01-21 22:38:53 +02:00
---
Would you like to fix something in the documentation? Feel free to open an [issue ](https://github.com/goreleaser/goreleaser/issues ).