Skip to content
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

Improve toolchain handling #460

Open
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

matthewhughes934
Copy link

  • Configure environment to avoid toolchain installs

    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, the action will install a version of Go, a
      toolchain will be detected, the toolchain will be detected and then
      another version of Go installed
    • 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] proposal: set GOTOOLCHAIN=local (or =path) in our image docker-library/golang#472

  • Prefer installing version from toolchain directive

    Prefer this over the version from the go directive. Per the docs[1]

    The toolchain line declares a suggested toolchain to use with the
    module or workspace

    It seems reasonable to use this, since running this action in a
    directory containing a go.mod (or go.work) suggests the user is
    wishing to work with the module or workspace.

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)
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, the action will install a version of Go, a
  toolchain will be detected, the toolchain will be detected and then
  another version of Go installed
* 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`
* TODO: link image

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
Prefer this over the version from the `go` directive. Per the docs[1]

> The toolchain line declares a suggested toolchain to use with the
module or workspace

It seems reasonable to use this, since running this action in a
directory containing a `go.mod` (or `go.work`) suggests the user is
wishing to work _with the module or workspace_.

See (TODO link issue)
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.

1 participant