Skip to content
GoReleaser v2.20 is out! with an SSH key disclosure fix, ko platform templates, GitLab asset types, and more!

Winget

After releasing to GitHub, GitLab, or Gitea, GoReleaser can generate and publish a winget manifest and commit to a git repository, and open a pull request to winget-pkgs if instructed to.

The winget section specifies how the manifests should be created:

.goreleaser.yaml
winget:
  - # Name of the recipe.
    # It is also used as the artifact ID, so it must be unique.
    #
    # Default: the project name.
    # Templates: allowed.
    name: myproject

    # Publisher name.
    #
    # Templates: allowed.
    # Required
    publisher: Foo Inc

    # Your app's description.
    #
    # Templates: allowed.
    # Required
    # Default: inferred from global metadata.
    short_description: "Software to create fast and easy drum rolls."

    # License name.
    #
    # Templates: allowed.
    # Required
    # Default: inferred from global metadata.
    license: "mit"

    # Publisher URL.
    #
    # Templates: allowed.
    publisher_url: https://goreleaser.com

    # Publisher support URL.
    #
    # Templates: allowed.
    publisher_support_url: "https://github.com/user/repo/issues/new"

    # Privacy URL.
    #
    # 
Since v2.9
# Templates: allowed. privacy_url: "https://carlosbecker.com/privacy" # Package identifier. # # Default: publisher with spaces removed, followed by a dot and the # configured package name (e.g. 'FooInc.myproject'). # Templates: allowed. package_identifier: myproject.myproject # Default locale used for the generated manifests. # # This sets the `DefaultLocale`, `PackageLocale` and `InstallerLocale` # fields, as well as the locale manifest filename # (e.g. `<package>.locale.en-GB.yaml`). # #
Since v2.17
# Default: 'en-US'. # Templates: allowed. default_locale: en-GB # Additional locale manifests for the package. # # WinGet supports multiple locale manifests. Each one overrides specific # fields for a given locale. Any field that is not set falls back to the # default locale manifest value. # # The `locale` field is required and must not match the `default_locale`. # Duplicate locales are rejected. # # Each additional locale manifest can override the following fields: # publisher, publisher_url, publisher_support_url, privacy_url, author, # package_name, homepage, license, license_url, copyright, copyright_url, # short_description, description, tags, release_notes, release_notes_url, # installation_notes. # #
Since v2.18
additional_locales: - locale: pt-BR short_description: "Portuguese (Brazil) description here." tags: - cli - locale: fr-FR short_description: "French description here." # Package name. # # Default: name. #
Since v2.14
# Templates: allowed. package_name: "Foo Bar" # IDs of the archives to use. # Empty means all IDs. ids: - foo - bar # Which format to use. # # Valid options are: # - '': archives or binaries # - 'msi': msi installers (requires the MSI pipe configured)
GoReleaser Pro
# - 'nsis': nsis installers (requires the NSIS pipe configured)
GoReleaser Pro
# - 'archive': archives (only if format is zip), # - 'binary': binaries (requires an archive configuration with format set to 'binary' as well) # # This feature is only available in GoReleaser Pro. # Default: ''. use: msi # GOAMD64 to specify which amd64 version to use if there are multiple # versions from the build section. # # Default: 'v1'. goamd64: v1 # Product code to be used. # # Usually needed when `use: msi`. # # This feature is only available in GoReleaser Pro. product_code: AAAA-BBB-CCC-DDD-EEEFFF # URL which is determined by the given Token (github, gitlab or gitea). # # Default depends on the client. # Templates: allowed. url_template: "https://github.mycompany.com/foo/bar/releases/download/{{ .Tag }}/{{ .ArtifactName }}" # The project name and current git tag are used in the format string. # # Templates: allowed. commit_msg_template: "{{ .PackageIdentifier }}: {{ .Tag }}" # Path for the file inside the repository. # # Default: 'manifests/<lowercased first char of publisher>/<publisher>/<name>/<version>'. path: manifests/g/goreleaser/myproject/1.19 # Your app's homepage. # # Default: inferred from global metadata. homepage: "https://example.com/" # Your app's long description. # # Templates: allowed. # Default: inferred from global metadata. description: "Software to create fast and easy drum rolls." # License URL. # # Templates: allowed. license_url: "https://goreleaser.com/license" # Copyright. # # Templates: allowed. copyright: "Becker Software LTDA" # Copyright URL. # # Templates: allowed. copyright_url: "https://goreleaser.com/copyright" # Author. # # Templates: allowed. author: "Carlos Becker" # Setting this will prevent goreleaser to actually try to commit the updated # package - instead, it will be stored on the dist directory only, # leaving the responsibility of publishing it to the user. # # If set to auto, the release will not be uploaded to the repository # in case there is an indicator for prerelease in the tag e.g. v1.0.0-rc1 # # Templates: allowed. skip_upload: true # Release notes. # # If you want to use the release notes generated by GoReleaser, use # `{{.Changelog}}` as the value. # # Templates: allowed. release_notes: "{{.Changelog}}" # Release notes URL. # # Templates: allowed. release_notes_url: "https://foo.bar/changelog/{{.Version}}" # Installation notes. # #
Since v2.9
# Templates: allowed. installation_notes: "Information on how to install. Can also be a URL" # Tags. # # GoReleaser converts all tags to lowercase and replace # spaces with hyphens (-) as per winget's best practices. tags: - golang - cli # Package dependencies. # # Templates: allowed. dependencies: - package_identifier: Foo.Bar minimum_version: 1.2.3 # Repository to push the generated files to. repository: # Repository owner. # # Templates: allowed. owner: caarlos0 # Repository name. # # Templates: allowed. name: my-repo # Optionally a branch can be provided. # # Default: default repository branch, or '{{ .ProjectName }}-{{ .Version }}' # when 'pull_request.enabled' is true.
Since v2.17
# Templates: allowed. branch: main # Optionally a token can be provided, if it differs from the token # provided to GoReleaser # # Templates: allowed. token: "{{ .Env.GITHUB_PERSONAL_AUTH_TOKEN }}" # Optionally specify if this is a token from another SCM, allowing to # cross-publish. # # Only taken into account if `token` is set. # # Valid options: # - 'github' # - 'gitlab' # - 'gitea' # # This feature is only available in GoReleaser Pro. token_type: "github" # Sets up pull request creation instead of just pushing to the given branch. # Make sure the 'branch' property is different from base before enabling # it. # # This might require a personal access token. pull_request: # Whether to enable it or not. enabled: true # Whether to open the PR as a draft or not. draft: true # An optional token that can be provided for opening the pull request. # # Templates: allowed. #
Since v2.18
token: "{{ .Env.GITHUB_PERSONAL_AUTH_TOKEN }}" # If the pull request template has checkboxes, enabling this will # check all of them. # # This feature is only available in GoReleaser Pro, and when the pull # request is being opened on GitHub. check_boxes: true # Allows to set a body for the pull request. # If the repository has a pull request template, it will be appended to # this. # #
Since v2.12
body: | cc/ @foobar # Base can also be another repository, in which case the owner and name # above will be used as HEAD, allowing cross-repository pull requests. base: owner: goreleaser name: my-repo branch: main # Clone, create the file, commit and push, to a regular Git repository. # # Notice that this will only have any effect if the given URL is not # empty. git: # The Git URL to push. # # Templates: allowed. url: 'ssh://[email protected]:repo.git' # The SSH private key that should be used to commit to the Git # repository. # This can either be a path or the key contents. # # IMPORTANT: the key must not be password-protected. # # WARNING: do not expose your private key in the configuration file! # # Templates: allowed. private_key: '{{ .Env.PRIVATE_KEY_PATH }}' # The value to be passed to `GIT_SSH_COMMAND`. # This is mainly used to specify the SSH private key used to pull/push # to the Git URL. # # Default: 'ssh -i {{ .KeyPath }} -o StrictHostKeyChecking=accept-new -F /dev/null'. # Templates: allowed. ssh_command: 'ssh -i {{ .Env.KEY }} -o SomeOption=yes' # Git author used to commit to the repository. # #
Since v2.11
# Default: inferred from global metadata.
Since v2.12
commit_author: # Git author name. # # Templates: allowed. name: goreleaserbot # Git author email. # # Templates: allowed. email: [email protected] # Git commit signing configuration. # Only useful if repository is of type 'git'. # #
Since v2.11
signing: # Enable commit signing. enabled: true # The signing key to use. # Can be a key ID, fingerprint, email address, or path to a key file. # # Templates: allowed. key: "{{ .Env.GPG_SIGNING_KEY }}" # The GPG program to use for signing. # # Templates: allowed. program: gpg2 # The signature format to use. # # Valid options: openpgp, x509, ssh. # Default: openpgp. format: openpgp
Learn more about the template language.

