A general theme of this blog is making life easier (or programmer laziness), so continuing in this vane
this is a quick post on automated releases of go executables onto your github
One of the strengths of go (which just got even easier with 1.5) is the
ability to cross-compile self-contained executables - I find this particularly
handy to get command line tools onto remote servers (though as with fine arts,
wines, etc always be sure you trust the provenance of random executables you
I’ll be using travis to build the github project, and github to host the
release binaries. I assume you’ve a go project on github with some code ready
to be built.
(Replace with ‘user’ with your username and ‘project’ with your github project
name in all the steps below.)
Create a travis project and link it to this github repo.
Now setup your cross-build. I usually manage travis projects with a simple
Makefile in the project root:
package = github.com/user/project
mkdir -p release
GOOS=linux GOARCH=amd64 go build -o release/myproject-linux-amd64 $(package)
GOOS=linux GOARCH=386 go build -o release/myproject-linux-386 $(package)
GOOS=linux GOARCH=arm go build -o release/myproject-linux-arm $(package)
...and so on...
Note: You need the
.PHONY line, otherwise
make will assume the ‘release’ means
it’s already done after the first run.
You’ll also want to ignore the release directory - add it to gitignore:
$ echo release >> .gitignore
Now create a minimal
.travis.yml in the root of your project:
You’ll also need the travis command line tool - it’s a ruby tool, so go off and install that. It’s ok, I’ll wait.
This will prompt for your github username, password. For ‘File to Upload’,
enter one of the release files from above ‘release/myproject-linux-amd64’ –
we’ll add the rest in a sec. Answer ‘yes’ to “Deploy only from user/myproject”
and “Encrypt API key”:
$ travis setup releases
Detected repository as user/project, is this correct? |yes|
Password for user: **********
Two-factor authentication code for user: ...
File to Upload: release/myproject-linux-amd64
Deploy only from user/project? |yes|
Encrypt API key? |yes|
This adds the following to your .travis.yml:
Adjust this by adding the other release files, and also set the release to only run on tags:
Git add .travis.yml and .gitignore and commit the change.
$ git add .travis.yml .gitignore
$ git commit -m 'Making travis work'
Finally, tag this as a release, and push to github:
$ git tag -a 1.0.0 -m 'Release 1.0.0'
$ git push --tags origin master
Watch your travis page, and all going to plan this should build and push
the release binaries to your github release page
(https://github.com/user/project/releases), ready for download.