goreleaser

command module
v0.30.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 28, 2017 License: MIT Imports: 6 Imported by: 0

README

GoReleaser Logo

GoReleaser

Deliver Go binaries as fast and easily as possible.

Release Software License Travis Codecov branch Go Report Card Go Doc SayThanks.io


GoReleaser builds Go binaries for several platforms, creates a GitHub release and then pushes a Homebrew formula to a tap 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. We appreciate your contribution. Please refer to our contributing guidelines for further information.

For questions join the #goreleaser channel in the Gophers Slack.

Table of contents

Introduction

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.

GoReleaser is built for CI tools; you only need to download and execute it in your build script. You can customize your release process by createing a .goreleaser.yml file. We are also working on integrating with package managers, we currently support Home .

The idea started with a simple shell script, but it quickly became more complex and I also wanted to publish binaries via Homebrew taps.

Quick start

In this example we will build, archive and release a Golang project. Create a GitHub repository and add a single main package:

// main.go
package main

func main() {
  println("Ba dum, tss!")
}

By default GoReleaser will build the current directory, but you can change the build package path in the GoReleaser configuration file.

# .goreleaser.yml
# Build customization
builds:
  - binary: drum-roll
    goos:
      - windows
      - darwin
      - linux
    goarch:
      - amd64

PS: Invalid GOOS/GOARCH combinations will automatically be skipped.

This configuration specifies the build operating systems to Windows, Linux and MacOS using 64bit architecture, the name of the binaries is drum-roll.

GoReleaser will then archive the result binaries of each Os/Arch into a separate file. The default format is {{.ProjectName}}_{{.Os}}_{{.Arch}}. 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.

# .goreleaser.yml
# Build customization
builds:
  - main: main.go
    binary: drum-roll
    goos:
      - windows
      - darwin
      - linux
    goarch:
      - amd64
# Archive customization
archive:
  format: tar.gz
  replacements:
    amd64: 64-bit
    darwin: macOS
    linux: Tux
  files:
    - drum-roll.licence.txt

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

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.

$ export GITHUB_TOKEN=`YOUR_TOKEN`

GoReleaser uses the latest Git tag of your repository. Create a tag and push it to GitHub:

$ git tag -a v0.1.0 -m "First release" && git push origin v0.1.0

Note: we recommend the use of semantic versioning. 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.

If you don't want to create a tag yet but instead simply create a package based on the latest commit, then you can also use the --snapshot flag.

Now you can run GoReleaser at the root of your repository:

$ goreleaser

That's it! Check your GitHub project's release page. The release should look like this:

image

Environment setup

GitHub Token

GoReleaser requires a GitHub API token with the repo scope checked to deploy the artefacts to GitHub. You can create one here. 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.

A note about main.version

GoReleaser always sets a main.version ldflag. You can use it in your main.go file:

package main

var version = "master"

func main() {
  println(version)
}

version will be the current Git tag (with v prefix stripped) or the name of the snapshot if you're using the --snapshot flag.

GoReleaser customization

GoReleaser provides multiple customizations via the .goreleaser.yml file. You can generate it by running goreleaser init or start from scratch. The defaults are sensible and fit for most projects.

We'll cover all customizations available bellow:

Project name
# .goreleaser.yml
# The name of the project. It is used in the name of the brew formula, archives,
# etc. Defaults to the name of the git project.
project_name: myproject
Build customization
# .goreleaser.yml
builds:
  # You can have multiple builds, its a common yaml list
  -
    # Path to main.go file or main package.
    # Default is `.`
    main: ./cmd/main.go

    # Name of the binary.
    # Default is the name of the project directory.
    binary: program

    # Custom build tags.
    # Default is empty
    flags: -tags dev

    # Custom ldflags template.
    # This is parsed with Golang template engine and the following variables
    # are available:
    # - Date
    # - Commit
    # - Tag
    # - Version (Tag with the `v` prefix stripped)
    # 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: -s -w -X main.build={{.Version}}

    # Custom environment variables to be set durign the builds.
    # Default is empty
    env:
    - CGO_ENABLED=0

    # 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
      - arm
      - arm64

    # GOARM to build in when GOARCH is arm.
    # For more info refer to https://golang.org/doc/install/source#environment
    # Defaults are 6
    goarm:
      - 6
      - 7

    # List of combinations of GOOS + GOARCH + GOARM to ignore.
    # Default is empty.
    ignore:
      - goos: darwin
        goarch: 386
      - goos: linux
        goarch: arm
        goarm: 7

    # Hooks can be used to customize the final binary, for example, to run
    # generator or whatever you want.
    # Default is both hooks empty.
    hooks:
      pre: rice embed-go
      post: ./script.sh
