Skip to content

Commit

Permalink
.*: sync go toolchain version and add ability to verify versions
Browse files Browse the repository at this point in the history
This commit adds a script to sync the version present in .go-version
across all go.mod files as the toolchain directive. As part of that,
this commit also modifies go.mod files that did not have synced toolchain
directives.

Additionally, this also adds a script to verify all toolchain and go
directives against the version present in .go-version as follows:
(1) The go directive <= version in .go-version
(2) The toolchain directive == version in .go-version

This script runs as part of the `make verify` target, making it run
as a presbumit by default.

Signed-off-by: Madhav Jivrajani <madhav.jiv@gmail.com>
  • Loading branch information
MadhavJivrajani committed May 6, 2024
1 parent a990646 commit 229e2fc
Show file tree
Hide file tree
Showing 14 changed files with 99 additions and 1 deletion.
11 changes: 10 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ fuzz:
verify: verify-gofmt verify-bom verify-lint verify-dep verify-shellcheck verify-goword \
verify-govet verify-license-header verify-receiver-name verify-mod-tidy \
verify-shellws verify-proto-annotations verify-genproto verify-yamllint \
verify-govet-shadow verify-markdown-marker
verify-govet-shadow verify-markdown-marker verify-go-versions

.PHONY: fix
fix: fix-bom fix-lint fix-yamllint
Expand Down Expand Up @@ -196,3 +196,12 @@ clean:
rm -rf ./tests/e2e/default.proxy
rm -rf ./bin/shellcheck*
find ./ -name "127.0.0.1:*" -o -name "localhost:*" -o -name "*.log" -o -name "agent-*" -o -name "*.coverprofile" -o -name "testname-proxy-*" -delete

.PHONY: verify-go-versions
verify-go-versions:
./scripts/verify_go_versions.sh

.PHONY: sync-toolchain-directive
sync-toolchain-directive:
./scripts/sync_go_toolchain_directive.sh
./scripts/fix.sh
2 changes: 2 additions & 0 deletions api/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ module go.etcd.io/etcd/api/v3

go 1.22

toolchain go1.22.2

require (
github.com/coreos/go-semver v0.3.1
github.com/gogo/protobuf v1.3.2
Expand Down
2 changes: 2 additions & 0 deletions client/internal/v2/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ module go.etcd.io/etcd/client/v2

go 1.22

toolchain go1.22.2

require (
go.etcd.io/etcd/api/v3 v3.6.0-alpha.0
go.etcd.io/etcd/client/pkg/v3 v3.6.0-alpha.0
Expand Down
2 changes: 2 additions & 0 deletions client/pkg/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ module go.etcd.io/etcd/client/pkg/v3

go 1.22

toolchain go1.22.2

require (
github.com/coreos/go-systemd/v22 v22.5.0
github.com/stretchr/testify v1.9.0
Expand Down
2 changes: 2 additions & 0 deletions client/v3/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ module go.etcd.io/etcd/client/v3

go 1.22

toolchain go1.22.2

require (
github.com/coreos/go-semver v0.3.1
github.com/dustin/go-humanize v1.0.1
Expand Down
2 changes: 2 additions & 0 deletions etcdctl/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ module go.etcd.io/etcd/etcdctl/v3

go 1.22

toolchain go1.22.2

require (
github.com/bgentry/speakeasy v0.1.0
github.com/cheggaaa/pb/v3 v3.1.5
Expand Down
2 changes: 2 additions & 0 deletions etcdutl/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ module go.etcd.io/etcd/etcdutl/v3

go 1.22

toolchain go1.22.2

replace (
go.etcd.io/etcd/api/v3 => ../api
go.etcd.io/etcd/client/pkg/v3 => ../client/pkg
Expand Down
2 changes: 2 additions & 0 deletions pkg/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ module go.etcd.io/etcd/pkg/v3

go 1.22

toolchain go1.22.2

require (
github.com/creack/pty v1.1.18
github.com/dustin/go-humanize v1.0.1
Expand Down
14 changes: 14 additions & 0 deletions scripts/sync_go_toolchain_directive.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/usr/bin/env bash

# This script looks at the version present in the .go-version file and treats
# that to be the value of the toolchain directive that go should use. It then
# updates the toolchain directives of all go.mod files to reflect this version.
#
# We do this to ensure that .go-version acts as the source of truth for go versions.

set -euo pipefail

source ./scripts/test_lib.sh

TARGET_GO_VERSION="${TARGET_GO_VERSION:-"$(cat "${ETCD_ROOT_DIR}/.go-version")"}"
find . -name 'go.mod' -exec go mod edit -toolchain=go"${TARGET_GO_VERSION}" {} \;
53 changes: 53 additions & 0 deletions scripts/verify_go_versions.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/usr/bin/env bash

# This script verifies that the value of the toolchain directive in the
# go.mod files always match that of the .go-version file to ensure that
# we accidentally don't test and release with differing versions of Go.

set -euo pipefail

source ./scripts/test_lib.sh

target_go_version="${target_go_version:-"$(cat "${ETCD_ROOT_DIR}/.go-version")"}"
log_info "expected go toolchain directive: go${target_go_version}"
log_info

toolchain_out_of_sync="false"
go_line_violation="false"

# verify_go_versions takes a go.mod filepath as an argument
# and checks if:
# (1) go directive <= version in .go-version
# (2) toolchain directive == version in .go-version
function verify_go_versions() {
# shellcheck disable=SC2086
toolchain_version="$(go mod edit -json $1 | jq -r .Toolchain)"
# shellcheck disable=SC2086
go_line_version="$(go mod edit -json $1 | jq -r .Go)"
if [[ "go${target_go_version}" != "${toolchain_version}" ]]; then
log_error "go toolchain directive out of sync for $1, got: ${toolchain_version}"
toolchain_out_of_sync="true"
fi
if ! printf '%s\n' "${go_line_version}" "${target_go_version}" | sort --check=silent --version-sort; then
log_error "go directive in $1 is greater than maximum allowed: go${target_go_version}"
go_line_violation="true"
fi
}

while read -r mod; do
verify_go_versions "${mod}";
done < <(find . -name 'go.mod')

if [[ "${toolchain_out_of_sync}" == "true" ]]; then
log_error
log_error "Please run scripts/sync_go_toolchain_directive.sh or update .go-version to rectify this error"
fi

if [[ "${go_line_violation}" == "true" ]]; then
log_error
log_error "Please update .go-version to rectify this error, any go directive should be <= .go-version"
fi

if [[ "${go_line_violation}" == "true" ]] || [[ "${toolchain_out_of_sync}" == "true" ]]; then
exit 1
fi
2 changes: 2 additions & 0 deletions server/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ module go.etcd.io/etcd/server/v3

go 1.22

toolchain go1.22.2

require (
github.com/coreos/go-semver v0.3.1
github.com/coreos/go-systemd/v22 v22.5.0
Expand Down
2 changes: 2 additions & 0 deletions tests/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ module go.etcd.io/etcd/tests/v3

go 1.22

toolchain go1.22.2

replace (
go.etcd.io/etcd/api/v3 => ../api
go.etcd.io/etcd/client/pkg/v3 => ../client/pkg
Expand Down
2 changes: 2 additions & 0 deletions tools/rw-heatmaps/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ module go.etcd.io/etcd/tools/rw-heatmaps/v3

go 1.22

toolchain go1.22.2

require (
github.com/spf13/cobra v1.8.0
github.com/spf13/pflag v1.0.5
Expand Down
2 changes: 2 additions & 0 deletions tools/testgrid-analysis/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ module go.etcd.io/etcd/tools/testgrid-analysis/v3

go 1.22

toolchain go1.22.2

require (
github.com/GoogleCloudPlatform/testgrid v0.0.173
github.com/google/go-github/v60 v60.0.0
Expand Down

0 comments on commit 229e2fc

Please sign in to comment.