Pull Requests

GoReleaser allows you to, instead of pushing directly to the main branch, push to a feature branch, and open a pull request with the changes.

When pull_request.enabled is true and you don’t set a branch, GoReleaser defaults it to {{ .ProjectName }}-{{ .Version }}, so each release opens its own branch and pull request instead of stacking onto the repository’s default branch.

Templates

GoReleaser will check for a .github/PULL_REQUEST_TEMPLATE.md, and set it in the pull request body if it exists.

We do that to prevent extra work for maintainers of things like winget-pkgs, nixpkgs, and so on.

Cross-repository pull requests

You can also push to a fork, and open the pull request in the original branch.

Here’s an example on how to set it up:

.goreleaser.yaml
something: # can be nix, brews, etc...
  - repository:
      owner: john
      name: repo
      branch: "{{.ProjectName}}-{{.Version}}"
      pull_request:
        enabled: true
        base:
          owner: mike
          name: repo
          branch: main

This will:

  • Try to sync the john/repo fork with mike/repo:main (if on GitHub).
  • Create the files into john/repo, in the branch foo-1.2.3 (assuming ProjectName=foo and Version=1.2.3). 1
  • Open a pull request from john/repo into mike/repo, with the branch main as target. 2

Things that don’t work

  • Opening pull requests to a forked repository (go-github does not have the required fields to do it).
  • Since this can fail for a myriad of reasons, if an error happens, it’ll log it to the release output, but will not fail the pipeline.

  1. In GitHub’s terms, this means head=john:repo:foo-1.2.3 ↩︎

  2. In GitHub’s terms, this means base=mike:repo:main ↩︎

Last updated on