Skip to content

Chore: [AEA-0000] - Zero downtime #1967

Chore: [AEA-0000] - Zero downtime

Chore: [AEA-0000] - Zero downtime #1967

Workflow file for this run

name: deploy_pr
on:
pull_request:
branches: [main]
env:
BRANCH_NAME: ${{ github.event.pull_request.head.ref }}
jobs:
get_asdf_version:
runs-on: ubuntu-22.04
outputs:
asdf_version: ${{ steps.asdf-version.outputs.version }}
tag_format: ${{ steps.load-config.outputs.TAG_FORMAT }}
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Get asdf version
id: asdf-version
run: echo "version=$(awk '!/^#/ && NF {print $1; exit}' .tool-versions.asdf)" >> "$GITHUB_OUTPUT"
- name: Load config value
id: load-config
run: |
TAG_FORMAT=$(yq '.TAG_FORMAT' .github/config/settings.yml)
echo "TAG_FORMAT=$TAG_FORMAT" >> "$GITHUB_OUTPUT"
get_commit_message:
runs-on: ubuntu-22.04
outputs:
commit_message: ${{ steps.commit_message.outputs.commit_message }}
steps:
- name: Checkout code
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8
with:
ref: ${{ env.BRANCH_NAME }}
fetch-depth: 0
- name: Get Commit message
id: commit_message
run: |
echo "commit_message=$(git show -s --format=%s)" >> "$GITHUB_OUTPUT"
quality_checks:
uses: NHSDigital/eps-common-workflows/.github/workflows/quality-checks.yml@b933ef1bb3527fd7e7d5a7629fbd4e4dd94bf1b4
needs: [get_asdf_version, get_commit_message]
if: ${{ ! contains(needs.get_commit_message.outputs.commit_message, '#skip-qc') }}
with:
asdfVersion: ${{ needs.get_asdf_version.outputs.asdf_version }}
secrets:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
quality_gate:
needs: get_commit_message
runs-on: ubuntu-22.04
if: always()
steps:
- name: Wait for quality checks to succeed
if: ${{ ! contains(needs.get_commit_message.outputs.commit_message, '#skip-qc') }}
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
result-encoding: json
script: |
const owner = context.repo.owner;
const repo = context.repo.repo;
const runId = context.runId;
// How many times to poll
const pollTime = 10000; // 10 seconds
const maxRetries = 120; // 20 minutes at 10 seconds each
let attempts = 0;
async function fetchQCJob() {
const { data } = await github.rest.actions.listJobsForWorkflowRun({
owner, repo, run_id: runId
});
return data.jobs.find(job => job.name === 'quality_checks / quality_checks');
}
let qc = await fetchQCJob();
while ((!qc || qc.status !== 'completed') && attempts < maxRetries) {
attempts++;
console.log(`Attempt #${attempts}: ` +
(qc
? `found job "${qc.name}" with status=${qc.status}`
: 'no matching quality_checks job yet'));
await new Promise(r => setTimeout(r, pollTime));
qc = await fetchQCJob();
}
if (!qc) {
core.setFailed(
`Timed out waiting for a "quality_checks" job (after ${attempts} polls).`
);
return;
}
if (qc.status !== 'completed') {
core.setFailed(
`Quality checks job never completed (last status=${qc.status}).`
);
return;
}
if (qc.conclusion !== 'success') {
core.setFailed(
`Quality checks failed (conclusion=${qc.conclusion}).`
);
}
- name: Bypass QC gate
if: ${{ contains(needs.get_commit_message.outputs.commit_message, '#skip-qc') }}
run: echo "Skipping QC gate per commit message."
dependabot-auto-approve-and-merge:
needs: quality_gate
uses: NHSDigital/eps-common-workflows/.github/workflows/dependabot-auto-approve-and-merge.yml@b933ef1bb3527fd7e7d5a7629fbd4e4dd94bf1b4
secrets:
AUTOMERGE_APP_ID: ${{ secrets.AUTOMERGE_APP_ID }}
AUTOMERGE_PEM: ${{ secrets.AUTOMERGE_PEM }}
pr_title_format_check:
uses: NHSDigital/eps-common-workflows/.github/workflows/pr_title_check.yml@b933ef1bb3527fd7e7d5a7629fbd4e4dd94bf1b4
get_issue_number:
runs-on: ubuntu-22.04
outputs:
issue_number: ${{steps.get_issue_number.outputs.result}}
steps:
- uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd
name: get issue number
id: get_issue_number
with:
script: |
if (context.issue.number) {
// Return issue number if present
return context.issue.number;
} else {
// Otherwise return issue number from commit
return (
await github.rest.repos.listPullRequestsAssociatedWithCommit({
commit_sha: context.sha,
owner: context.repo.owner,
repo: context.repo.repo,
})
).data[0].number;
}
result-encoding: string
package_code:
needs: [get_issue_number, quality_gate]
if: |
always() &&
! contains(needs.*.result, 'failure') &&
! contains(needs.*.result, 'cancelled')
uses: ./.github/workflows/cdk_package_code.yml
with:
STACK_NAME: epsam-pr-${{needs.get_issue_number.outputs.issue_number}}
VERSION_NUMBER: PR-${{ needs.get_issue_number.outputs.issue_number }}
COMMIT_ID: ${{ github.sha }}
release_code:
needs: [get_issue_number, package_code]
if: |
always() &&
! contains(needs.*.result, 'failure') &&
! contains(needs.*.result, 'cancelled')
uses: ./.github/workflows/release_all_stacks.yml
with:
STATEFUL_STACK_NAME: epsam-pr-${{needs.get_issue_number.outputs.issue_number}}-stateful
STATELESS_STACK_NAME: epsam-pr-${{needs.get_issue_number.outputs.issue_number}}-stateless
BASE_PATH_MAPPING_STACK_NAME: epsam-pr-${{needs.get_issue_number.outputs.issue_number}}-bpm
API_GATEWAY_DOMAIN_NAME: epsam-pr-${{needs.get_issue_number.outputs.issue_number}}
TARGET_ENVIRONMENT: dev-pr
VERSION_NUMBER: PR-${{ needs.get_issue_number.outputs.issue_number }}
COMMIT_ID: ${{ github.sha }}
CDK_APP_NAME: EpsAssistMeApp
DEPLOY_CODE: true
LOG_RETENTION_IN_DAYS: 30
LOG_LEVEL: "DEBUG"
CREATE_INT_RELEASE_NOTES: false
CREATE_PROD_RELEASE_NOTES: false
MARK_JIRA_RELEASED: false
CREATE_INT_RC_RELEASE_NOTES: false
IS_PULL_REQUEST: true
FORWARD_CSOC_LOGS: false
RUN_REGRESSION_TESTS: true
secrets:
CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_DEPLOY_ROLE }}
CDK_PULL_IMAGE_ROLE: ${{ secrets.DEV_CDK_PULL_IMAGE_ROLE }}
DEV_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
INT_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.INT_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
PROD_CLOUD_FORMATION_CHECK_VERSION_ROLE: ${{ secrets.PROD_CLOUD_FORMATION_CHECK_VERSION_ROLE }}
DEV_CLOUD_FORMATION_EXECUTE_LAMBDA_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_EXECUTE_LAMBDA_ROLE }}
REGRESSION_TESTS_PEM: ${{ secrets.REGRESSION_TESTS_PEM }}
SLACK_BOT_TOKEN: ${{ secrets.DEV_SLACK_BOT_TOKEN }}
SLACK_SIGNING_SECRET: ${{ secrets.DEV_SLACK_SIGNING_SECRET }}