Skip to content

Commit 198e172

Browse files
committed
feat(ci): enhance CI workflows to detect and publish event schemas package version changes
1 parent 7ba581a commit 198e172

17 files changed

Lines changed: 188 additions & 688 deletions

.github/workflows/cicd-1-pull-request.yaml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ jobs:
2626
build_timestamp: ${{ steps.variables.outputs.build_timestamp }}
2727
build_epoch: ${{ steps.variables.outputs.build_epoch }}
2828
nodejs_version: ${{ steps.variables.outputs.nodejs_version }}
29+
pnpm_version: ${{ steps.variables.outputs.pnpm_version }}
2930
python_version: ${{ steps.variables.outputs.python_version }}
3031
terraform_version: ${{ steps.variables.outputs.terraform_version }}
3132
version: ${{ steps.variables.outputs.version }}
@@ -46,6 +47,7 @@ jobs:
4647
echo "build_timestamp=$(date --date=$datetime -u +'%Y%m%d%H%M%S')" >> $GITHUB_OUTPUT
4748
echo "build_epoch=$(date --date=$datetime -u +'%s')" >> $GITHUB_OUTPUT
4849
echo "nodejs_version=$(grep "^nodejs\s" .tool-versions | cut -f2 -d' ')" >> $GITHUB_OUTPUT
50+
echo "pnpm_version=$(grep "^pnpm\s" .tool-versions | cut -f2 -d' ')" >> $GITHUB_OUTPUT
4951
echo "python_version=$(grep "^python\s" .tool-versions | cut -f2 -d' ')" >> $GITHUB_OUTPUT
5052
echo "terraform_version=$(grep "^terraform\s" .tool-versions | cut -f2 -d' ')" >> $GITHUB_OUTPUT
5153
echo "version=$(echo $version)" >> $GITHUB_OUTPUT
@@ -79,6 +81,7 @@ jobs:
7981
export BUILD_EPOCH="${{ steps.variables.outputs.build_epoch }}"
8082
export NODEJS_VERSION="${{ steps.variables.outputs.nodejs_version }}"
8183
export PYTHON_VERSION="${{ steps.variables.outputs.python_version }}"
84+
export PNPM_VERSION="${{ steps.variables.outputs.pnpm_version }}"
8285
export TERRAFORM_VERSION="${{ steps.variables.outputs.terraform_version }}"
8386
export VERSION="${{ steps.variables.outputs.version }}"
8487
export DOES_PULL_REQUEST_EXIST="${{ steps.pr_exists.outputs.does_pull_request_exist }}"
@@ -93,6 +96,7 @@ jobs:
9396
build_timestamp: "${{ needs.metadata.outputs.build_timestamp }}"
9497
build_epoch: "${{ needs.metadata.outputs.build_epoch }}"
9598
nodejs_version: "${{ needs.metadata.outputs.nodejs_version }}"
99+
pnpm_version: "${{ needs.metadata.outputs.pnpm_version }}"
96100
python_version: "${{ needs.metadata.outputs.python_version }}"
97101
terraform_version: "${{ needs.metadata.outputs.terraform_version }}"
98102
version: "${{ needs.metadata.outputs.version }}"
@@ -106,6 +110,7 @@ jobs:
106110
build_timestamp: "${{ needs.metadata.outputs.build_timestamp }}"
107111
build_epoch: "${{ needs.metadata.outputs.build_epoch }}"
108112
nodejs_version: "${{ needs.metadata.outputs.nodejs_version }}"
113+
pnpm_version: "${{ needs.metadata.outputs.pnpm_version }}"
109114
python_version: "${{ needs.metadata.outputs.python_version }}"
110115
terraform_version: "${{ needs.metadata.outputs.terraform_version }}"
111116
version: "${{ needs.metadata.outputs.version }}"
@@ -120,6 +125,7 @@ jobs:
120125
build_timestamp: "${{ needs.metadata.outputs.build_timestamp }}"
121126
build_epoch: "${{ needs.metadata.outputs.build_epoch }}"
122127
nodejs_version: "${{ needs.metadata.outputs.nodejs_version }}"
128+
pnpm_version: "${{ needs.metadata.outputs.pnpm_version }}"
123129
python_version: "${{ needs.metadata.outputs.python_version }}"
124130
terraform_version: "${{ needs.metadata.outputs.terraform_version }}"
125131
version: "${{ needs.metadata.outputs.version }}"
@@ -134,8 +140,8 @@ jobs:
134140
build_timestamp: "${{ needs.metadata.outputs.build_timestamp }}"
135141
build_epoch: "${{ needs.metadata.outputs.build_epoch }}"
136142
nodejs_version: "${{ needs.metadata.outputs.nodejs_version }}"
143+
pnpm_version: "${{ needs.metadata.outputs.pnpm_version }}"
137144
python_version: "${{ needs.metadata.outputs.python_version }}"
138145
terraform_version: "${{ needs.metadata.outputs.terraform_version }}"
139146
version: "${{ needs.metadata.outputs.version }}"
140-
pr_number: ${{ needs.metadata.outputs.pr_number }}
141147
secrets: inherit

