Skip to content

Improve toolchain handling #460

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

matthewhughes934
Copy link

@matthewhughes934 matthewhughes934 commented Mar 3, 2024

Force go to always use the local toolchain (i.e. the one the one that
shipped with the go command being run) via setting the GOTOOLCHAIN
environment variable to local[1]:

When GOTOOLCHAIN is set to local, the go command always runs the
bundled Go toolchain.

This is how things are setup in the official Docker images (e.g.[2], see
also the discussion around that change[3]). The motivation behind this
is to:

  • Reduce duplicate work: if the toolchain version in go.mod was
    greated than the go version, the version from the go directive
    would be installed, then Go would detect the toolchain version and
    additionally install that
  • Avoid Unexpected behaviour: if you specify this action runs with some Go
    version (e.g. 1.21.0) but your go.mod contains a toolchain or go
    directive for a newer version (e.g. 1.22.0) then, without any other
    configuration/environment setup, any go commands will be run using go
    1.22.0

This will be a breaking change for some workflows. Given a go.mod
like:

module proj

go 1.22.0

Then running any go command, e.g. go mod tidy, in an environment
where only go versions before 1.22.0 were installed would previously
trigger a toolchain download of Go 1.22.0 and that version being used
to execute the command. With this change the above would error out with
something like:

go: go.mod requires go >= 1.22.0 (running go 1.21.7;
GOTOOLCHAIN=local)

[1] https://go.dev/doc/toolchain#select
[2] https://github.com/docker-library/golang/blob/dae3405a325073e8ad7c8c378ebdf2540d8565c4/Dockerfile-linux.template#L163
[3] docker-library/golang#472

Check list:

  • Mark if documentation changes are required.
  • Mark if tests were added or updated to cover the changes.

@matthewhughes934 matthewhughes934 requested a review from a team as a code owner March 3, 2024 09:58
@matthewhughes934 matthewhughes934 marked this pull request as draft March 3, 2024 09:58
@matthewhughes934
Copy link
Author

Testing this action https://github.com/matthewhughes934/setup-go-test, see the workflow runs for details https://github.com/matthewhughes934/setup-go-test/actions

@matthewhughes934 matthewhughes934 marked this pull request as ready for review March 12, 2024 18:50
vincenthsh added a commit to vincenthsh/fogg that referenced this pull request Apr 24, 2024
switch off of `go-version-file` in the Github Actions, because it doesn't work great with the new `go mod tidy` format that go 1.22 does. See:

