Go toolchain is pinned
golang/toolchain-pinned@v1
The module names the toolchain that compiles it, rather than leaving the go directive as a floor.
| Id | golang/toolchain-pinned |
| Version | v1 |
| Category | golang |
| Default severity | warning |
| Interpreter | python3 |
| Timeout | 30 seconds |
| Violations tolerated | 0 |
| Collects | golang |
Collectors
This guardrail gathers nothing itself. It depends on the collectors below, which the CLI runs once per build before any check, and reads what they found out of GUARDRAIL_FACTS. A collector that collects nothing skips this guardrail rather than failing it.
| Collector | Gathers | Inputs it is given |
|---|---|---|
golang | The Go build in the project directory: the module it declares, the Go version it asks for, every module of a workspace, the modules it requires directly and indirectly, and the replacements and lock file beside them. | projectDir |
The inputs above are this guardrail's own, passed straight through. Configuring one in buildnote.json changes what is collected, and two guardrails configured the same way share the one collection.
Configuration
{
"guardrails": {
"failOn": "error",
"comment": true,
"checks": [
{
"use": "golang/toolchain-pinned@v1",
"severity": "warning",
"with": {
"projectDir": "."
},
"exemptions": []
}
]
}
}Inputs
| Input | Description | Default | Environment variable |
|---|---|---|---|
projectDir | Directory holding the project, relative to the directory the CLI runs in. | . | GUARDRAIL_INPUT_PROJECTDIR |
How to fix
Name the toolchain beside the go directive:
go 1.22
toolchain go1.22.3go mod edit -toolchain=go1.22.3 writes it. The go directive is the lowest version the module builds with rather than the one it is built by, so without a toolchain the compiler is whichever Go the runner happens to carry and a change of compiler arrives unannounced.
More in golang
golang/checksums-committed. The module commitsgo.sum, so every module a build downloads is checked against the checksum the commit recorded.golang/no-local-replacements. Noreplacedirective redirects a module to a filesystem path, so the build reads only source the checkout carries.golang/version-declared. The module declares the Go version it is built against, and that version is no older than the configured floor.