Skip to content

Commit c8dc9c2

Browse files
committed
Add 3pp version drift detection
Signed-off-by: Fiachra Corcoran <fiachra.corcoran@est.tech>
1 parent a81b9d0 commit c8dc9c2

3 files changed

Lines changed: 245 additions & 0 deletions

File tree

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
# Copyright 2026 The kpt Authors
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
name: Version Drift Check
16+
on:
17+
pull_request:
18+
workflow_dispatch:
19+
20+
jobs:
21+
check-versions:
22+
name: Check Version Consistency
23+
runs-on: ubuntu-latest
24+
steps:
25+
- name: Checkout
26+
uses: actions/checkout@v4
27+
28+
- name: Extract versions from sources
29+
id: extract
30+
run: |
31+
# Extract Go version from go.mod
32+
go_version=$(grep '^go ' go.mod | awk '{print $2}')
33+
echo "go_version=${go_version}" >> $GITHUB_OUTPUT
34+
35+
# Extract kpt version from go.mod (require line)
36+
kpt_version=$(grep 'github.com/kptdev/kpt ' go.mod | grep -oP 'v\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?' | head -1)
37+
echo "kpt_version=${kpt_version}" >> $GITHUB_OUTPUT
38+
39+
# Extract kind version from porch-e2e-ci-jobs.yaml (after kind-action@v1)
40+
kind_version=$(awk '/helm\/kind-action@v1/,/version:/ {if (/version:/) print $2}' .github/workflows/porch-e2e-ci-jobs.yaml | head -1)
41+
echo "kind_version=${kind_version}" >> $GITHUB_OUTPUT
42+
43+
# Extract git and docker versions from ubuntu-latest runner
44+
git_version=$(git --version | awk '{print $3}')
45+
echo "git_version=${git_version}" >> $GITHUB_OUTPUT
46+
47+
docker_version=$(docker --version | grep -oP 'version \K[0-9.]+')
48+
echo "docker_version=${docker_version}" >> $GITHUB_OUTPUT
49+
50+
- name: Extract versions from config.toml
51+
id: config
52+
run: |
53+
# Extract versions from config.toml (stored without 'v' prefix)
54+
go_version=$(grep '^version_go = ' docs/config.toml | cut -d'"' -f2)
55+
echo "go_version=${go_version}" >> $GITHUB_OUTPUT
56+
57+
kpt_version=$(grep '^version_kpt = ' docs/config.toml | cut -d'"' -f2)
58+
echo "kpt_version=v${kpt_version}" >> $GITHUB_OUTPUT
59+
60+
kind_version=$(grep '^version_kind = ' docs/config.toml | cut -d'"' -f2)
61+
echo "kind_version=v${kind_version}" >> $GITHUB_OUTPUT
62+
63+
kube_version=$(grep '^version_kube = ' docs/config.toml | cut -d'"' -f2)
64+
echo "kube_version=${kube_version}" >> $GITHUB_OUTPUT
65+
66+
git_version=$(grep '^version_git = ' docs/config.toml | cut -d'"' -f2)
67+
echo "git_version=${git_version}" >> $GITHUB_OUTPUT
68+
69+
docker_version=$(grep '^version_docker = ' docs/config.toml | cut -d'"' -f2)
70+
echo "docker_version=${docker_version}" >> $GITHUB_OUTPUT
71+
72+
- name: Compare versions
73+
id: compare
74+
run: |
75+
echo "=== Version Consistency Check ===" >> $GITHUB_STEP_SUMMARY
76+
echo "" >> $GITHUB_STEP_SUMMARY
77+
78+
errors=0
79+
warnings=0
80+
81+
# Go version check (CRITICAL - controls build environment)
82+
if [ "${{ steps.extract.outputs.go_version }}" != "${{ steps.config.outputs.go_version }}" ]; then
83+
echo "### FAIL: Go version mismatch" >> $GITHUB_STEP_SUMMARY
84+
echo "- Source (go.mod): ${{ steps.extract.outputs.go_version }}" >> $GITHUB_STEP_SUMMARY
85+
echo "- Docs (config.toml): ${{ steps.config.outputs.go_version }}" >> $GITHUB_STEP_SUMMARY
86+
errors=$((errors + 1))
87+
else
88+
echo "✓ Go: ${{ steps.extract.outputs.go_version }}" >> $GITHUB_STEP_SUMMARY
89+
fi
90+
91+
# kpt version check (CRITICAL - core dependency)
92+
if [ "${{ steps.extract.outputs.kpt_version }}" != "${{ steps.config.outputs.kpt_version }}" ]; then
93+
echo "### FAIL: kpt version mismatch" >> $GITHUB_STEP_SUMMARY
94+
echo "- Source (go.mod): ${{ steps.extract.outputs.kpt_version }}" >> $GITHUB_STEP_SUMMARY
95+
echo "- Docs (config.toml): ${{ steps.config.outputs.kpt_version }}" >> $GITHUB_STEP_SUMMARY
96+
errors=$((errors + 1))
97+
else
98+
echo "✓ kpt: ${{ steps.extract.outputs.kpt_version }}" >> $GITHUB_STEP_SUMMARY
99+
fi
100+
101+
# kind version check (WARNING - test environment)
102+
if [ "${{ steps.extract.outputs.kind_version }}" != "${{ steps.config.outputs.kind_version }}" ]; then
103+
echo "### WARN: kind version mismatch" >> $GITHUB_STEP_SUMMARY
104+
echo "- Source (.github/workflows): ${{ steps.extract.outputs.kind_version }}" >> $GITHUB_STEP_SUMMARY
105+
echo "- Docs (config.toml): ${{ steps.config.outputs.kind_version }}" >> $GITHUB_STEP_SUMMARY
106+
echo "Consider updating docs/config.toml to match the test environment." >> $GITHUB_STEP_SUMMARY
107+
warnings=$((warnings + 1))
108+
else
109+
echo "✓ kind: ${{ steps.extract.outputs.kind_version }}" >> $GITHUB_STEP_SUMMARY
110+
fi
111+
112+
# Kubernetes version (INFORMATIONAL - derived from kind)
113+
echo "ℹ Kubernetes (derived from kind): ${{ steps.extract.outputs.kind_version }} uses k8s ${{ steps.config.outputs.kube_version }}" >> $GITHUB_STEP_SUMMARY
114+
115+
# Git version (INFORMATIONAL - runner-provided)
116+
if [ "${{ steps.extract.outputs.git_version }}" != "${{ steps.config.outputs.git_version }}" ]; then
117+
echo "ℹ Git: runner has ${{ steps.extract.outputs.git_version }}, docs list ${{ steps.config.outputs.git_version }} (advisory - updated by GitHub)" >> $GITHUB_STEP_SUMMARY
118+
else
119+
echo "✓ Git: ${{ steps.extract.outputs.git_version }}" >> $GITHUB_STEP_SUMMARY
120+
fi
121+
122+
# Docker version (INFORMATIONAL - runner-provided)
123+
if [ "${{ steps.extract.outputs.docker_version }}" != "${{ steps.config.outputs.docker_version }}" ]; then
124+
echo "ℹ Docker: runner has ${{ steps.extract.outputs.docker_version }}, docs list ${{ steps.config.outputs.docker_version }} (advisory - updated by GitHub)" >> $GITHUB_STEP_SUMMARY
125+
else
126+
echo "✓ Docker: ${{ steps.extract.outputs.docker_version }}" >> $GITHUB_STEP_SUMMARY
127+
fi
128+
129+
echo "" >> $GITHUB_STEP_SUMMARY
130+
echo "errors=${errors}" >> $GITHUB_OUTPUT
131+
echo "warnings=${warnings}" >> $GITHUB_OUTPUT
132+
133+
if [ "$warnings" -gt 0 ]; then
134+
echo "**Note:** Review warnings above and update docs/config.toml if needed." >> $GITHUB_STEP_SUMMARY
135+
fi
136+
137+
- name: Fail if critical mismatches
138+
if: steps.compare.outputs.errors > 0
139+
run: |
140+
echo "Critical version mismatches detected. Please update docs/config.toml to match the source files."
141+
exit 1

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,7 @@ dev: build check ## Full development cycle (build + check)
9090