.github/workflows/pr_closed.yaml

Lines changed: 81 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
outputs:
2222
deploy: ${{ steps.check.outputs.deploy }}
2323
steps:
24-
- name: Check if PR was merged or wor§kflow is triggered by workflow_dispatch
24+
- name: Check if PR was merged or workflow is triggered by workflow_dispatch
2525
id: check
2626
run: |
2727
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
@@ -35,6 +35,44 @@ jobs:
3535
echo "Job not triggered by workflow_dispatch or Merged PR - Skipping 'deploy-main'"
3636
fi
3737
38+
check-event-schemas-version-change:
39+
name: Check for event schemas package version change
40+
needs: check-merge-or-workflow-dispatch
41+
if: needs.check-merge-or-workflow-dispatch.outputs.deploy == 'true'
42+
outputs:
43+
version_changed: ${{ steps.check-version.outputs.version_changed }}
44+
runs-on: ubuntu-latest
45+
permissions:
46+
contents: read
47+
packages: read
48+
steps:
49+
- name: Checkout code
50+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
51+
52+
- name: Setup Node.js
53+
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
54+
with:
55+
node-version-file: ".tool-versions"
56+
57+
- name: Check if local version differs from latest published version
58+
id: check-version
59+
env:
60+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
61+
run: |
62+
published_version=$(npm view @nhsdigital/nhs-notify-events-client-config --registry=https://npm.pkg.github.com --json 2>/dev/null | jq -r '.["dist-tags"].latest // "null"')
63+
echo "Published version: $published_version"
64+
65+
local_version=$(jq -r '.version' packages/events/package.json)
66+
echo "Local version: $local_version"
67+
68+
if [[ $local_version = $published_version ]]; then
69+
echo "Local version is the same as the latest published version - skipping publish"
70+
echo "version_changed=false" >> $GITHUB_OUTPUT
71+
else
72+
echo "Local version is different to the latest published version - publishing new version"
73+
echo "version_changed=true" >> $GITHUB_OUTPUT
74+
fi
75+
3876
deploy-main:
3977
needs: check-merge-or-workflow-dispatch
4078
name: Deploy changes to main in dev AWS account
@@ -61,3 +99,45 @@ jobs:
6199
--targetAccountGroup "nhs-notify-client-config-dev" \
62100
--targetComponent "${{ matrix.component }}" \
63101
--terraformAction "apply"
102+
103+
publish-event-schemas:
104+
name: Publish event schemas package to GitHub package registry
105+
needs:
106+
- check-event-schemas-version-change
107+
if: needs.check-event-schemas-version-change.outputs.version_changed == 'true'
108+
runs-on: ubuntu-latest
109+
permissions:
110+
contents: read
111+
packages: write
112+
steps:
113+
- name: Checkout code
114+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
115+
116+
- name: Detect pnpm version
117+
id: pnpm-version
118+
run: |
119+
echo "version=$(grep '^pnpm ' .tool-versions | cut -d' ' -f2)" >> $GITHUB_OUTPUT
120+
121+
- name: Setup pnpm
122+
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
123+
with:
124+
version: ${{ steps.pnpm-version.outputs.version }}
125+
cache: true
126+
127+
- name: Setup Node.js
128+
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
129+
with:
130+
node-version-file: ".tool-versions"
131+
cache: "pnpm"
132+
133+
- name: Install dependencies
134+
env:
135+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
136+
run: pnpm install --frozen-lockfile
137+
138+
- name: Publish to GitHub Packages
139+
env:
140+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
141+
run: |
142+
cd packages/events
143+
npm publish --registry=https://npm.pkg.github.com

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

Lines changed: 43 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -247,11 +247,15 @@ jobs:
247247
run: |
248248
git fetch origin main
249249
250-
if git diff --quiet origin/main...HEAD -- packages/events; then
250+
changed_files=$(git diff --name-only origin/main...HEAD -- packages/events)
251+
non_test_changes=$(printf '%s\n' "$changed_files" | grep -Ev '(^|/)(__tests__|tests)(/|$)' || true)
252+
253+
if [[ -z "$non_test_changes" ]]; then
251254
echo "No changes in event schemas package"
252255
echo "changed=false" >> $GITHUB_OUTPUT
253256
else
254257
echo "Changes detected in event schemas"
258+
echo "$non_test_changes"
255259
echo "changed=true" >> $GITHUB_OUTPUT
256260
fi
257261
@@ -264,56 +268,66 @@ jobs:
264268
echo "Detected package version $version in main branch"
265269
echo "main_version=$version" >> $GITHUB_OUTPUT
266270
267-
check-schemas-generated:
268-
name: Check event schemas have been regenerated
271+
check-schema-version-change:
272+
name: Check event schema version has been updated
269273
needs: detect-event-schema-package-changes
270274
if: needs.detect-event-schema-package-changes.outputs.changed == 'true'
271275
runs-on: ubuntu-latest
272276
permissions:
273277
contents: read
274278
steps:
275-
- name: "Checkout code"
279+
- name: Checkout code
276280
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
277-
- name: "Setup pnpm"
278-
uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0
279-
with:
280-
version: "${{ inputs.pnpm_version }}"
281-
cache: true
282-
- name: "Use Node.js"
283-
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
284-
with:
285-
node-version-file: '.tool-versions'
286-
cache: 'pnpm'
287-
288-
- name: "Re-generate schemas"
281+
- name: Check schema versions
289282
run: |
290-
pnpm install --frozen-lockfile
291-
pnpm --filter @nhsdigital/nhs-notify-events-client-config run gen:jsonschema
283+
source scripts/is_valid_increment.sh
292284
293-
- name: Check for schema changes
294-
run: git diff --quiet packages/events/schemas
285+
main_version="${{ needs.detect-event-schema-package-changes.outputs.main_version }}"
286+
echo "Main version: ${{ needs.detect-event-schema-package-changes.outputs.main_version }}"
295287
296-
check-schema-version-change:
297-
name: Check event schema version has been updated
288+
local_version=$(jq -r '.version' packages/events/package.json)
289+
echo "Local version: $local_version"
290+
291+
if ! is_valid_increment "$main_version" "$local_version" ; then
292+
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)."
293+
exit 1
294+
fi
295+
296+
check-event-schemas-version-change:
297+
name: Check for event schemas package version change
298298
needs: detect-event-schema-package-changes
299299
if: needs.detect-event-schema-package-changes.outputs.changed == 'true'
300+
outputs:
301+
version_changed: ${{ steps.check-version.outputs.version_changed }}
300302
runs-on: ubuntu-latest
301303
permissions:
302304
contents: read
305+
packages: read
303306
steps:
304307
- name: Checkout code
305308
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
306-
- name: Check schema versions
307-
run: |
308-
source scripts/is_valid_increment.sh
309309

