Back to Goreleaser

Templates

www/content/customization/general/templates.md

2.15.421.4 KB
Original Source

Several fields in GoReleaser's config file support templating.

Those fields are often suffixed with _template, but sometimes they may not be. The documentation of each section should be explicit about which fields support templating.

Common Fields

In fields that support templates, these fields are usually available:

KeyDescription
.ProjectNamethe project name
.Versionthe version being released1
.Branchthe current git branch
.Tagthe current git tag
.PreviousTagthe previous git tag, or empty if no previous tags
.ShortCommitthe git commit short hash
.FullCommitthe git commit full hash
.Committhe git commit hash (deprecated)
.CommitDatethe UTC commit date in RFC 3339 format
.CommitTimestampthe UTC commit date in Unix format
.GitURLthe git remote url
.GitTreeStateeither 'clean' or 'dirty'
.IsGitCleanwhether or not current git state is clean
.IsGitDirtywhether or not current git state is dirty
.Majorthe major part of the version2
.Minorthe minor part of the version2
.Patchthe patch part of the version2
.Prereleasethe prerelease part of the version, e.g. beta.12
.RawVersioncomposed of {Major}.{Minor}.{Patch} 2
.ReleaseNotesthe generated release notes, available after the changelog step has been executed
.IsDrafttrue if release.draft is set in the configuration, false otherwise
.IsSnapshottrue if --snapshot is set, false otherwise
.IsNightlytrue if --nightly is set, false otherwise
.IsSingleTargettrue if --single-target is set, false otherwise {{< g_inline_version "v2.3" >}}
.Enva map with system's environment variables
.Datecurrent UTC date in RFC 3339 format
.Nowcurrent UTC date as time.Time struct, allows all time.Time functions (e.g. {{ .Now.Format "2006" }})
.Timestampcurrent UTC time in Unix format
.ModulePaththe go module path, as reported by go list -m
.ReleaseURLthe current release download url3
.Summarythe git summary, e.g. v1.0.0-10-g34f56g34
.TagSubjectthe annotated tag message subject, or the message subject of the commit it points out5
.TagContentsthe annotated tag message, or the message of the commit it points out6
.TagBodythe annotated tag message's body, or the message's body of the commit it points out6
.Runtime.Goosequivalent to runtime.GOOS
.Runtime.Goarchequivalent to runtime.GOARCH
.Outputscustom outputs {{< g_inline_version "v2.11" >}}

The exception is that any of the Git-related fields will no be available in the env section.

Common Fields (Pro)

{{< g_featpro >}}

KeyDescription
.PrefixedTagthe current git tag prefixed with the monorepo config tag prefix (if any)
.PrefixedPreviousTagthe previous git tag prefixed with the monorepo config tag prefix (if any)
.PrefixedSummarythe git summary prefixed with the monorepo config tag prefix (if any)
.IsReleasetrue if regular release (not a nightly nor a snapshot) {{< g_inline_version "v2.8" >}}
.IsMergingtrue if you are running with --merge {{< g_inline_version "v2.8" >}}
.Artifactsthe current artifacts list
.Metadataproject metadata fields {{< g_inline_version "v2.13" >}}

Metadata

{{< g_featpro >}}

{{< g_version "v2.13" >}}

If you use the .Metadata field, it evaluates to the project metadata configuration. You can access all fields defined in the metadata section of your config:

KeyDescription
.Metadata.Descriptionproject description
.Metadata.Homepageproject homepage URL
.Metadata.Licenseproject license
.Metadata.Maintainerslist of project maintainers
.Metadata.ModTimestampmodification timestamp template

Artifacts

{{< g_featpro >}}

If you use the .Artifacts field, it evaluates to an artifact.Artifact list. You should be able to use all its fields on each item:

  • .Name
  • .Path
  • .Goos
  • .Goarch
  • .Goarm
  • .Gomips
  • .Goamd64
  • .Goarm64 {{< g_inline_version "v2.4" >}}
  • .Gomips64 {{< g_inline_version "v2.4" >}}
  • .Goppc64 {{< g_inline_version "v2.4" >}}
  • .Goriscv64 {{< g_inline_version "v2.4" >}}
  • .Go386 {{< g_inline_version "v2.4" >}}
  • .Target {{< g_inline_version "v2.5" >}}
  • .Type
  • .Extra

