Skip to content
🎉 GoReleaser v2.15 is out! with Flatpak, SRPM, and more!
Contributing

Contributing

By participating in this project, you agree to abide our code of conduct.

Set up your machine

goreleaser is written in Go.

Prerequisites:

Other things you might need to run some of the tests (they should get automatically skipped if a needed tool isn’t present):

Building

Clone goreleaser anywhere:

git clone [email protected]:goreleaser/goreleaser.git

cd into the directory and install the dependencies:

go mod tidy

You should then be able to build the binary:

go build -o goreleaser .
./goreleaser --version

Testing your changes

You can create a branch for your changes and try to build from the source as you go:

task build

When you are satisfied with the changes, we suggest you run:

task ci

Before you commit the changes, we also suggest you run:

task fmt

A note about Docker multi-arch builds

If you want to properly run the Docker tests, or run goreleaser release --snapshot locally, you might need to setup Docker for it. You can do so by running:

task docker:setup

A note about Windows

Make sure to enable “Developer Mode” in Settings.

Writing pipes

Pipes should follow these conventions for consistent error output:

  • Do not prefix error messages with the pipe name. Error wrapping with the pipe name is done at the meta-pipe level (publish, announce, defaults), so individual pipes should only describe the problem itself (e.g., "no archives found" instead of "archive: no archives found").
  • Use the pipe’s String() method for context. Meta-pipes wrap errors using fmt.Errorf("%s: %w", pipe.String(), err), which provides consistent, non-redundant context.

Creating a commit

Commit messages should be well formatted, and to make that “standardized”, we are using Conventional Commits.

You can follow the documentation on their website.

Submitting a pull request

Push your branch to your goreleaser fork and open a pull request against the main branch.

Financial contributions

You can contribute in our OpenCollective or to any of the contributors directly. See this page for more details.

Last updated on