Archive customization
# .goreleaser.yml
archive:
  # You can change the name of the archive.
  # This is parsed with Golang template engine and the following variables
  # are available:
  # - ProjectName
  # - Tag
  # - Version (Tag with the `v` prefix stripped)
  # - Os
  # - Arch
  # - Arm (ARM version)
  # The default is `{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}`
  name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"

  # Archive format. Valid options are `tar.gz`, `zip` and `binary`.
  # If format is `binary` no archives are created and the binaries are instead uploaded directly.
  # In that case name_template the below specified files are ignored.
  # Default is `tar.gz`
  format: zip

  # Can be used to archive on different formats for specific GOOSs.
  # Most common use case is to archive as zip on Windows.
  # Default is empty
  format_overrides:
    - goos: windows
      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.
  replacements:
    amd64: 64-bit
    386: 32-bit
    darwin: macOS
    linux: Tux

  # Additional files/globs 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
    - docs/*
    - design/*.png
Release customization
# .goreleaser.yml
release:
  # Repo in which the release will be created.
  # Default is extracted from the origin remote URL.
  github:
    owner: user
    name: repo

  # If set to true, will not auto-publish the release.
  # Default is false
  draft: true

You can also specify a release notes file in markdown format using the --release-notes flag.

Snapshot customization
# .goreleaser.yml
snapshot:
  # Allows you to change the name of the generated snapshot
  # releases. The following variables are available:
  # - Commit
  # - Tag
  # - Timestamp
  # Default: SNAPSHOT-{{.Commit}}
  name_template: SNAPSHOT-{{.Commit}}
Homebrew tap customization

The brew section specifies how the formula should be created. Check the Homebrew documentation and the formula cookbook for details.

# .goreleaser.yml
brew:
  # Reporitory to push the tap to.
  github:
    owner: user
    name: homebrew-tap

  # 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"

  # 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."

  # Dependencies of your package
  dependencies:
    - git
    - zsh

  # Packages that conflict with your package
  conflicts:
    - svn
    - bash

  # Packages that run as a service. Default is empty.
  plist: |
    <?xml version="1.0" encoding="UTF-8"?>
    ...

  # So you can brew test your formula. Default is empty.
  test: |
    system "#{bin}/program --version"
    ...

  # Custom install script for brew. Default is 'bin.install "program"'
  install: |
    bin.install "program"
    ...

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:

class Program < Formula
  desc "How to use this binary"
  homepage "https://github.com/user/repo"
  url "https://github.com/user/repo/releases/download/v1.2.3/program_v1.2.3_macOs_64bit.zip"
  version "v1.2.3"
  sha256 "9ee30fc358fae8d248a2d7538957089885da321dca3f09e3296fe2058e7fff74"

  depends_on "git"
  depends_on "zsh"

  def install
    bin.install "program"
  end
end

Note that GoReleaser does not yet generate a valid homebrew-core formula. The generated formulas are meant to be published as homebrew taps, not in any of the official homebrew repositories.

FPM build customization

GoReleaser can be wired to fpm to generate .deb, .rpm and other archives. Check its wiki for more info.

# .goreleaser.yml
fpm:
  # 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

  # Formats to generate as output
  formats:
    - deb
    - rpm

  # Dependencies of your package
  dependencies:
    - git
    - zsh

  # Packages that conflict with your package
  conflicts:
    - svn
    - bash

  # Files or directories to add to your package (beyond the binary)
  files:
    "scripts/etc/init.d/": "/etc/init.d"

Note that GoReleaser will not install fpm nor any of its dependencies for you.

Snapcraft build customization

GoReleaser can generate snap packages. Snaps are a new packaging format that will let you publish your project directly to the Ubuntu store. From there it will be installable in all the supported Linux distros, with automatic and transactional updates.

You can read more about it in the snapcraft docs.

# .goreleaser.yml
snapcraft:

  # The name of the snap. This is optional and defaults to the project name.
  name: drumroll

  # Single-line elevator pitch for your amazing snap.
  # 79 char long at most.
  summary: Software to create fast and easy drum rolls.

  # This the description of your snap. You have a paragraph or two to tell the
  # most important story about your snap. Keep it under 100 words though,
  # we live in tweetspace and your description wants to look good in the snap
  # store.
  description: |
    This is the best drum roll application out there.
    Install it and awe!

  # A guardrail to prevent you from releasing a snap to all your users before
  # it is ready.
  # `devel` will let you release only to the `edge` and `beta` channels in the
  # store. `stable` will let you release also to the `candidate` and `stable`
  # channels. More info about channels here:
  # https://snapcraft.io/docs/reference/channels.
  grade: stable

  # Snaps can be setup to follow three different confinement policies:
  # `strict`, `devmode` and `classic`. A strict confinement where the snap
  # can only read and write in its own namespace is recommended. Extra
  # permissions for strict snaps can be declared as `plugs` for the app, which
  # are explained later. More info about confinement here:
  # https://snapcraft.io/docs/reference/confinement).
  confinement: strict

  # Each binary built by GoReleaser is an app inside the snap. In this section
  # you can declare extra details for those binaries. It is optional.
  apps:

    # The name of the app must be the same name of the binary built.
    drumroll:

      # If your app requires extra permissions to work outside of its default
      # confined space, delcare them here.
      # You can read the documentation about the available plugs and the
      # things they allow:
      # https://snapcraft.io/docs/reference/interfaces).
      plugs: ["home", "network"]

      # If you want your app to be autostarted and to always run in the
      # background, you can make it a simple daemon.
      daemon: simple

Note that GoReleaser will not install snapcraft nor any of its dependencies for you.

Custom release notes

You can have a markdown file previously created with the release notes, and pass it down to goreleaser with the --release-notes=FILE flag.

Integration with CI

You may want to wire this to auto-deploy your new tags on Travis, for example:

# .travis.yml
after_success:
  - test -n "$TRAVIS_TAG" && curl -sL https://git.io/goreleaser | bash

Here is how to do it with CircleCI:

# circle.yml
deployment:
  tag:
    tag: /v[0-9]+(\.[0-9]+)*(-.*)*/
    owner: user
    commands:
      - curl -sL https://git.io/goreleaser | bash