310-
main_version="${{ needs.detect-event-schema-package-changes.outputs.main_version }}"
311-
echo "Main version: ${{ needs.detect-event-schema-package-changes.outputs.main_version }}"
310+
- name: Setup NodeJS
311+
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
312+
with:
313+
node-version: "${{ inputs.nodejs_version }}"
314+
315+
- name: Check if local version differs from latest published version
316+
id: check-version
317+
env:
318+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
319+
run: |
320+
published_version=$(npm view @nhsdigital/nhs-notify-events-client-config --registry=https://npm.pkg.github.com --json 2>/dev/null | jq -r '.["dist-tags"].latest // "null"')
321+
echo "Published version: $published_version"
312322
313323
local_version=$(jq -r '.version' packages/events/package.json)
314324
echo "Local version: $local_version"
315325
316-
if ! is_valid_increment "$main_version" "$local_version" ; then
317-
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)."
326+
if [[ $local_version = $published_version ]]; then
327+
echo "ERROR: Local version is the same as the latest published version, but event schemas have changed"
328+
echo "version_changed=false" >> $GITHUB_OUTPUT
318329
exit 1
330+
else
331+
echo "Local version is different to the latest published version - a new version will be published"
332+
echo "version_changed=true" >> $GITHUB_OUTPUT
319333
fi

