Skip to content

Commit d714e3a

Browse files
Update: [AEA-5753] - path to live pipeline (#130)
Routine Change 🤖 Operational or Infrastructure Change https://nhsd-jira.digital.nhs.uk/browse/AEA-5753 This pull request implements a release pipeline for eps-assist-me that aligns with our existing release process **Pipeline Flow:** - PR merge to main → automatic DEV deployment - Manual approval gates for QA, INT, and PROD environments - INT and PROD deploy in parallel with identical code **Key changes:** - Added `deploy-dev-auto.yml` for automatic DEV deployments - Added `release.yml` for manual promotions with approval gates - Fixed poetry export validation to prevent Dependabot-induced deployment failures - Updated shellcheck version for pre-commit compatibility
1 parent 271a959 commit d714e3a

File tree

8 files changed

+617
-417
lines changed

8 files changed

+617
-417
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#!/usr/bin/env bash
2+
3+
cat <<EOF > payload.json
4+
{
5+
"currentTag": "$CURRENT_DEPLOYED_TAG",
6+
"targetTag": "$RELEASE_TAG",
7+
"repoName": "eps-assist-me",
8+
"targetEnvironment": "INT",
9+
"productName": "EPS Assist Me",
10+
"releaseNotesPageId": "$PAGE_ID",
11+
"releaseNotesPageTitle": "EPS-Assist-Me-$RELEASE_TAG - Deployed to [INT] on $(date +'%d-%m-%y')",
12+
"createReleaseCandidate": "true",
13+
"releasePrefix": "EPS-Assist-Me-"
14+
}
15+
EOF
16+
cat payload.json
17+
18+
function_arn=$(aws cloudformation list-exports --query "Exports[?Name=='release-notes:CreateReleaseNotesLambdaArn'].Value" --output text)
19+
aws lambda invoke --function-name "${function_arn}" --cli-binary-format raw-in-base64-out --payload file://payload.json out.txt
20+
cat out.txt

.github/workflows/cdk_package_code.yml

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ jobs:
3030
id: asdf-version
3131
run: echo "version=$(awk '!/^#/ && NF {print $1; exit}' .tool-versions.asdf)" >> "$GITHUB_OUTPUT"
3232

33+
# using git commit sha for version of action to ensure we have stable version
34+
- name: Get asdf version
35+
id: asdf-version
36+
run: echo "version=0.18.0" >> "$GITHUB_OUTPUT"
37+
3338
# using git commit sha for version of action to ensure we have stable version
3439
- name: Install asdf
3540
uses: asdf-vm/actions/setup@1902764435ca0dd2f3388eea723a4f92a4eb8302
@@ -41,9 +46,9 @@ jobs:
4146
with:
4247
path: |
4348
~/.asdf
44-
key: ${{ runner.os }}-asdf-${{ hashFiles('**/.tool-versions') }}
49+
key: ${{ runner.os }}-asdf-${{ hashFiles('**/.tool-versions') }}-${{ steps.asdf-version.outputs.version }}
4550
restore-keys: |
46-
${{ runner.os }}-asdf-
51+
${{ runner.os }}-asdf-${{ hashFiles('**/.tool-versions') }}-${{ steps.asdf-version.outputs.version }}
4752
4853
- name: Install asdf dependencies in .tool-versions
4954
uses: asdf-vm/actions/install@1902764435ca0dd2f3388eea723a4f92a4eb8302
@@ -62,11 +67,20 @@ jobs:
6267
- name: make install
6368
run: |
6469
make install
70+
make compile-node
6571
6672
- name: Build Python Lambda Functions
6773
run: |
6874
poetry export --without-hashes --format=requirements.txt --with slackBotFunction > requirements_slackBotFunction
6975
poetry export --without-hashes --format=requirements.txt --with syncKnowledgeBaseFunction > requirements_syncKnowledgeBaseFunction
76+
if [ ! -s requirements_slackBotFunction ]; then \
77+
echo "Error: requirements_slackBotFunction is empty or missing"; \
78+
exit 1; \
79+
fi
80+
if [ ! -s requirements_syncKnowledgeBaseFunction ]; then \
81+
echo "Error: requirements_syncKnowledgeBaseFunction is empty or missing"; \
82+
exit 1; \
83+
fi
7084
pip3 install -r requirements_slackBotFunction -t .dependencies/slackBotFunction/python
7185
pip3 install -r requirements_syncKnowledgeBaseFunction -t .dependencies/syncKnowledgeBaseFunction/python
7286
@@ -79,10 +93,11 @@ jobs:
7993
package.json \
8094
package-lock.json \
8195
tsconfig.defaults.json \
96+
Makefile \
8297
cdk.json \
8398
.dependencies
8499
85-
- uses: actions/upload-artifact@v4
100+
- uses: actions/upload-artifact@v5
86101
name: upload build artifact
87102
with:
88103
name: build_artifact

.github/workflows/ci.yml

Lines changed: 53 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,6 @@ env:
88
BRANCH_NAME: ${{ github.event.ref.BRANCH_NAME }}
99

1010
jobs:
11-
quality_checks:
12-
uses: NHSDigital/eps-workflow-quality-checks/.github/workflows/[email protected]
13-
secrets:
14-
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
15-
16-
get_commit_id:
17-
runs-on: ubuntu-22.04
18-
outputs:
19-
commit_id: ${{ steps.commit_id.outputs.commit_id }}
20-
steps:
21-
- name: Get Commit ID
22-
id: commit_id
23-
run: |
24-
echo "commit_id=${{ github.sha }}" >> "$GITHUB_OUTPUT"
25-
2611
get_asdf_version:
2712
runs-on: ubuntu-22.04
2813
outputs:
@@ -35,15 +20,31 @@ jobs:
3520
- name: Get asdf version
3621
id: asdf-version
3722
run: echo "version=$(awk '!/^#/ && NF {print $1; exit}' .tool-versions.asdf)" >> "$GITHUB_OUTPUT"
23+
3824
- name: Load config value
3925
id: load-config
4026
run: |
4127
TAG_FORMAT=$(yq '.TAG_FORMAT' .github/config/settings.yml)
4228
echo "TAG_FORMAT=$TAG_FORMAT" >> "$GITHUB_OUTPUT"
4329
30+
quality_checks:
31+
uses: NHSDigital/eps-workflow-quality-checks/.github/workflows/[email protected]
32+
secrets:
33+
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
34+
35+
get_commit_id:
36+
runs-on: ubuntu-22.04
37+
outputs:
38+
commit_id: ${{ steps.commit_id.outputs.commit_id }}
39+
steps:
40+
- name: Get Commit ID
41+
id: commit_id
42+
run: |
43+
echo "commit_id=${{ github.sha }}" >> "$GITHUB_OUTPUT"
44+
4445
tag_release:
4546
needs: [quality_checks, get_commit_id, get_asdf_version]
46-
uses: NHSDigital/eps-workflow-semantic-release/.github/workflows/tag-release.yml@f80157cecce288dd175e61b477a1d2dbe9c88b99
47+
uses: NHSDigital/eps-workflow-semantic-release/.github/workflows/tag-release.yml@361957c147279f5f0f68b64fde9927833363d5f7
4748
with:
4849
dry_run: true
4950
asdfVersion: ${{ needs.get_asdf_version.outputs.asdf_version }}
@@ -62,7 +63,7 @@ jobs:
6263

6364
release_dev:
6465
needs: [get_commit_id, tag_release, package_code]
65-
uses: ./.github/workflows/cdk_release_code.yml
66+
uses: ./.github/workflows/release_all_stacks.yml
6667
with:
6768
STACK_NAME: epsam
6869
TARGET_ENVIRONMENT: dev
@@ -71,13 +72,47 @@ jobs:
7172
CDK_APP_NAME: EpsAssistMeApp
7273
DEPLOY_CODE: true
7374
LOG_RETENTION_IN_DAYS: 30
74-
LOG_LEVEL: DEBUG
75+
LOG_LEVEL: "DEBUG"
76+
CREATE_INT_RELEASE_NOTES: false
77+
CREATE_PROD_RELEASE_NOTES: false
7578
MARK_JIRA_RELEASED: false
79+
CREATE_INT_RC_RELEASE_NOTES: false
80+
IS_PULL_REQUEST: false
7681
secrets:
7782
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_DEPLOY_ROLE }}
7883
CDK_PULL_IMAGE_ROLE: ${{ secrets.DEV_CDK_PULL_IMAGE_ROLE }}
84+
DEV_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
85+
INT_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.INT_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
86+
PROD_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.PROD_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
87+
DEV_CLOUD_FORMATION_EXECUTE_LAMBDA_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_EXECUTE_LAMBDA_ROLE }}
7988
REGRESSION_TESTS_PEM: ${{ secrets.REGRESSION_TESTS_PEM }}
89+
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
90+
SLACK_SIGNING_SECRET: ${{ secrets.SLACK_SIGNING_SECRET }}
91+
92+
release_qa:
93+
needs: [get_commit_id, tag_release, package_code, release_dev]
94+
uses: ./.github/workflows/release_all_stacks.yml
95+
with:
96+
STACK_NAME: epsam
97+
TARGET_ENVIRONMENT: qa
98+
VERSION_NUMBER: ${{ needs.tag_release.outputs.version_tag }}
99+
COMMIT_ID: ${{ needs.get_commit_id.outputs.commit_id }}
100+
CDK_APP_NAME: EpsAssistMeApp
101+
DEPLOY_CODE: true
102+
LOG_RETENTION_IN_DAYS: 30
103+
LOG_LEVEL: "DEBUG"
104+
CREATE_INT_RELEASE_NOTES: true
105+
CREATE_PROD_RELEASE_NOTES: true
106+
MARK_JIRA_RELEASED: false
107+
CREATE_INT_RC_RELEASE_NOTES: false
108+
IS_PULL_REQUEST: false
109+
secrets:
110+
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.QA_CLOUD_FORMATION_DEPLOY_ROLE }}
111+
CDK_PULL_IMAGE_ROLE: ${{ secrets.QA_CDK_PULL_IMAGE_ROLE }}
80112
DEV_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
113+
INT_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.INT_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
114+
PROD_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.PROD_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
81115
DEV_CLOUD_FORMATION_EXECUTE_LAMBDA_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_EXECUTE_LAMBDA_ROLE }}
116+
REGRESSION_TESTS_PEM: ${{ secrets.REGRESSION_TESTS_PEM }}
82117
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
83118
SLACK_SIGNING_SECRET: ${{ secrets.SLACK_SIGNING_SECRET }}