Single-artifact extra fields

On fields that are related to a single artifact (e.g., the binary name), you may have some extra fields:

KeyDescription
.OsGOOS
.ArchGOARCH
.ArmGOARM
.MipsGOMIPS
.Amd64GOAMD64
.Arm64GOARM64 {{< g_inline_version "v2.4" >}}
.Mips64GOMIPS64 {{< g_inline_version "v2.4" >}}
.Ppc64GOPPC64 {{< g_inline_version "v2.4" >}}
.Riscv64GORISCV64 {{< g_inline_version "v2.4" >}}
.I386GO386 {{< g_inline_version "v2.4" >}}
.Targetthe whole target {{< g_inline_version "v2.5" >}}
.Binaryartifact name (without the extension)
.ArtifactIDartifact id {{< g_inline_version "v2.3" >}}{{< g_inline_pro >}}
.ArtifactNameartifact name
.ArtifactPathabsolute path to artifact
.ArtifactExtartifact extension (e.g. .exe, .dmg, etc)

nFPM extra fields

In the nFPM name template field, you can use those extra fields:

KeyDescription
.Releaserelease from the nfpm config
.Epochepoch from the nfpm config
.PackageNamepackage the name. Same as ProjectName if not overridden.
.ConventionalFileNameconventional package file name as provided by nFPM.7
.ConventionalExtensionconventional package extension as provided by nFPM
.Formatpackage format

Release body extra fields

In the release.body field, you can use these extra fields:

KeyDescription
.Checksumsthe current checksum file contents, or a map of filename/checksum contents if checksum.split is set. Only available in the release body

Functions

On all fields, you have these available functions:

UsageDescription
replace "v1.2" "v" ""replaces all matches. See ReplaceAll
split "1.2" "."split string at separator. See Split
time "01/02/2006"current UTC time in the specified format (this is not deterministic, a new time for every call)
contains "foobar" "foo"checks whether the first string contains the second. See Contains
tolower "V1.2"makes input string lowercase. See ToLower
toupper "v1.2"makes input string uppercase. See ToUpper
trim " v1.2 "removes all leading and trailing white space. See TrimSpace
trimprefix "v1.2" "v"removes provided leading prefix string, if present. See TrimPrefix
trimsuffix "1.2v" "v"removes provided trailing suffix string, if present. See TrimSuffix
dir .Pathreturns all but the last element of path, typically the path's directory. See Dir
base .Pathreturns the last element of path. See Base
abs .ArtifactPathreturns an absolute representation of path. See Abs
filter "text" "regex"keeps only the lines matching the given regex, analogous to grep -E
reverseFilter "text" "regex"keeps only the lines not matching the given regex, analogous to grep -vE
title "foo""titlenize" the string using english as language. See Title
mdv2escape "foo"escape characters according to MarkdownV2, especially useful in the Telegram integration
envOrDefault "NAME" "value"either gets the value of the given environment variable, or the given default
isEnvSet "NAME"returns true if the env is set and not empty, false otherwise
$m := map "KEY" "VALUE"creates a map from a list of key and value pairs. Both keys and values must be of type string
indexOrDefault $m "KEY" "value"either gets the value of the given key or the given default value from the given map
incpatch "v1.2.4"increments the patch of the given version8
incminor "v1.2.4"increments the minor of the given version8
incmajor "v1.2.4"increments the major of the given version8
urlPathEscape "foo/bar"escapes URL paths. See PathEscape {{< g_inline_version "v2.5" >}}
blake2b .ArtifactPathblake2b checksum of the artifact. See Blake2b {{< g_inline_version "v2.9" >}}
blake2s .ArtifactPathblake2s checksum of the artifact. See Blake2s {{< g_inline_version "v2.9" >}}
blake3 .ArtifactPathblake3 checksum of the artifact. See Blake3 {{< g_inline_version "v2.15" >}}
crc32 .ArtifactPathcrc32 checksum of the artifact. See CRC32 {{< g_inline_version "v2.9" >}}
md5 .ArtifactPathmd5 checksum of the artifact. See MD5 {{< g_inline_version "v2.9" >}}
sha224 .ArtifactPathsha224 checksum of the artifact. See SHA224 {{< g_inline_version "v2.9" >}}
sha384 .ArtifactPathsha384 checksum of the artifact. See SHA384 {{< g_inline_version "v2.9" >}}
sha256 .ArtifactPathsha256 checksum of the artifact. See SHA256 {{< g_inline_version "v2.9" >}}
sha1 .ArtifactPathsha1 checksum of the artifact. See SHA1 {{< g_inline_version "v2.9" >}}
sha512 .ArtifactPathsha512 checksum of the artifact. See SHA512 {{< g_inline_version "v2.9" >}}
sha3_224 .ArtifactPathsha3_224 checksum of the artifact. See SHA3-224 {{< g_inline_version "v2.9" >}}
sha3_384 .ArtifactPathsha3_384 checksum of the artifact. See SHA3-384 {{< g_inline_version "v2.9" >}}
sha3_256 .ArtifactPathsha3_256 checksum of the artifact. See SHA3-256 {{< g_inline_version "v2.9" >}}
sha3_512 .ArtifactPathsha3_512 checksum of the artifact. See SHA3-512 {{< g_inline_version "v2.9" >}}
mustReadFile "/foo/bar.txt"reads the file contents or fails if it can't be read {{< g_inline_version "v2.12" >}}
readFile "/foo/bar.txt"reads the file contents if it it can be read, or return empty string {{< g_inline_version "v2.12" >}}
englishJoinwill join multiple items in english {{< g_inline_version "v2.14" >}}
list "a" "b" "c"makes a list of strings

