Skip to content

Commit

Permalink
Add CI to check if golang version updated (#401)
Browse files Browse the repository at this point in the history
Signed-off-by: Todd Short <todd.short@me.com>
  • Loading branch information
tmshort authored Sep 16, 2024
1 parent 542fc80 commit 2b49a6c
Show file tree
Hide file tree
Showing 3 changed files with 92 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 }}"
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
SHELL := /usr/bin/env bash -o pipefail
.SHELLFLAGS := -ec

GOLANG_VERSION := $(shell sed -En 's/^go (.*)$$/\1/p' "go.mod")

ifeq ($(origin IMAGE_REPO), undefined)
IMAGE_REPO := quay.io/operator-framework/catalogd
endif
Expand Down Expand Up @@ -114,7 +116,8 @@ image-registry: ## Setup in-cluster image registry

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

.PHONY: verify
verify: tidy fmt vet generate ## Verify the current code generation and lint
Expand Down
72 changes: 72 additions & 0 deletions hack/scripts/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 2b49a6c

Please sign in to comment.