packages/event-builder/jest.config.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ const config: Config = {
1010
],
1111
moduleFileExtensions: ["ts", "js", "json", "node"],
1212
moduleNameMapper: {
13-
"^@nhsdigital/nhs-notify-events-client-config/src/(.*)$":
14-
"<rootDir>/../../packages/events/src/$1",
1513
"^@nhsdigital/nhs-notify-events-client-config$":
1614
"<rootDir>/../../packages/events/src",
1715
"^@nhsdigital/nhs-notify-events-client-config/package.json$":

packages/event-builder/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"build": "tsc --noEmit",
2323
"lint": "eslint .",
2424
"lint:fix": "eslint . --fix",
25+
"pretypecheck": "pnpm --filter @nhsdigital/nhs-notify-events-client-config run build",
2526
"test": "jest",
2627
"test:unit": "jest",
2728
"typecheck": "tsc --noEmit"

packages/event-builder/src/__tests__/build-campaign-published-event.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {
22
$CampaignIntEvent,
33
$CampaignProdEvent,
4-
} from "@nhsdigital/nhs-notify-events-client-config/src/events/campaign-published-event";
4+
} from "@nhsdigital/nhs-notify-events-client-config";
55
import buildCampaignEvent from "../campaign-event-builder";
66

77
describe("buildCampaignEvent", () => {

packages/event-builder/src/__tests__/build-client-published-event.spec.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {
22
$ClientIntEvent,
33
$ClientProdEvent,
4-
} from "@nhsdigital/nhs-notify-events-client-config/src/events/client-published-event";
4+
} from "@nhsdigital/nhs-notify-events-client-config";
55
import schemaPackage from "@nhsdigital/nhs-notify-events-client-config/package.json";
66
import { buildClientEvent } from "../event-builder";
77

@@ -59,11 +59,13 @@ describe("buildClientEvent", () => {
5959
const intEvent = events[0];
6060
expect(
6161
intEvent.data.messageRequestsApimApplications?.every(
62-
(a) => a.environment === "INT",
62+
(a: { environment: "INT" | "PROD" }) => a.environment === "INT",
6363
),
6464
).toBe(true);
6565
expect(
66-
intEvent.data.clientSubscriptions?.every((s) => s.environment === "INT"),
66+
intEvent.data.clientSubscriptions?.every(
67+
(s: { environment: "INT" | "PROD" }) => s.environment === "INT",
68+
),
6769
).toBe(true);
6870
});
6971

packages/event-builder/src/campaign-event-builder.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ import {
22
$CampaignDisabledEvent,
33
$CampaignIntEvent,
44
$CampaignProdEvent,
5-
CampaignEvent,
6-
} from "@nhsdigital/nhs-notify-events-client-config/src/events/campaign-published-event";
7-
import {
85
$Campaign,
6+
CampaignEvent,
97
Campaign,
10-
} from "@nhsdigital/nhs-notify-events-client-config/src/domain";
8+
} from "@nhsdigital/nhs-notify-events-client-config";
119
import {
1210
buildEnvelope,
1311
filterScoped,

packages/event-builder/src/event-builder-common.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { randomUUID } from "node:crypto";
2-
import { Environment } from "@nhsdigital/nhs-notify-events-client-config/src/domain/common";
32
import schemaPackage from "@nhsdigital/nhs-notify-events-client-config/package.json";
43

4+
type Environment = "INT" | "PROD";
5+
56
export const eventSource =
67
"//notify.nhs.uk/app/nhs-notify-client-config-dev/main";
78
export const schemaVersion = schemaPackage.version;

packages/event-builder/src/event-builder.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import {
2+
$Client,
23
$ClientDisabledEvent,
34
$ClientIntEvent,
45
$ClientProdEvent,
5-
ClientEvent,
6-
} from "@nhsdigital/nhs-notify-events-client-config/src/events/client-published-event";
7-
import {
8-
$Client,
96
Client,
10-
} from "@nhsdigital/nhs-notify-events-client-config/src/domain";
7+
ClientEvent,
8+
} from "@nhsdigital/nhs-notify-events-client-config";
119
import {
1210
buildEnvelope,
1311
filterScoped,

0 commit comments

Comments
 (0)