Skip to content

🌱 Add CI to check if golang version updated #1264

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

Merged
merged 1 commit into from
Sep 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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}")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This regex stipulates ONE space after "go"... (beware of fragile regex's)
This is a nit, as this should always hold :-)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually it stipulates one space after "go", then ANYTHING, including spaces. Since we're not "capturing" the version separately, it doesn't matter.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's managed by go mod, so I would hope it always holds.

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}