Functions (Pro)

{{< g_featpro >}}

UsageDescription
in (list "a" "b" "c") "b"checks if a slice contains a value
reReplaceAll "(.*)" "foo" "bar-$1"compiles the first argument with regexp.Compile, then uses ReplaceAllString with the following arguments {{< g_inline_version "v2.8" >}}

With all those fields, you may be able to compose the name of your artifacts pretty much the way you want:

yaml
example_template: '{{ tolower .ProjectName }}_{{ .Env.USER }}_{{ time "2006" }}'

For example, if you want to add the go version to some artifact:

yaml
foo_template: "foo_{{ .Env.GOVERSION }}"

And then you can run:

sh
GOVERSION=$(go version | awk '{print $3;}') goreleaser

[!WARNING] Note that those are hypothetical examples and the fields foo_template and example_template are not valid GoReleaser configurations.

Custom variables

{{< g_featpro >}}

You can also declare custom variables. This feature is specially useful with includes, so you can have more generic configuration files.

Usage is as simple as you would expect:

yaml
variables:
  description: my project description
  somethingElse: yada yada yada
  empty: ""

And then you can use those fields as {{ .Var.description }}, for example.

Footnotes

  1. The v prefix is stripped, and it might be changed in snapshot and nightly builds.

  2. Assuming Tag is a valid a SemVer, otherwise empty/zeroed. 2 3 4 5

  3. Composed of the current SCM's download URL and current tag. For instance, on GitHub, it'll be https://github.com/{owner}/{repo}/releases/tag/{tag}.

  4. It is generated by git describe --dirty --always --tags, the format will be {Tag}-$N-{CommitSHA} If using Pro with a monorepo.tag_prefix, it will be passed to describe as --match={prefix}*.

  5. As reported by git tag -l --format='%(contents:subject)'

  6. As reported by git tag -l --format='%(contents)' 2

  7. Please beware: some OSs might have the same names for different ARM versions, for example, for Debian both ARMv6 and ARMv7 are called armhf. Make sure that's not your case otherwise you might end up with colliding names. It also does not handle multiple GOAMD64 versions.

  8. Will panic if not a semantic version. 2 3