9191
.PHONY: quick-test
9292
quick-test: fmt vet test ## Quick development test cycle
93+
94+
.PHONY: check-versions
95+
check-versions: ## Check version consistency between source files and docs/config.toml
96+
@$(CURDIR)/scripts/check-versions.sh

scripts/check-versions.sh

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#!/usr/bin/env bash
2+
3+
# Copyright 2026 The kpt Authors
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
17+
set -e
18+
19+
# Script to check version consistency between source files and docs/config.toml
20+
# Ensures public docs align with the code being built and tested.
21+
22+
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
23+
cd "$REPO_ROOT"
24+
25+
echo "Checking version consistency..."
26+
echo ""
27+
28+
# Extract versions from sources
29+
echo "=== Extracting versions from source files ==="
30+
go_version=$(grep '^go ' go.mod | awk '{print $2}')
31+
echo "Go version (go.mod): $go_version"
32+
33+
kpt_version=$(grep 'github.com/kptdev/kpt ' go.mod | grep -oP 'v\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?' | head -1)
34+
echo "kpt version (go.mod): $kpt_version"
35+
36+
kind_version=$(awk '/helm\/kind-action@v1/,/version:/ {if (/version:/) print $2}' .github/workflows/porch-e2e-ci-jobs.yaml | head -1)
37+
echo "kind version (.github/workflows): $kind_version"
38+
39+
echo ""
40+
echo "=== Versions in docs/config.toml ==="
41+
42+
config_go=$(grep '^version_go = ' docs/config.toml | cut -d'"' -f2)
43+
echo "Go version (config): $config_go"
44+
45+
config_kpt=$(grep '^version_kpt = ' docs/config.toml | cut -d'"' -f2)
46+
echo "kpt version (config): $config_kpt"
47+
48+
config_kind=$(grep '^version_kind = ' docs/config.toml | cut -d'"' -f2)
49+
echo "kind version (config): $config_kind"
50+
51+
config_kube=$(grep '^version_kube = ' docs/config.toml | cut -d'"' -f2)
52+
echo "Kubernetes version (config): $config_kube"
53+
54+
echo ""
55+
echo "=== Consistency Check ==="
56+
57+
errors=0
58+
59+
# Go version check (CRITICAL - we control this in go.mod)
60+
if [ "$go_version" != "$config_go" ]; then
61+
echo "FAIL: Go version mismatch - source: $go_version, config: $config_go"
62+
errors=$((errors + 1))
63+
else
64+
echo "✓ Go version matches: $go_version"
65+
fi
66+
67+
# kpt version check (CRITICAL - core dependency in go.mod)
68+
if [ "$kpt_version" != "v$config_kpt" ]; then
69+
echo "FAIL: kpt version mismatch - source: $kpt_version, config: v$config_kpt"
70+
errors=$((errors + 1))
71+
else
72+
echo "✓ kpt version matches: $kpt_version"
73+
fi
74+
75+
# kind version check (WARNING - test environment, controls k8s version)
76+
if [ "$kind_version" != "v$config_kind" ]; then
77+
echo "WARN: kind version mismatch - source: $kind_version, config: v$config_kind"
78+
echo " Consider updating docs/config.toml to match the test environment"
79+
else
80+
echo "✓ kind version matches: $kind_version"
81+
fi
82+
83+
echo "ℹ Kubernetes version (from config): v$config_kube (derived from kind)"
84+
85+
echo ""
86+
if [ "$errors" -gt 0 ]; then
87+
echo "FAILED: $errors critical version mismatch(es) detected."
88+
echo ""
89+
echo "To fix, update docs/config.toml:"
90+
if [ "$go_version" != "$config_go" ]; then
91+
echo " version_go = \"$go_version\""
92+
fi
93+
if [ "$kpt_version" != "v$config_kpt" ]; then
94+
echo " version_kpt = \"${kpt_version#v}\""
95+
fi
96+
exit 1
97+
fi
98+
99+
echo "SUCCESS: Critical versions are aligned with code."
100+
exit 0

0 commit comments

Comments
 (0)