Skip to content

Commit 88350d4

Browse files
committed
ci: Add version consistency check workflow
- Create GitHub Actions workflow to validate version consistency - Check version numbers across all configuration files: - include/ccap_config.h (source of truth) - ccap.podspec (iOS/macOS package manager) - conanfile.py (C++ package manager) - BUILD_AND_INSTALL.md (documentation) - Fail build if versions don't match - Auto-comment on PRs with fix suggestions - Generate detailed consistency report - Triggers on version-related file changes in PR or push
1 parent 49b2928 commit 88350d4

1 file changed

Lines changed: 231 additions & 0 deletions

File tree

Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
name: Check Version Consistency
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
- develop
8+
- version_manage
9+
paths:
10+
- 'include/ccap_config.h'
11+
- 'ccap.podspec'
12+
- 'conanfile.py'
13+
- 'BUILD_AND_INSTALL.md'
14+
- '.github/workflows/check-version.yml'
15+
16+
pull_request:
17+
branches:
18+
- main
19+
- develop
20+
paths:
21+
- 'include/ccap_config.h'
22+
- 'ccap.podspec'
23+
- 'conanfile.py'
24+
- 'BUILD_AND_INSTALL.md'
25+
26+
jobs:
27+
check-version:
28+
name: Verify Version Consistency
29+
runs-on: ubuntu-latest
30+
31+
steps:
32+
- name: Checkout code
33+
uses: actions/checkout@v4
34+
35+
- name: Extract version from ccap_config.h
36+
id: header_version
37+
shell: bash
38+
run: |
39+
if [ ! -f "include/ccap_config.h" ]; then
40+
echo "❌ include/ccap_config.h not found!"
41+
exit 1
42+
fi
43+
44+
# Extract version numbers from header file
45+
MAJOR=$(grep "#define CCAP_VERSION_MAJOR" include/ccap_config.h | awk '{print $3}')
46+
MINOR=$(grep "#define CCAP_VERSION_MINOR" include/ccap_config.h | awk '{print $3}')
47+
PATCH=$(grep "#define CCAP_VERSION_PATCH" include/ccap_config.h | awk '{print $3}')
48+
VERSION_STRING=$(grep "#define CCAP_VERSION_STRING" include/ccap_config.h | sed 's/.*"\([^"]*\)".*/\1/')
49+
50+
if [ -z "$MAJOR" ] || [ -z "$MINOR" ] || [ -z "$PATCH" ] || [ -z "$VERSION_STRING" ]; then
51+
echo "❌ Could not parse version macros from include/ccap_config.h"
52+
echo "MAJOR=$MAJOR, MINOR=$MINOR, PATCH=$PATCH, VERSION_STRING=$VERSION_STRING"
53+
exit 1
54+
fi
55+
56+
HEADER_VERSION="${MAJOR}.${MINOR}.${PATCH}"
57+
58+
echo "Header version: $HEADER_VERSION"
59+
echo "Version string: $VERSION_STRING"
60+
61+
if [ "$HEADER_VERSION" != "$VERSION_STRING" ]; then
62+
echo "❌ Version mismatch in header file!"
63+
echo "Calculated: $HEADER_VERSION, String: $VERSION_STRING"
64+
exit 1
65+
fi
66+
67+
echo "version=$HEADER_VERSION" >> $GITHUB_OUTPUT
68+
echo "major=$MAJOR" >> $GITHUB_OUTPUT
69+
echo "minor=$MINOR" >> $GITHUB_OUTPUT
70+
echo "patch=$PATCH" >> $GITHUB_OUTPUT
71+
72+
- name: Check ccap.podspec version
73+
id: podspec_version
74+
shell: bash
75+
env:
76+
EXPECTED_VERSION: ${{ steps.header_version.outputs.version }}
77+
run: |
78+
if [ ! -f "ccap.podspec" ]; then
79+
echo "❌ ccap.podspec not found!"
80+
exit 1
81+
fi
82+
83+
PODSPEC_VERSION=$(grep 's.version' ccap.podspec | sed 's/.*"\([^"]*\)".*/\1/')
84+
85+
if [ -z "$PODSPEC_VERSION" ]; then
86+
echo "❌ Could not extract version from ccap.podspec"
87+
exit 1
88+
fi
89+
90+
echo "podspec_version=$PODSPEC_VERSION" >> $GITHUB_OUTPUT
91+
echo "Podspec version: $PODSPEC_VERSION"
92+
93+
if [ "$PODSPEC_VERSION" != "$EXPECTED_VERSION" ]; then
94+
echo "❌ Version mismatch in ccap.podspec!"
95+
echo "Expected: $EXPECTED_VERSION, Found: $PODSPEC_VERSION"
96+
exit 1
97+
fi
98+
99+
echo "✅ Podspec version matches"
100+
101+
- name: Check conanfile.py version
102+
id: conan_version
103+
shell: bash
104+
env:
105+
EXPECTED_VERSION: ${{ steps.header_version.outputs.version }}
106+
run: |
107+
if [ ! -f "conanfile.py" ]; then
108+
echo "❌ conanfile.py not found!"
109+
exit 1
110+
fi
111+
112+
CONAN_VERSION=$(grep 'version = ' conanfile.py | head -1 | sed 's/.*"\([^"]*\)".*/\1/')
113+
114+
if [ -z "$CONAN_VERSION" ]; then
115+
echo "❌ Could not extract version from conanfile.py"
116+
exit 1
117+
fi
118+
119+
echo "conan_version=$CONAN_VERSION" >> $GITHUB_OUTPUT
120+
echo "Conan version: $CONAN_VERSION"
121+
122+
if [ "$CONAN_VERSION" != "$EXPECTED_VERSION" ]; then
123+
echo "❌ Version mismatch in conanfile.py!"
124+
echo "Expected: $EXPECTED_VERSION, Found: $CONAN_VERSION"
125+
exit 1
126+
fi
127+
128+
echo "✅ Conan version matches"
129+
130+
- name: Check BUILD_AND_INSTALL.md version
131+
id: doc_version
132+
shell: bash
133+
env:
134+
EXPECTED_VERSION: ${{ steps.header_version.outputs.version }}
135+
run: |
136+
if [ ! -f "BUILD_AND_INSTALL.md" ]; then
137+
echo "❌ BUILD_AND_INSTALL.md not found!"
138+
exit 1
139+
fi
140+
141+
DOC_VERSION=$(grep 'Current version:' BUILD_AND_INSTALL.md | head -1 | sed 's/.*: \([^ ]*\).*/\1/')
142+
143+
if [ -z "$DOC_VERSION" ]; then
144+
echo "❌ Could not extract version from BUILD_AND_INSTALL.md"
145+
exit 1
146+
fi
147+
148+
echo "doc_version=$DOC_VERSION" >> $GITHUB_OUTPUT
149+
echo "Documentation version: $DOC_VERSION"
150+
151+
if [ "$DOC_VERSION" != "$EXPECTED_VERSION" ]; then
152+
echo "❌ Version mismatch in BUILD_AND_INSTALL.md!"
153+
echo "Expected: $EXPECTED_VERSION, Found: $DOC_VERSION"
154+
exit 1
155+
fi
156+
157+
echo "✅ Documentation version matches"
158+
159+
- name: Check CMakeLists.txt version
160+
id: cmake_version
161+
shell: bash
162+
env:
163+
EXPECTED_VERSION: ${{ steps.header_version.outputs.version }}
164+
run: |
165+
if [ ! -f "CMakeLists.txt" ]; then
166+
echo "❌ CMakeLists.txt not found!"
167+
exit 1
168+
fi
169+
170+
# CMakeLists.txt reads version from header file dynamically,
171+
# so we only need to verify it exists and contains the version reading logic
172+
if ! grep -q "file(READ.*ccap_config.h" CMakeLists.txt; then
173+
echo "⚠️ Warning: CMakeLists.txt does not read version from header file"
174+
else
175+
echo "✅ CMakeLists.txt correctly reads version from header file"
176+
fi
177+
178+
- name: Generate report
179+
if: always()
180+
shell: bash
181+
run: |
182+
echo "## 📋 Version Consistency Check Report" >> $GITHUB_STEP_SUMMARY
183+
echo "" >> $GITHUB_STEP_SUMMARY
184+
echo "### ✅ Extracted Versions" >> $GITHUB_STEP_SUMMARY
185+
echo "" >> $GITHUB_STEP_SUMMARY
186+
echo "| Component | Version |" >> $GITHUB_STEP_SUMMARY
187+
echo "|-----------|---------|" >> $GITHUB_STEP_SUMMARY
188+
echo "| Header (ccap_config.h) | ${{ steps.header_version.outputs.version }} |" >> $GITHUB_STEP_SUMMARY
189+
echo "| Podspec (ccap.podspec) | ${{ steps.podspec_version.outputs.podspec_version }} |" >> $GITHUB_STEP_SUMMARY
190+
echo "| Conan (conanfile.py) | ${{ steps.conan_version.outputs.conan_version }} |" >> $GITHUB_STEP_SUMMARY
191+
echo "| Documentation (BUILD_AND_INSTALL.md) | ${{ steps.doc_version.outputs.doc_version }} |" >> $GITHUB_STEP_SUMMARY
192+
echo "" >> $GITHUB_STEP_SUMMARY
193+
echo "### 🎯 Details" >> $GITHUB_STEP_SUMMARY
194+
echo "" >> $GITHUB_STEP_SUMMARY
195+
echo "**Header Version Breakdown:**" >> $GITHUB_STEP_SUMMARY
196+
echo "- Major: ${{ steps.header_version.outputs.major }}" >> $GITHUB_STEP_SUMMARY
197+
echo "- Minor: ${{ steps.header_version.outputs.minor }}" >> $GITHUB_STEP_SUMMARY
198+
echo "- Patch: ${{ steps.header_version.outputs.patch }}" >> $GITHUB_STEP_SUMMARY
199+
echo "" >> $GITHUB_STEP_SUMMARY
200+
echo "**Single Source of Truth:**" >> $GITHUB_STEP_SUMMARY
201+
echo "All version information is derived from \`include/ccap_config.h\`" >> $GITHUB_STEP_SUMMARY
202+
203+
- name: Post comment on PR
204+
if: failure() && github.event_name == 'pull_request'
205+
uses: actions/github-script@v7
206+
with:
207+
script: |
208+
const fs = require('fs');
209+
github.rest.issues.createComment({
210+
issue_number: context.issue.number,
211+
owner: context.repo.owner,
212+
repo: context.repo.repo,
213+
body: `❌ **Version Consistency Check Failed**
214+
215+
This PR has version inconsistencies. Please ensure all version-related files are synchronized.
216+
217+
**Expected version from \`include/ccap_config.h\`:** \`${{ steps.header_version.outputs.version }}\`
218+
219+
**Files to check:**
220+
- ✅/❌ \`ccap.podspec\` - Expected version: \`${{ steps.header_version.outputs.version }}\`
221+
- ✅/❌ \`conanfile.py\` - Expected version: \`${{ steps.header_version.outputs.version }}\`
222+
- ✅/❌ \`BUILD_AND_INSTALL.md\` - Expected version: \`${{ steps.header_version.outputs.version }}\`
223+
224+
**To fix this:**
225+
Use the version update script:
226+
\`\`\`bash
227+
./scripts/update_version.sh ${{ steps.header_version.outputs.version }}
228+
\`\`\`
229+
230+
Or manually update each file to match the version in \`include/ccap_config.h\`.`
231+
});

0 commit comments

Comments
 (0)