Need help with semantic-release?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

113 Stars 29 Forks MIT License 254 Commits 12 Opened issues


📦🚀 semantic-release written in go

Services available


Need anything else?

Contributors list

:package::rocket: semantic-release

CI pipeline status Go Report Card PkgGoDev

fully automated package/module/image publishing

A more lightweight and standalone version of semantic-release.

🚨 Upgrade to semantic-release v2 🚨

v2 is now available. If you run into any problems, please create a GitHub issue. You can always downgrade to v1 with:
curl -SL -o ./semantic-release && chmod +x ./semantic-release

Breaking changes

  • It is now necessary to use double dashes for CLI flags (e.g.
  • Travis CI support has been removed
  • Some CLI flags have changed:

| v1 | v2 | |:--------------------------:|:------------------------------------------------:| |

| |
| |
--provider-opt "github_enterprise_host="
| |
| removed | |
--provider gitlab
| |
--provider-opt "gitlab_baseurl="
| |
--provider-opt "gitlab_projectid="
| |
--provider-opt "slug="

How does it work?

Instead of writing meaningless commit messages, we can take our time to think about the changes in the codebase and write them down. Following the AngularJS Commit Message Conventions it is then possible to generate a helpful changelog and to derive the next semantic version number from them.


is setup it will do that after every successful continuous integration build of your default branch and publish the new version for you. This way no human is directly involved in the release process and your releases are guaranteed to be unromantic and unsentimental.

Source: semantic-release/semantic-release#how-does-it-work

You can enforce semantic commit messages using a git hook.


Option 1: Use the go-semantic-release GitHub Action (go-semantic-release/action)

Option 2: Install

curl -SL -o ./semantic-release && chmod +x ./semantic-release

Plugin System

Since v2, semantic-release is equipped with a plugin system. The plugins are standalone binaries that use hashicorp/go-plugin as a plugin library.

automatically downloads the necessary plugins if they don't exist locally. The plugins are stored in the
directory of the current working directory in the following format:
. The go-semantic-release plugins API (
) is used to resolve plugins to the correct binary. The served content of the API can be found here, and a list of all existing plugins can be found here.

Plugin Types


Plugins can be configured using CLI flags or the

config file. By using a
sign after the plugin name, the required version of the plugin can be specified. Otherwise, any locally installed version will be used. If the plugin does not exist locally, the latest version will be downloaded. This is an example of the
config file:
  "plugins": {
    "commit-analyzer": {
      "name": "[email protected]^1.0.0"
    "ci-condition": {
      "name": "default"
    "changelog-generator": {
      "name": "default",
      "options": {
        "emojis": "true"
    "provider": {
      "name": "gitlab",
      "options": {
        "gitlab_projectid": "123456"
    "files-updater": {
      "name": "npm"

Example GitHub Actions

For examples, look at the go-semantic-release GitHub Action.

Example GitLab CI Config

GitLab token

It is necessary to create a new Gitlab personal access token with the

scope here. Ensure the CI variable is protected and masked as the
has a lot of rights. There is an open issue for project specific tokens You can set the GitLab token via the
environment variable or the

.gitlab-ci.yml ```yml stages: # other stages - release

release: image: # Replace this with the current release stage: release # Remove this if you want a release created for each push to master when: manual only: - master script: - release ```

Beta release support

Beta release support empowers you to release beta, rc, etc. versions with

(e.g. v2.0.0-beta.1). To enable this feature you need to create a new branch (e.g. beta/v2) and check in a
file with the following content:
  "maintainedVersion": "2-beta"
If you commit to this branch a new incremental pre-release is created everytime you push. (2.0.0-beta.1, 2.0.0-beta.2, ...)


The MIT License (MIT)

Copyright © 2020 Christoph Witzko

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.