Skip to content

Commit

Permalink
Add CI to check if golang version updated (#1264)
Browse files Browse the repository at this point in the history
Signed-off-by: Todd Short <tshort@redhat.com>
  • Loading branch information
tmshort authored Sep 16, 2024
1 parent 188858c commit f10eb1d
Show file tree
Hide file tree
Showing 3 changed files with 91 additions and 1 deletion.
16 changes: 16 additions & 0 deletions .github/workflows/go-verdiff.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: go-verdiff
on:
pull_request:
paths:
- '**.mod'
branches:
- main
jobs:
go-verdiff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Check golang version
run: hack/tools/check-go-version.sh "${{ github.event.pull_request.base.sha }}"
4 changes: 3 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ SHELL := /usr/bin/env bash -o pipefail
.SHELLFLAGS := -ec
export ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))

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

.PHONY: tidy
tidy: #HELP Update dependencies.
$(Q)go mod tidy
# Force tidy to use the version already in go.mod
$(Q)go mod tidy -go=$(GOLANG_VERSION)

.PHONY: manifests
manifests: $(CONTROLLER_GEN) #EXHELP Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
Expand Down
72 changes: 72 additions & 0 deletions hack/tools/check-go-version.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#!/bin/bash

BASE_REF=${1:-main}
GO_VER=$(sed -En 's/^go (.*)$/\1/p' "go.mod")
OLDIFS="${IFS}"
IFS='.' MAX_VER=(${GO_VER})
IFS="${OLDIFS}"

if [ ${#MAX_VER[*]} -ne 3 -a ${#MAX_VER[*]} -ne 2 ]; then
echo "Invalid go version: ${GO_VER}"
exit 1
fi

GO_MAJOR=${MAX_VER[0]}
GO_MINOR=${MAX_VER[1]}
GO_PATCH=${MAX_VER[2]}

RETCODE=0

check_version () {
local whole=$1
local file=$2
OLDIFS="${IFS}"
IFS='.' ver=(${whole})
IFS="${OLDIFS}"

if [ ${ver[0]} -gt ${GO_MAJOR} ]; then
echo "${file}: ${whole}: Bad golang version (expected ${GO_VER} or less)"
return 1
fi
if [ ${ver[1]} -gt ${GO_MINOR} ]; then
echo "${file}: ${whole}: Bad golang version (expected ${GO_VER} or less)"
return 1
fi

if [ ${#ver[*]} -eq 2 ] ; then
return 0
fi
if [ ${#ver[*]} -ne 3 ] ; then
echo "${file}: ${whole}: Badly formatted golang version"
return 1
fi

if [ ${ver[1]} -eq ${GO_MINOR} -a ${ver[2]} -gt ${GO_PATCH} ]; then
echo "${file}: ${whole}: Bad golang version (expected ${GO_VER} or less)"
return 1
fi
return 0
}

echo "Found golang version: ${GO_VER}"

for f in $(find . -name "*.mod"); do
v=$(sed -En 's/^go (.*)$/\1/p' ${f})
if [ -z ${v} ]; then
echo "${f}: Skipping, no version found"
continue
fi
if ! check_version ${v} ${f}; then
RETCODE=1
fi
old=$(git grep -ohP '^go .*$' "${BASE_REF}" -- "${f}")
old=${old#go }
new=$(git grep -ohP '^go .*$' "${f}")
new=${new#go }
if [ "${new}" != "${old}" ]; then
echo "${f}: ${v}: Updated golang version from ${old}"
RETCODE=1
fi
done

exit ${RETCODE}

0 comments on commit f10eb1d

Please sign in to comment.