Skip to content

Commit 1660e6a

Browse files
CCM-11027: enforce correct versioning of event schemas (#624)
Co-authored-by: Chris Elliott <[email protected]>
1 parent eff90d4 commit 1660e6a

File tree

3 files changed

+117
-2
lines changed

3 files changed

+117
-2
lines changed

.github/workflows/pr_closed.yaml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,12 @@ jobs:
7878
- name: check if local version differs from latest published version
7979
id: check-version
8080
run: |
81-
published_version=$(npm view @nhsdigital/nhs-notify-event-schemas-template-management --json 2>/dev/null | jq -r '.["dist-tags"].latest')
82-
local_version=$(cat packages/event-schemas/package.json | jq -r '.version')
81+
published_version=$(npm view @nhsdigital/nhs-notify-event-schemas-template-management --json 2>/dev/null | jq -r '.["dist-tags"].latest // "null"')
82+
echo "Published version: $published_version"
83+
84+
local_version=$(jq -r '.version' packages/event-schemas/package.json)
85+
echo "Local version: $local_version"
86+
8387
if [[ $local_version = $published_version ]]; then
8488
echo "Local version is the same as the latest published version - skipping publish"
8589
echo "version_changed=false" >> $GITHUB_OUTPUT

.github/workflows/stage-1-commit.yaml

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,3 +199,86 @@ jobs:
199199
idp_aws_report_upload_region: "${{ secrets.IDP_AWS_REPORT_UPLOAD_REGION }}"
200200
idp_aws_report_upload_role_name: "${{ secrets.IDP_AWS_REPORT_UPLOAD_ROLE_NAME }}"
201201
idp_aws_report_upload_bucket_endpoint: "${{ secrets.IDP_AWS_REPORT_UPLOAD_BUCKET_ENDPOINT }}"
202+
203+
detect-event-schema-package-changes:
204+
name: "Check for changes to event schema package compared to main branch"
205+
runs-on: ubuntu-latest
206+
permissions:
207+
contents: read
208+
outputs:
209+
changed: ${{ steps.check.outputs.changed }}
210+
main_version: ${{ steps.check.outputs.main_version }}
211+
212+
steps:
213+
- name: "Checkout code"
214+
uses: actions/checkout@v4
215+
with:
216+
fetch-depth: 0
217+
218+
- name: Detect package changes and current version
219+
id: check
220+
run: |
221+
git fetch origin main
222+
223+
if git diff --quiet origin/main...HEAD -- packages/event-schemas; then
224+
echo "No changes in event schemas package"
225+
echo "changed=false" >> $GITHUB_OUTPUT
226+
else
227+
echo "Changes detected in event schemas"
228+
echo "changed=true" >> $GITHUB_OUTPUT
229+
fi
230+
231+
if content=$(git show origin/main:packages/event-schemas/package.json 2>/dev/null); then
232+
version=$(jq -r .version <<< $content);
233+
else
234+
version=null;
235+
fi
236+
237+
echo "Detected package version $version in main branch"
238+
echo "main_version=$version" >> $GITHUB_OUTPUT
239+
240+
check-schemas-generated:
241+
name: Check event schemas have been regenerated
242+
needs: detect-event-schema-package-changes
243+
if: needs.detect-event-schema-package-changes.outputs.changed == 'true'
244+
runs-on: ubuntu-latest
245+
permissions:
246+
contents: read
247+
steps:
248+
- name: "Checkout code"
249+
uses: actions/checkout@v4
250+
251+
- name: Install dependencies
252+
run: npm ci
253+
254+
- name: Re-generate schemas
255+
run: npm --workspace packages/event-schemas run generate-json-schemas
256+
257+
- name: Check for schema changes
258+
run: git diff --quiet packages/event-schemas/schemas
259+
260+
check-schema-version-change:
261+
name: Check event schema version has been updated
262+
needs: detect-event-schema-package-changes
263+
if: needs.detect-event-schema-package-changes.outputs.changed == 'true'
264+
runs-on: ubuntu-latest
265+
permissions:
266+
contents: read
267+
steps:
268+
- name: Checkout code
269+
uses: actions/checkout@v4
270+
271+
- name: Check schema versions
272+
run: |
273+
source scripts/is_valid_increment.sh
274+
275+
main_version="${{ needs.detect-event-schema-package-changes.outputs.main_version }}"
276+
echo "Main version: ${{ needs.detect-event-schema-package-changes.outputs.main_version }}"
277+
278+
local_version=$(jq -r '.version' packages/event-schemas/package.json)
279+
echo "Local version: $local_version"
280+
281+
if ! is_valid_increment "$main_version" "$local_version" ; then
282+
echo "Error: Event Schema package has changed, but new version ($local_version) is not a valid increment from latest version on main branch ($main_version)."
283+
exit 1
284+
fi

scripts/is_valid_increment.sh

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/usr/bin/bash
2+
# Determines whether a version increment to a package is valid
3+
4+
is_valid_increment() {
5+
local current="$1"
6+
local next="$2"
7+
8+
if [[ "$current" == "null" ]]; then
9+
if [[ "$next" == "1.0.0" ]]; then
10+
return 0 # valid initial version
11+
else
12+
return 1 # invalid first version
13+
fi
14+
fi
15+
16+
IFS='.' read -r curr_major curr_minor curr_patch <<< "$current"
17+
IFS='.' read -r new_major new_minor new_patch <<< "$next"
18+
19+
if (( new_major == curr_major && new_minor == curr_minor && new_patch == curr_patch + 1 )); then
20+
return 0 # valid patch bump
21+
elif (( new_major == curr_major && new_minor == curr_minor + 1 && new_patch == 0 )); then
22+
return 0 # valid minor bump
23+
elif (( new_major == curr_major + 1 && new_minor == 0 && new_patch == 0 )); then
24+
return 0 # valid major bump
25+
else
26+
return 1 # invalid or skipped
27+
fi
28+
}

0 commit comments

Comments
 (0)