.github/workflows/pull_request.yml

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,24 @@ env:
88
BRANCH_NAME: ${{ github.event.pull_request.head.ref }}
99

1010
jobs:
11+
get_asdf_version:
12+
runs-on: ubuntu-22.04
13+
outputs:
14+
asdf_version: ${{ steps.asdf-version.outputs.version }}
15+
tag_format: ${{ steps.load-config.outputs.TAG_FORMAT }}
16+
steps:
17+
- name: Checkout code
18+
uses: actions/checkout@v5
19+
20+
- name: Get asdf version
21+
id: asdf-version
22+
run: echo "version=$(awk '!/^#/ && NF {print $1; exit}' .tool-versions.asdf)" >> "$GITHUB_OUTPUT"
23+
- name: Load config value
24+
id: load-config
25+
run: |
26+
TAG_FORMAT=$(yq '.TAG_FORMAT' .github/config/settings.yml)
27+
echo "TAG_FORMAT=$TAG_FORMAT" >> "$GITHUB_OUTPUT"
28+
1129
quality_checks:
1230
uses: NHSDigital/eps-workflow-quality-checks/.github/workflows/[email protected]
1331
secrets:
@@ -43,24 +61,6 @@ jobs:
4361
}
4462
result-encoding: string
4563

46-
get_asdf_version:
47-
runs-on: ubuntu-22.04
48-
outputs:
49-
asdf_version: ${{ steps.asdf-version.outputs.version }}
50-
tag_format: ${{ steps.load-config.outputs.TAG_FORMAT }}
51-
steps:
52-
- name: Checkout code
53-
uses: actions/checkout@v5
54-
55-
- name: Get asdf version
56-
id: asdf-version
57-
run: echo "version=$(awk '!/^#/ && NF {print $1; exit}' .tool-versions.asdf)" >> "$GITHUB_OUTPUT"
58-
- name: Load config value
59-
id: load-config
60-
run: |
61-
TAG_FORMAT=$(yq '.TAG_FORMAT' .github/config/settings.yml)
62-
echo "TAG_FORMAT=$TAG_FORMAT" >> "$GITHUB_OUTPUT"
63-
6464
tag_release:
6565
needs: [get_asdf_version]
6666
uses: NHSDigital/eps-workflow-semantic-release/.github/workflows/tag-release.yml@f80157cecce288dd175e61b477a1d2dbe9c88b99
@@ -91,7 +91,7 @@ jobs:
9191

