build: "Quick Checks" no longer uses goenv

goenv was making things more complicated than needed since it's really
designed to help with interactive use in a shell more than automated use
like this.

Instead, we'll follow the same strategy that our build.yml was doing of
just reading the .go-version file directly and then using the official
actions/setup-go action to do the actual installation. The key advantage
here is that Go ends up installed in a way where just running "go" will
do the right thing, and we no longer need to fuss with shims and
version-based path prefixes.

Rather than duplicating the logic from build.yml, instead it's factored
out into a separate composite action which both build.yml and checks.yml
will now share, in case we want to change the Go version selection
methodology in the future.
This commit is contained in:
Martin Atkins 2022-04-01 17:31:12 -07:00
parent 67fedd48a6
commit 95f26b340b
4 changed files with 44 additions and 62 deletions

View File

@ -1,41 +0,0 @@
name: 'Set Up Go Toolchain'
description: 'Installs the Go toolchain specified in .go-version.'
outputs:
go-version:
description: "Go toolchain version"
value: ${{ steps.go.outputs.go-version }}
gopath:
description: "GOPATH location"
value: ${{ steps.go.outputs.gopath }}
goenv:
description: "Path to the 'goenv' executable"
value: ${{ steps.go.outputs.goenv }}
goenv-bin-dir:
description: "Path to the directory containing the 'goenv' executable"
value: ${{ steps.go.outputs.goenv-bin-dir }}
go:
description: "Path to the 'go' executable"
value: ${{ steps.go.outputs.go }}
runs:
using: "composite"
steps:
# We use goenv to make sure we're always using the same Go version we'd
# use for releases, as recorded in the .go-version file.
- name: "Install Go"
id: go
shell: bash
run: |
git clone https://github.com/syndbg/goenv.git ~/.goenv
# "install" makes sure we have the .go-version-selected toolchain
# available in goenv's repository of toolchains.
# (this creates ~/.goenv/versions/VERSION/... to serve as GOROOT)
~/.goenv/bin/goenv install
# "rehash" generates the wrapper scripts that goenv uses to
# select the correct executables for the selected toolchain.
# (this is what creates the ~/.goenv/shims/go we refer to below)
~/.goenv/bin/goenv rehash
echo "::set-output name=go-version::$(~/.goenv/bin/goenv version-name)"
echo "::set-output name=gopath::$HOME/go/$(~/.goenv/bin/goenv version-name)"
echo "::set-output name=goenv::$HOME/.goenv/bin/goenv"
echo "::set-output name=goenv-bin-dir::$HOME/.goenv/bin"
echo "::set-output name=go::$HOME/.goenv/shims/go"

23
.github/actions/go-version/action.yml vendored Normal file
View File

@ -0,0 +1,23 @@
name: 'Determine Go Toolchain Version'
description: 'Uses the .go-version file to determine which Go toolchain to use for any Go-related actions downstream.'
outputs:
version:
description: "Go toolchain version"
value: ${{ steps.go.outputs.version }}
runs:
using: "composite"
steps:
# We use goenv to make sure we're always using the same Go version we'd
# use for releases, as recorded in the .go-version file.
- name: "Determine Go version"
id: go
shell: bash
# We use .go-version as our source of truth for current Go
# version, because "goenv" can react to it automatically.
# However, we don't actually use goenv for our automated
# steps in GitHub Actions, because it's primarily for
# interactive use in shells and makes things unnecessarily
# complex for automation.
run: |
echo "Building with Go $(cat .go-version)"
echo "::set-output name=version::$(cat .go-version)"

View File

@ -68,17 +68,13 @@ jobs:
name: "Determine Go toolchain version"
runs-on: ubuntu-latest
outputs:
go-version: ${{ steps.get-go-version.outputs.go-version }}
go-version: ${{ steps.get-go-version.outputs.version }}
steps:
- uses: actions/checkout@v2
- name: Determine Go version
id: get-go-version
# We use .go-version as our source of truth for current Go
# version, because "goenv" can react to it automatically.
run: |
echo "Building with Go $(cat .go-version)"
echo "::set-output name=go-version::$(cat .go-version)"
uses: ./.github/actions/go-version
generate-metadata-file:
name: "Generate release metadata"

View File

@ -33,23 +33,28 @@ jobs:
- name: "Fetch source code"
uses: actions/checkout@v2
- name: "Install Go"
- name: Determine Go version
id: go
uses: ./.github/actions/go-setup
uses: ./.github/actions/go-version
- name: Install Go toolchain
uses: actions/setup-go@v2
with:
go-version: ${{ steps.go.outputs.version }}
# NOTE: This cache is shared with the e2e-tests job, so the corresponding
# step in that job must always be identical to this one.
- name: Cache Go modules
uses: actions/cache@v3
with:
path: "${{steps.go.outputs.gopath}}/pkg"
path: "~/go/pkg"
key: go-mod-${{ hashFiles('go.sum') }}
restore-keys: |
go-mod-
- name: "go.mod and go.sum consistency check"
run: |
"${{steps.go.outputs.go}}" mod tidy
go mod tidy
if [[ -n "$(git status --porcelain)" ]]; then
echo "go.mod/go.sum are not up-to-date. Run 'go mod tidy' and then commit the updated files."
exit 1
@ -57,7 +62,7 @@ jobs:
- name: "Unit tests"
run: |
"${{steps.go.outputs.go}}" test ./...
go test ./...
# We'll also deal with some general consistency/lint/style checks
# here just because they are relatively fast and so not worth running
@ -65,12 +70,6 @@ jobs:
# out the source code in another worker.
- name: "Code consistency checks"
run: |
# We do need to fully init goenv in this one case because we're
# going to run Go indirectly via make and some shell scripts, so
# we need PATH set up correctly.
export PATH="${{steps.go.outputs.goenv-bin-dir}}":$PATH
eval "$(goenv init -)"
go version
make fmtcheck generate staticcheck exhaustive protobuf
if [[ -n "$(git status --porcelain)" ]]; then
echo "Generated files are inconsistent. Run 'make generate' and 'make protobuf' locally and then commit the updated files."
@ -90,20 +89,25 @@ jobs:
- name: "Fetch source code"
uses: actions/checkout@v2
- name: "Install Go"
- name: Determine Go version
id: go
uses: ./.github/actions/go-setup
uses: ./.github/actions/go-version
- name: Install Go toolchain
uses: actions/setup-go@v2
with:
go-version: ${{ steps.go.outputs.version }}
# NOTE: This cache is shared with the e2e-tests job, so the corresponding
# step in that job must always be identical to this one.
- name: Cache Go modules
uses: actions/cache@v3
with:
path: "${{steps.go.outputs.gopath}}/pkg"
path: "~/go/pkg"
key: go-mod-${{ hashFiles('go.sum') }}
restore-keys: |
go-mod-
- name: "End-to-end tests"
run: |
TF_ACC=1 "${{steps.go.outputs.go}}" test -v ./internal/command/e2etest
TF_ACC=1 go test -v ./internal/command/e2etest