11name : " Test stage"
22
3+ permissions :
4+ id-token : write
5+ contents : read
6+
37env :
4- BASE_URL : " http ://localhost:5002 "
8+ BASE_URL : " https ://internal-dev.api.service.nhs.uk/pathology-laboratory-reporting-pr-32 "
59 HOST : " localhost"
10+ ENV : " remote"
11+ PR_NUMBER : " 32"
12+ AWS_REGION : eu-west-2
13+ PROXYGEN_KEY_ID : ${{ vars.PREVIEW_ENV_PROXYGEN_KEY_ID }}
14+ PROXYGEN_CLIENT_ID : ${{ vars.PREVIEW_ENV_PROXYGEN_CLIENT_ID }}
15+ PROXYGEN_API_NAME : ${{ vars.PROXYGEN_API_NAME }}
616
717on :
818 workflow_call :
@@ -27,13 +37,97 @@ jobs:
2737 with :
2838 prefix : coverage
2939
40+ generate-apigee-token :
41+ name : " Generate Apigee token"
42+ runs-on : ubuntu-latest
43+ outputs :
44+ secret-name : ${{ steps.store-token.outputs.secret-name }}
45+ steps :
46+ - name : " Checkout code"
47+ uses : actions/checkout@v6
48+
49+ - name : " Set up Python"
50+ uses : actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548
51+ with :
52+ python-version : ${{ inputs.python_version }}
53+
54+ - name : Select AWS role inputs
55+ id : role-select
56+ env :
57+ DEPENDABOT_AWS_ROLE_ARN : ${{ secrets.DEPENDABOT_AWS_ROLE_ARN }}
58+ DEPENDABOT_LAMBDA_ROLE_ARN : ${{ secrets.DEPENDABOT_LAMBDA_ROLE_ARN }}
59+ AWS_ROLE_ARN : ${{ secrets.AWS_ROLE_ARN }}
60+ LAMBDA_ROLE_ARN : ${{ secrets.LAMBDA_ROLE_ARN }}
61+ run : |
62+ if [ "${{ github.actor }}" = "dependabot[bot]" ]; then
63+ echo "aws_role=$DEPENDABOT_AWS_ROLE_ARN" >> "$GITHUB_OUTPUT"
64+ echo "lambda_role=$DEPENDABOT_LAMBDA_ROLE_ARN" >> "$GITHUB_OUTPUT"
65+ else
66+ echo "aws_role=$AWS_ROLE_ARN" >> "$GITHUB_OUTPUT"
67+ echo "lambda_role=$LAMBDA_ROLE_ARN" >> "$GITHUB_OUTPUT"
68+ fi
69+
70+ - name : Configure AWS credentials (OIDC)
71+ uses : aws-actions/configure-aws-credentials@a7a2c1125c67f40a1e95768f4e4a7d8f019f87af
72+ with :
73+ role-to-assume : ${{ steps.role-select.outputs.aws_role }}
74+ aws-region : ${{ env.AWS_REGION }}
75+
76+ - name : Get proxygen machine user details
77+ id : proxygen-machine-user
78+ uses : aws-actions/aws-secretsmanager-get-secrets@a9a7eb4e2f2871d30dc5b892576fde60a2ecc802
79+ with :
80+ secret-ids : /cds/pathology/dev/proxygen/proxygen-key-secret
81+ name-transformation : lowercase
82+
83+ - name : Generate Apigee token
84+ id : generate-token
85+ uses : ./.github/actions/proxy/generate-apigee-token
86+ with :
87+ proxygen-key-secret : ${{ env._cds_pathology_dev_proxygen_proxygen_key_secret }}
88+ proxygen-key-id : ${{ env.PROXYGEN_KEY_ID }}
89+ proxygen-client-id : ${{ env.PROXYGEN_CLIENT_ID }}
90+ proxygen-api-name : ${{ env.PROXYGEN_API_NAME }}
91+
92+ - name : Store token in AWS Secrets Manager
93+ id : store-token
94+ shell : bash
95+ env :
96+ TOKEN : ${{ steps.generate-token.outputs.apigee-access-token }}
97+ run : |
98+ if [ -z "$TOKEN" ]; then
99+ echo "::error::Token is empty"
100+ exit 1
101+ fi
102+ SECRET_NAME="apigee-token-${{ github.run_id }}-${{ github.run_attempt }}"
103+ aws secretsmanager create-secret \
104+ --name "$SECRET_NAME" \
105+ --description "Temporary Apigee token for workflow run ${{ github.run_id }}" \
106+ --secret-string "$TOKEN" \
107+ --region ${{ env.AWS_REGION }}
108+ echo "secret-name=$SECRET_NAME" >> $GITHUB_OUTPUT
109+ echo "Token stored securely in AWS Secrets Manager: $SECRET_NAME"
110+
30111 test-unit :
31112 name : " Unit tests"
32113 runs-on : ubuntu-latest
33114 timeout-minutes : 5
115+ needs : [generate-apigee-token]
116+ env :
117+ ENV : " local"
34118 steps :
35119 - name : " Checkout code"
36120 uses : actions/checkout@v6
121+ - name : Retrieve Apigee token
122+ id : get-token
123+ uses : ./.github/actions/retrieve-apigee-token
124+ with :
125+ secret-name : ${{ needs.generate-apigee-token.outputs.secret-name }}
126+ aws-role-arn : ${{ secrets.AWS_ROLE_ARN }}
127+ aws-region : ${{ env.AWS_REGION }}
128+ - name : Set token environment variable
129+ shell : bash
130+ run : echo "APIGEE_ACCESS_TOKEN=${{ steps.get-token.outputs.apigee-access-token }}" >> $GITHUB_ENV
37131 - name : " Setup Python project"
38132 uses : ./.github/actions/setup-python-project
39133 with :
@@ -57,9 +151,20 @@ jobs:
57151 name : " Contract tests"
58152 runs-on : ubuntu-latest
59153 timeout-minutes : 5
154+ needs : [generate-apigee-token]
60155 steps :
61156 - name : " Checkout code"
62157 uses : actions/checkout@v6
158+ - name : Retrieve Apigee token
159+ id : get-token
160+ uses : ./.github/actions/retrieve-apigee-token
161+ with :
162+ secret-name : ${{ needs.generate-apigee-token.outputs.secret-name }}
163+ aws-role-arn : ${{ secrets.AWS_ROLE_ARN }}
164+ aws-region : ${{ env.AWS_REGION }}
165+ - name : Set token environment variable
166+ shell : bash
167+ run : echo "APIGEE_ACCESS_TOKEN=${{ steps.get-token.outputs.apigee-access-token }}" >> $GITHUB_ENV
63168 - name : " Setup Python project"
64169 uses : ./.github/actions/setup-python-project
65170 with :
@@ -87,9 +192,20 @@ jobs:
87192 name : " Schema validation tests"
88193 runs-on : ubuntu-latest
89194 timeout-minutes : 5
195+ needs : [generate-apigee-token]
90196 steps :
91197 - name : " Checkout code"
92198 uses : actions/checkout@v6
199+ - name : Retrieve Apigee token
200+ id : get-token
201+ uses : ./.github/actions/retrieve-apigee-token
202+ with :
203+ secret-name : ${{ needs.generate-apigee-token.outputs.secret-name }}
204+ aws-role-arn : ${{ secrets.AWS_ROLE_ARN }}
205+ aws-region : ${{ env.AWS_REGION }}
206+ - name : Set token environment variable
207+ shell : bash
208+ run : echo "APIGEE_ACCESS_TOKEN=${{ steps.get-token.outputs.apigee-access-token }}" >> $GITHUB_ENV
93209 - name : " Setup Python project"
94210 uses : ./.github/actions/setup-python-project
95211 with :
@@ -117,9 +233,20 @@ jobs:
117233 name : " Integration tests"
118234 runs-on : ubuntu-latest
119235 timeout-minutes : 10
236+ needs : [generate-apigee-token]
120237 steps :
121238 - name : " Checkout code"
122239 uses : actions/checkout@v6
240+ - name : Retrieve Apigee token
241+ id : get-token
242+ uses : ./.github/actions/retrieve-apigee-token
243+ with :
244+ secret-name : ${{ needs.generate-apigee-token.outputs.secret-name }}
245+ aws-role-arn : ${{ secrets.AWS_ROLE_ARN }}
246+ aws-region : ${{ env.AWS_REGION }}
247+ - name : Set token environment variable
248+ shell : bash
249+ run : echo "APIGEE_ACCESS_TOKEN=${{ steps.get-token.outputs.apigee-access-token }}" >> $GITHUB_ENV
123250 - name : " Setup Python project"
124251 uses : ./.github/actions/setup-python-project
125252 with :
@@ -129,6 +256,7 @@ jobs:
129256 with :
130257 python-version : ${{ inputs.python_version }}
131258 - name : " Run integration test"
259+ shell : bash
132260 run : make test-integration
133261 - name : " Upload integration test results"
134262 if : always()
@@ -147,9 +275,20 @@ jobs:
147275 name : " Acceptance tests"
148276 runs-on : ubuntu-latest
149277 timeout-minutes : 10
278+ needs : [generate-apigee-token]
150279 steps :
151280 - name : " Checkout code"
152281 uses : actions/checkout@v6
282+ - name : Retrieve Apigee token
283+ id : get-token
284+ uses : ./.github/actions/retrieve-apigee-token
285+ with :
286+ secret-name : ${{ needs.generate-apigee-token.outputs.secret-name }}
287+ aws-role-arn : ${{ secrets.AWS_ROLE_ARN }}
288+ aws-region : ${{ env.AWS_REGION }}
289+ - name : Set token environment variable
290+ shell : bash
291+ run : echo "APIGEE_ACCESS_TOKEN=${{ steps.get-token.outputs.apigee-access-token }}" >> $GITHUB_ENV
153292 - name : " Setup Python project"
154293 uses : ./.github/actions/setup-python-project
155294 with :
@@ -230,3 +369,30 @@ jobs:
230369 -Dsonar.organization=${{ vars.SONAR_ORGANISATION_KEY }}
231370 -Dsonar.projectKey=${{ vars.SONAR_PROJECT_KEY }}
232371 -Dsonar.python.coverage.reportPaths=coverage-reports/${{ needs.create-coverage-name.outputs.coverage-name }}.xml
372+
373+ cleanup-apigee-token :
374+ name : " Cleanup Apigee token"
375+ runs-on : ubuntu-latest
376+ needs : [generate-apigee-token, test-unit, test-contract, test-schema, test-integration, test-acceptance]
377+ if : always()
378+ timeout-minutes : 2
379+ steps :
380+ - name : Configure AWS credentials
381+ uses : aws-actions/configure-aws-credentials@a7a2c1125c67f40a1e95768f4e4a7d8f019f87af
382+ with :
383+ role-to-assume : ${{ secrets.AWS_ROLE_ARN }}
384+ aws-region : ${{ env.AWS_REGION }}
385+
386+ - name : Delete secret from AWS Secrets Manager
387+ shell : bash
388+ run : |
389+ SECRET_NAME="${{ needs.generate-apigee-token.outputs.secret-name }}"
390+ if [ -n "$SECRET_NAME" ]; then
391+ aws secretsmanager delete-secret \
392+ --secret-id "$SECRET_NAME" \
393+ --force-delete-without-recovery \
394+ --region ${{ env.AWS_REGION }} || true
395+ echo "Secret $SECRET_NAME deleted from Secrets Manager"
396+ else
397+ echo "No secret name provided, skipping cleanup"
398+ fi
0 commit comments