9292
release_code:
9393
needs: [get_issue_number, package_code, get_commit_id]
94-
uses: ./.github/workflows/cdk_release_code.yml
94+
uses: ./.github/workflows/release_all_stacks.yml
9595
with:
9696
STACK_NAME: epsam-pr-${{needs.get_issue_number.outputs.issue_number}}
9797
TARGET_ENVIRONMENT: dev-pr
@@ -102,9 +102,18 @@ jobs:
102102
LOG_RETENTION_IN_DAYS: 30
103103
LOG_LEVEL: DEBUG
104104
RUN_REGRESSION_TESTS: true
105+
CREATE_INT_RELEASE_NOTES: false
106+
CREATE_PROD_RELEASE_NOTES: false
107+
MARK_JIRA_RELEASED: false
108+
CREATE_INT_RC_RELEASE_NOTES: false
109+
IS_PULL_REQUEST: true
105110
secrets:
106111
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_DEPLOY_ROLE }}
107112
CDK_PULL_IMAGE_ROLE: ${{ secrets.DEV_CDK_PULL_IMAGE_ROLE }}
113+
DEV_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
114+
INT_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.INT_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
115+
PROD_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.PROD_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
116+
DEV_CLOUD_FORMATION_EXECUTE_LAMBDA_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_EXECUTE_LAMBDA_ROLE }}
117+
REGRESSION_TESTS_PEM: ${{ secrets.REGRESSION_TESTS_PEM }}
108118
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
109119
SLACK_SIGNING_SECRET: ${{ secrets.SLACK_SIGNING_SECRET }}
110-
REGRESSION_TESTS_PEM: ${{ secrets.REGRESSION_TESTS_PEM }}

0 commit comments

Comments
 (0)