From 368ff61211e3885ecb101779c89a64cd04fd53d3 Mon Sep 17 00:00:00 2001 From: Kamil Sambor Date: Thu, 28 Nov 2024 10:58:28 +0100 Subject: [PATCH] [make][pre-commit]Check CRD schema to avoid update issues The new crd-schema-check make target compares the CRD schema of the patch with the schema on the tip of main and report errors on non backward compatible changes. This make target now also run in pre-commit both locally and in CI. This make target uses https://github.com/openshift/crd-schema-checker to do the actual checking. Related: OSPRH-11833 --- .pre-commit-config.yaml | 6 ++++++ Makefile | 9 +++++++++ hack/build-crd-schema-checker.sh | 15 +++++++++++++++ hack/crd-schema-checker.sh | 21 +++++++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100755 hack/build-crd-schema-checker.sh create mode 100755 hack/crd-schema-checker.sh diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a7646b3..0969042 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -32,6 +32,12 @@ repos: entry: make args: ['operator-lint'] pass_filenames: false + - id: make-crd-schema-check + name: make-crd-schema-check + language: system + entry: make + args: ['crd-schema-check'] + pass_filenames: false - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 diff --git a/Makefile b/Makefile index a63e46b..fc889c4 100644 --- a/Makefile +++ b/Makefile @@ -428,3 +428,12 @@ kuttl-test-cleanup: else \ echo "Namespce already cleaned up. Nothing to do"; \ fi + +CRD_SCHEMA_CHECKER_VERSION ?= release-4.16 + +BRANCH=main + +PHONY: crd-schema-check +crd-schema-check: manifests + INSTALL_DIR=$(LOCALBIN) CRD_SCHEMA_CHECKER_VERSION=$(CRD_SCHEMA_CHECKER_VERSION) hack/build-crd-schema-checker.sh + INSTALL_DIR=$(LOCALBIN) BASE_REF="$${PULL_BASE_SHA:-$(BRANCH)}" hack/crd-schema-checker.sh diff --git a/hack/build-crd-schema-checker.sh b/hack/build-crd-schema-checker.sh new file mode 100755 index 0000000..12bf3be --- /dev/null +++ b/hack/build-crd-schema-checker.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -euxo pipefail + +if [ -f "$INSTALL_DIR/crd-schema-checker" ]; then + exit 0 +fi + +mkdir -p "$INSTALL_DIR/git-tmp" +git clone https://github.com/openshift/crd-schema-checker.git \ + -b "$CRD_SCHEMA_CHECKER_VERSION" "$INSTALL_DIR/git-tmp" +pushd "$INSTALL_DIR/git-tmp" +GOWORK=off make +cp crd-schema-checker "$INSTALL_DIR/" +popd +rm -rf "$INSTALL_DIR/git-tmp" diff --git a/hack/crd-schema-checker.sh b/hack/crd-schema-checker.sh new file mode 100755 index 0000000..c431ae5 --- /dev/null +++ b/hack/crd-schema-checker.sh @@ -0,0 +1,21 @@ +#!/bin/bash +set -euxo pipefail + +CHECKER=$INSTALL_DIR/crd-schema-checker + +TMP_DIR=$(mktemp -d) + +function cleanup { + rm -rf "$TMP_DIR" +} + +trap cleanup EXIT + + +for crd in config/crd/bases/*.yaml; do + mkdir -p "$(dirname "$TMP_DIR/$crd")" + git show "$BASE_REF:$crd" > "$TMP_DIR/$crd" + $CHECKER check-manifests \ + --existing-crd-filename="$TMP_DIR/$crd" \ + --new-crd-filename="$crd" +done