* [Improve toolchain handling actions/setup-go#460](actions/setup-go#460)
* [More specific handling/detection of Go toolchain versions actions/setup-go#457](actions/setup-go#457)
vincenthsh added a commit to vincenthsh/fogg that referenced this pull request Apr 24, 2024
switch off of `go-version-file` in the Github Actions, because it doesn't work great with the new `go mod tidy` format that go 1.22 does. See:

* [Improve toolchain handling actions/setup-go#460](actions/setup-go#460)
* [More specific handling/detection of Go toolchain versions actions/setup-go#457](actions/setup-go#457)
vincenthsh added a commit to vincenthsh/fogg that referenced this pull request Apr 24, 2024
switch off of `go-version-file` in the Github Actions, because it doesn't work great with the new `go mod tidy` format that go 1.22 does. See:

* [Improve toolchain handling actions/setup-go#460](actions/setup-go#460)
* [More specific handling/detection of Go toolchain versions actions/setup-go#457](actions/setup-go#457)
@matthewhughes934 matthewhughes934 force-pushed the improve-toolchain-handling branch from be5f1f1 to 145e58d Compare October 14, 2024 18:46
@kaovilai
Copy link

This PR effectively addresses and fixes #457.

The implementation:

  • ✅ Sets GOTOOLCHAIN=local to prevent automatic toolchain downloads (matching Docker's approach)
  • ✅ Reads toolchain directive from go.mod/go.work files with proper fallback to go directive
  • ✅ Includes comprehensive test coverage for the new functionality

This change will prevent the unexpected behavior where specifying go-version: 1.21.0 could result in 1.22.0 being used due to toolchain directives, exactly as described in issue #457.

The breaking change is well-documented and justified - users who rely on automatic toolchain downloads will need to adjust their workflows, but this brings the action in line with official Go Docker images and provides more predictable behavior.

@reneleonhardt
Copy link

Did you rebase already? GitHub doesn't allow me to see the parent commit.
npm packages are very old, maybe npm audit --fix will help after rebasing.

@matthewhughes934
Copy link
Author

Did you rebase already? GitHub doesn't allow me to see the parent commit. npm packages are very old, maybe npm audit --fix will help after rebasing.

The vulnerability reported is also present on main:

$ git checkout main
$ git rev-parse HEAD
8e57b58e57be52ac95949151e2777ffda8501267
$ npm audit --audit-level=high
# npm audit report

form-data  >=4.0.0 <4.0.4 || <2.5.4
Severity: critical
form-data uses unsafe random function in form-data for choosing boundary - https://github.com/advisories/GHSA-fjxv-7rqg-78g4
form-data uses unsafe random function in form-data for choosing boundary - https://github.com/advisories/GHSA-fjxv-7rqg-78g4
fix available via `npm audit fix`
node_modules/@azure/core-http/node_modules/form-data
node_modules/@types/node-fetch/node_modules/form-data
node_modules/form-data

1 critical severity vulnerability

To address all issues, run:
  npm audit fix

The vulnerability is two days old: GHSA-fjxv-7rqg-78g4, here's a separate PR for that #618 (though I'm not sure why dependabot hasn't raised one?)

@reneleonhardt
Copy link

reneleonhardt commented Jul 24, 2025

Dependabot doesn't always work as you would expect, it's not resilient for example, a simple network error can disable updates. Here is your failed run from 2 days ago, only maintainers are allowed to read the logs:
https://github.com/actions/setup-go/actions/runs/16426449639
It doesn't even store state between runs, and when you only allow it to run once per week like in this repo, then it could take days or weeks until you finally could merge even one PR again, so contributors can do nothing except waiting even longer when even CI stops working...

As long as AI reviews haven't been enabled, only manual maintainer work could speed-up reviews.
After waiting for one year for a few lines of code, I wouldn't hold my breath...

@matthewhughes934 matthewhughes934 force-pushed the improve-toolchain-handling branch from 145e58d to c58ae12 Compare July 24, 2025 16:29
@matthewhughes934
Copy link
Author

I've dropped the commit that changed behaviour from install the Go version specified in the toolchain directive to the one specified in the go directive, since I think this is what people expect this action to do (it's how things worked until toolchains were introduced to the language). Maybe worth a separate option to install the toolchain version.

Force `go` to always use the local toolchain (i.e. the one the one that
shipped with the go command being run) via setting the `GOTOOLCHAIN`
environment variable to `local`[1]:

> When GOTOOLCHAIN is set to local, the go command always runs the
bundled Go toolchain.

This is how things are setup in the official Docker images (e.g.[2], see
also the discussion around that change[3]). The motivation behind this
is to:

* Reduce duplicate work: if the `toolchain` version in `go.mod` was
  greated than the `go` version, the version from the `go` directive
  would be installed, then Go would detect the `toolchain` version and
  additionally install that
* Avoid Unexpected behaviour: if you specify this action runs with some Go
  version (e.g. `1.21.0`) but your go.mod contains a `toolchain` or `go`
  directive for a newer version (e.g. `1.22.0`) then, without any other
  configuration/environment setup, any go commands will be run using go
  `1.22.0`

This will be a **breaking change** for some workflows. Given a `go.mod`
like:

    module proj

    go 1.22.0

Then running any `go` command, e.g. `go mod tidy`, in an environment
where only go versions before `1.22.0` were installed would previously
trigger a toolchain download of Go `1.22.0` and that version being used
to execute the command. With this change the above would error out with
something like:

> go: go.mod requires go >= 1.22.0 (running go 1.21.7;
GOTOOLCHAIN=local)

[1] https://go.dev/doc/toolchain#select
[2] https://github.com/docker-library/golang/blob/dae3405a325073e8ad7c8c378ebdf2540d8565c4/Dockerfile-linux.template#L163
[3] docker-library/golang#472
@matthewhughes934 matthewhughes934 force-pushed the improve-toolchain-handling branch from c58ae12 to 7d12308 Compare July 27, 2025 08:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants