Skip to content

Commit f10eb1d

Browse files
authored
Add CI to check if golang version updated (#1264)
Signed-off-by: Todd Short <tshort@redhat.com>
1 parent 188858c commit f10eb1d

File tree

3 files changed

+91
-1
lines changed

3 files changed

+91
-1
lines changed

.github/workflows/go-verdiff.yaml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
name: go-verdiff
2+
on:
3+
pull_request:
4+
paths:
5+
- '**.mod'
6+
branches:
7+
- main
8+
jobs:
9+
go-verdiff:
10+
runs-on: ubuntu-latest
11+
steps:
12+
- uses: actions/checkout@v4
13+
with:
14+
fetch-depth: 0
15+
- name: Check golang version
16+
run: hack/tools/check-go-version.sh "${{ github.event.pull_request.base.sha }}"

Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ SHELL := /usr/bin/env bash -o pipefail
77
.SHELLFLAGS := -ec
88
export ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
99

10+
GOLANG_VERSION := $(shell sed -En 's/^go (.*)$$/\1/p' "go.mod")
1011
# Image URL to use all building/pushing image targets
1112
ifeq ($(origin IMAGE_REPO), undefined)
1213
IMAGE_REPO := quay.io/operator-framework/operator-controller
@@ -95,7 +96,8 @@ lint: $(GOLANGCI_LINT) #HELP Run golangci linter.
9596

9697
.PHONY: tidy
9798
tidy: #HELP Update dependencies.
98-
$(Q)go mod tidy
99+
# Force tidy to use the version already in go.mod
100+
$(Q)go mod tidy -go=$(GOLANG_VERSION)
99101

100102
.PHONY: manifests
101103
manifests: $(CONTROLLER_GEN) #EXHELP Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.

hack/tools/check-go-version.sh

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
#!/bin/bash
2+
3+
BASE_REF=${1:-main}
4+
GO_VER=$(sed -En 's/^go (.*)$/\1/p' "go.mod")
5+
OLDIFS="${IFS}"
6+
IFS='.' MAX_VER=(${GO_VER})
7+
IFS="${OLDIFS}"
8+
9+
if [ ${#MAX_VER[*]} -ne 3 -a ${#MAX_VER[*]} -ne 2 ]; then
10+
echo "Invalid go version: ${GO_VER}"
11+
exit 1
12+
fi
13+
14+
GO_MAJOR=${MAX_VER[0]}
15+
GO_MINOR=${MAX_VER[1]}
16+
GO_PATCH=${MAX_VER[2]}
17+
18+
RETCODE=0
19+
20+
check_version () {
21+
local whole=$1
22+
local file=$2
23+
OLDIFS="${IFS}"
24+
IFS='.' ver=(${whole})
25+
IFS="${OLDIFS}"
26+
27+
if [ ${ver[0]} -gt ${GO_MAJOR} ]; then
28+
echo "${file}: ${whole}: Bad golang version (expected ${GO_VER} or less)"
29+
return 1
30+
fi
31+
if [ ${ver[1]} -gt ${GO_MINOR} ]; then
32+
echo "${file}: ${whole}: Bad golang version (expected ${GO_VER} or less)"
33+
return 1
34+
fi
35+
36+
if [ ${#ver[*]} -eq 2 ] ; then
37+
return 0
38+
fi
39+
if [ ${#ver[*]} -ne 3 ] ; then
40+
echo "${file}: ${whole}: Badly formatted golang version"
41+
return 1
42+
fi
43+
44+
if [ ${ver[1]} -eq ${GO_MINOR} -a ${ver[2]} -gt ${GO_PATCH} ]; then
45+
echo "${file}: ${whole}: Bad golang version (expected ${GO_VER} or less)"
46+
return 1
47+
fi
48+
return 0
49+
}
50+
51+
echo "Found golang version: ${GO_VER}"
52+
53+
for f in $(find . -name "*.mod"); do
54+
v=$(sed -En 's/^go (.*)$/\1/p' ${f})
55+
if [ -z ${v} ]; then
56+
echo "${f}: Skipping, no version found"
57+
continue
58+
fi
59+
if ! check_version ${v} ${f}; then
60+
RETCODE=1
61+
fi
62+
old=$(git grep -ohP '^go .*$' "${BASE_REF}" -- "${f}")
63+
old=${old#go }
64+
new=$(git grep -ohP '^go .*$' "${f}")
65+
new=${new#go }
66+
if [ "${new}" != "${old}" ]; then
67+
echo "${f}: ${v}: Updated golang version from ${old}"
68+
RETCODE=1
69+
fi
70+
done
71+
72+
exit ${RETCODE}

0 commit comments

Comments
 (0)