Note that if you test multiple versions or multiple OSes you probably want to make sure GoReleaser is just run once

Stargazers over time

goreleaser/goreleaser stargazers over time


Would you like to fix something in the documentation? Feel free to open an issue.

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
Package checksum contain algorithms to checksum files
Package checksum contain algorithms to checksum files
Package config contains the model and loader of the goreleaser configuration file.
Package config contains the model and loader of the goreleaser configuration file.
Package context provides gorelease context which is passed through the pipeline.
Package context provides gorelease context which is passed through the pipeline.
internal
archiveformat
Package archiveformat provides functions to get the format of given package based on the config
Package archiveformat provides functions to get the format of given package based on the config
client
Package client contains the client implementations for several providers.
Package client contains the client implementations for several providers.
ext
git
Package git provides an integration with the git command
Package git provides an integration with the git command
linux
Package linux contains functions that are useful to generate linux packages.
Package linux contains functions that are useful to generate linux packages.
name
Package name provides name template logic for the final archive, formulae, etc.
Package name provides name template logic for the final archive, formulae, etc.
testlib
Package testlib contains test helpers for goreleaser tests.
Package testlib contains test helpers for goreleaser tests.
Package pipeline provides a generic pipe interface.
Package pipeline provides a generic pipe interface.
archive
Package archive implements the pipe interface with the intent of archiving and compressing the binaries, readme, and other artifacts.
Package archive implements the pipe interface with the intent of archiving and compressing the binaries, readme, and other artifacts.
brew
Package brew implements the Pipe, providing formula generation and uploading it to a configured repo.
Package brew implements the Pipe, providing formula generation and uploading it to a configured repo.
build
Package build implements Pipe and can build Go projects for several platforms, with pre and post hook support.
Package build implements Pipe and can build Go projects for several platforms, with pre and post hook support.
checksums
Package checksums provides a Pipe that creates .checksums files for each artifact.
Package checksums provides a Pipe that creates .checksums files for each artifact.
cleandist
Package cleandist provides checks to make sure the dist folder is always empty.
Package cleandist provides checks to make sure the dist folder is always empty.
defaults
Package defaults implements the Pipe interface providing default values for missing configuration.
Package defaults implements the Pipe interface providing default values for missing configuration.
env
Package env implements the Pipe interface providing validation of missing environment variables needed by the release process.
Package env implements the Pipe interface providing validation of missing environment variables needed by the release process.
fpm
Package fpm implements the Pipe interface providing FPM bindings.
Package fpm implements the Pipe interface providing FPM bindings.
git
Package git implements the Pipe interface getting and validating the current git repository state
Package git implements the Pipe interface getting and validating the current git repository state
release
Package release implements Pipe and manages github releases and its artifacts.
Package release implements Pipe and manages github releases and its artifacts.
snapcraft
Package snapcraft implements the Pipe interface providing Snapcraft bindings.
Package snapcraft implements the Pipe interface providing Snapcraft bindings.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL