Skip to content

Commit 0993368

Browse files
committed
Configure gh action deployments from main
- Implement client code quality checks on pull requests and pulls onto main - Implement deployments to client and server environments of qa, staging, and production - Make deployments depend on successful code quality checks - Modify msal environment variable check to specify which variable is missing closes #1520
1 parent 6d0a38b commit 0993368

File tree

6 files changed

+274
-34
lines changed

6 files changed

+274
-34
lines changed

.github/workflows/main.yml renamed to .github/workflows/code_quality.yml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
1-
name: Build
1+
name: 🚧 Run code quality checks
22

33
on:
44
push:
55
branches:
6-
- master
7-
- develop
6+
- main
87
pull_request:
98

109
jobs:
11-
test:
12-
name: Tests
10+
test-client:
11+
name: 🧪 Test client code
1312
runs-on: ubuntu-latest
1413
steps:
15-
- uses: actions/checkout@v2
14+
- uses: actions/checkout@v4
15+
with:
16+
sparse-checkout: client
1617
- uses: actions/setup-node@v1
1718
with:
18-
node-version: 12.x
19+
node-version: 14.x
1920
- name: install dependencies
2021
run: yarn install --frozen-lockfile --non-interactive
2122
working-directory: client

.github/workflows/production.yml

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
name: 🌠 Deploy api to production
2+
3+
on: workflow_dispatch
4+
5+
jobs:
6+
deploy-server:
7+
name: 🚀 Deploy server
8+
environment:
9+
name: production
10+
url: https://zap-api.nycplanningdigital.com
11+
runs-on: ubuntu-latest
12+
steps:
13+
- uses: actions/checkout@v4
14+
with:
15+
sparse-checkout: server
16+
- uses: akhileshns/[email protected]
17+
name: Deploy server to Heroku
18+
with:
19+
heroku_email: ${{secrets.HEROKU_EMAIL}}
20+
heroku_api_key: ${{secrets.HEROKU_API_KEY}}
21+
heroku_app_name: ${{ vars.HEROKU_APP_NAME }}
22+
team: ${{secrets.HEROKU_TEAM}}
23+
appdir: server
24+
env:
25+
HD_ADO_PRINCIPAL: ${{secrets.ADO_PRINCIPAL}}
26+
HD_AIRTABLE_API_KEY: ${{ secrets.AIRTABLE_API_KEY }}
27+
HD_AUTHORITY_HOST_URL: ${{secrets.AUTHORITY_HOST_URL}}
28+
HD_CLIENT_ID: ${{secrets.CLIENT_ID}}
29+
HD_CLIENT_SECRET: ${{secrets.CLIENT_SECRET}}
30+
HD_CRM_ADMIN_SERVICE_USER: ${{secrets.CRM_ADMIN_SERVICE_USER}}
31+
HD_CRM_HOST: ${{secrets.CRM_HOST}}
32+
HD_CRM_SIGNING_SECRET: ${{secrets.CRM_SIGNING_SECRET}}
33+
HD_CRM_URL_PATH: ${{secrets.CRM_URL_PATH}}
34+
HD_GITHUB_ACCESS_TOKEN: ${{secrets.FEEDBACK_GITHUB_ACCESS_TOKEN}}
35+
HD_NEW_RELIC_LICENSE_KEY: ${{ secrets.NEW_RELIC_LICENSE_KEY }}
36+
HD_NEW_RELIC_LOG: ${{ secrets.NEW_RELIC_LOG }}
37+
HD_NODE_ENV: ${{ vars.NODE_ENV }}
38+
HD_NPM_CONFIG_PRODUCTION: ${{ vars.NPM_CONFIG_PRODUCTION }}
39+
HD_NYCID_CONSOLE_PASSWORD: ${{secrets.NYCID_CONSOLE_PASSWORD}}
40+
HD_PAPERTRAIL_API_TOKEN: ${{ secrets.PAPERTRAIL_API_TOKEN }}
41+
HD_RECAPTCHA_SECRET_KEY: ${{secrets.RECAPTCHA_SECRET_KEY}}
42+
HD_RECAPTCHA_SITE_KEY: ${{secrets.RECAPTCHA_SITE_KEY}}
43+
HD_SHAREPOINT_CLIENT_ID: ${{secrets.SHAREPOINT_CLIENT_ID}}
44+
HD_SHAREPOINT_CLIENT_SECRET: ${{secrets.SHAREPOINT_CLIENT_SECRET}}
45+
HD_SHAREPOINT_CRM_SITE: ${{secrets.SHAREPOINT_CRM_SITE}}
46+
HD_SHAREPOINT_SITE_ID: ${{secrets.SHAREPOINT_SITE_ID}}
47+
HD_SHAREPOINT_TARGET_HOST: ${{secrets.SHAREPOINT_TARGET_HOST}}
48+
HD_SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
49+
HD_TENANT_ID: ${{secrets.TENANT_ID}}
50+
HD_TOKEN_PATH: ${{secrets.TOKEN_PATH}}
51+
HD_USER_API_KEY: ${{ secrets.USER_API_KEY }}
52+
deploy-client:
53+
name: 🛫 Deploy client
54+
needs: deploy-server
55+
environment:
56+
name: production
57+
url: https://zap.planninglabs.nyc
58+
runs-on: ubuntu-latest
59+
env:
60+
HOST: ${{ vars.ZAP_API_HOST }}
61+
NYCID_CLIENT_ID: ${{ vars.NYCID_CLIENT_ID }}
62+
NYC_ID_HOST: ${{ vars.NYC_ID_HOST }}
63+
MAINTENANCE_START: ${{ vars.MAINTENANCE_START }}
64+
MAINTENANCE_END: ${{ vars.MAINTENANCE_END }}
65+
steps:
66+
- uses: actions/checkout@v4
67+
with:
68+
sparse-checkout: client
69+
- name: Setup node
70+
uses: actions/setup-node@v4
71+
with:
72+
node-version: 14.x
73+
- name: Install application dependencies
74+
working-directory: client
75+
run: yarn install --immutable --immutable-cache --check-cache
76+
- name: Build client
77+
working-directory: client
78+
run: yarn run build --environment=production
79+
- name: Install netlify
80+
# Use npm over yarn because yarn was not respecting the exact version of a dependency
81+
run: npm i -g [email protected]
82+
- name: Deploy client to Netlify
83+
run: |
84+
netlify deploy \
85+
--dir client/dist \
86+
--site ${{secrets.NETLIFY_SITE_ID}} \
87+
--auth ${{secrets.NETLIFY_AUTH_TOKEN}} \
88+
--message "${{ github.event.head_commit.message }}"
89+
--prod

.github/workflows/qa.yml

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
name: 🕵️ Deploy to quality assurance
2+
3+
on: workflow_dispatch
4+
5+
jobs:
6+
deploy-server:
7+
name: 🚀 Deploy server
8+
environment:
9+
name: qa
10+
url: https://qa-zap-api.nycplanningdigital.com
11+
runs-on: ubuntu-latest
12+
steps:
13+
- uses: actions/checkout@v4
14+
with:
15+
sparse-checkout: server
16+
- uses: akhileshns/[email protected]
17+
name: Deploy server to Heroku
18+
with:
19+
heroku_email: ${{secrets.HEROKU_EMAIL}}
20+
heroku_api_key: ${{secrets.HEROKU_API_KEY}}
21+
heroku_app_name: ${{ vars.HEROKU_APP_NAME }}
22+
team: ${{secrets.HEROKU_TEAM}}
23+
appdir: server
24+
env:
25+
HD_ADO_PRINCIPAL: ${{secrets.ADO_PRINCIPAL}}
26+
HD_AIRTABLE_API_KEY: ${{ secrets.AIRTABLE_API_KEY }}
27+
HD_AUTHORITY_HOST_URL: ${{secrets.AUTHORITY_HOST_URL}}
28+
HD_CLIENT_ID: ${{secrets.CLIENT_ID}}
29+
HD_CLIENT_SECRET: ${{secrets.CLIENT_SECRET}}
30+
HD_CRM_ADMIN_SERVICE_USER: ${{secrets.CRM_ADMIN_SERVICE_USER}}
31+
HD_CRM_HOST: ${{secrets.CRM_HOST}}
32+
HD_CRM_SIGNING_SECRET: ${{secrets.CRM_SIGNING_SECRET}}
33+
HD_CRM_URL_PATH: ${{secrets.CRM_URL_PATH}}
34+
HD_NYCID_CONSOLE_PASSWORD: ${{secrets.NYCID_CONSOLE_PASSWORD}}
35+
HD_PAPERTRAIL_API_TOKEN: ${{ secrets.PAPERTRAIL_API_TOKEN }}
36+
HD_RECAPTCHA_SECRET_KEY: ${{secrets.RECAPTCHA_SECRET_KEY}}
37+
HD_RECAPTCHA_SITE_KEY: ${{secrets.RECAPTCHA_SITE_KEY}}
38+
HD_SHAREPOINT_CLIENT_ID: ${{secrets.SHAREPOINT_CLIENT_ID}}
39+
HD_SHAREPOINT_CLIENT_SECRET: ${{secrets.SHAREPOINT_CLIENT_SECRET}}
40+
HD_SHAREPOINT_CRM_SITE: ${{secrets.SHAREPOINT_CRM_SITE}}
41+
HD_SHAREPOINT_SITE_ID: ${{secrets.SHAREPOINT_SITE_ID}}
42+
HD_SHAREPOINT_TARGET_HOST: ${{secrets.SHAREPOINT_TARGET_HOST}}
43+
HD_SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
44+
HD_TENANT_ID: ${{secrets.TENANT_ID}}
45+
HD_TOKEN_PATH: ${{secrets.TOKEN_PATH}}
46+
deploy-client:
47+
name: 🛫 Deploy client
48+
needs: deploy-server
49+
environment:
50+
name: staging
51+
url: https://staging--labs-zap.netlify.app
52+
runs-on: ubuntu-latest
53+
env:
54+
HOST: ${{ vars.ZAP_API_HOST }}
55+
NYCID_CLIENT_ID: ${{ vars.NYCID_CLIENT_ID }}
56+
NYC_ID_HOST: ${{ vars.NYC_ID_HOST }}
57+
MAINTENANCE_START: ${{ vars.MAINTENANCE_START }}
58+
MAINTENANCE_END: ${{ vars.MAINTENANCE_END }}
59+
steps:
60+
- uses: actions/checkout@v4
61+
with:
62+
sparse-checkout: client
63+
- name: Setup node
64+
uses: actions/setup-node@v4
65+
with:
66+
node-version: 14.x
67+
- name: Install application dependencies
68+
working-directory: client
69+
run: yarn install --immutable --immutable-cache --check-cache
70+
- name: Build client
71+
working-directory: client
72+
run: yarn run build --environment=production
73+
- name: Install netlify
74+
# Use npm over yarn because yarn was not respecting the exact version of a dependency
75+
run: npm i -g [email protected]
76+
- name: Deploy client to Netlify
77+
run: |
78+
netlify deploy \
79+
--dir client/dist \
80+
--alias ${{github.ref_name}}_${{github.sha}} \
81+
--site ${{secrets.NETLIFY_SITE_ID}} \
82+
--auth ${{secrets.NETLIFY_AUTH_TOKEN}} \
83+
--message "${{ github.event.head_commit.message }}"

.github/workflows/staging.yml

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
name: 🎭 Deploy to staging
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
8+
jobs:
9+
deploy-server:
10+
name: 🚀 Deploy server
11+
environment:
12+
name: staging
13+
url: https://staging-zap-api.nycplanningdigital.com
14+
runs-on: ubuntu-latest
15+
steps:
16+
- uses: actions/checkout@v4
17+
with:
18+
ref: 'main'
19+
sparse-checkout: server
20+
- uses: akhileshns/[email protected]
21+
name: Deploy server to Heroku
22+
with:
23+
heroku_email: ${{secrets.HEROKU_EMAIL}}
24+
heroku_api_key: ${{secrets.HEROKU_API_KEY}}
25+
heroku_app_name: ${{ vars.HEROKU_APP_NAME }}
26+
team: ${{secrets.HEROKU_TEAM}}
27+
appdir: server
28+
env:
29+
HD_ADO_PRINCIPAL: ${{secrets.ADO_PRINCIPAL}}
30+
HD_AIRTABLE_API_KEY: ${{ secrets.AIRTABLE_API_KEY }}
31+
HD_AUTHORITY_HOST_URL: ${{secrets.AUTHORITY_HOST_URL}}
32+
HD_CLIENT_ID: ${{secrets.CLIENT_ID}}
33+
HD_CLIENT_SECRET: ${{secrets.CLIENT_SECRET}}
34+
HD_CRM_ADMIN_SERVICE_USER: ${{secrets.CRM_ADMIN_SERVICE_USER}}
35+
HD_CRM_HOST: ${{secrets.CRM_HOST}}
36+
HD_CRM_SIGNING_SECRET: ${{secrets.CRM_SIGNING_SECRET}}
37+
HD_CRM_URL_PATH: ${{secrets.CRM_URL_PATH}}
38+
HD_NYCID_CONSOLE_PASSWORD: ${{secrets.NYCID_CONSOLE_PASSWORD}}
39+
HD_PAPERTRAIL_API_TOKEN: ${{ secrets.PAPERTRAIL_API_TOKEN }}
40+
HD_RECAPTCHA_SECRET_KEY: ${{secrets.RECAPTCHA_SECRET_KEY}}
41+
HD_RECAPTCHA_SITE_KEY: ${{secrets.RECAPTCHA_SITE_KEY}}
42+
HD_SHAREPOINT_CLIENT_ID: ${{secrets.SHAREPOINT_CLIENT_ID}}
43+
HD_SHAREPOINT_CLIENT_SECRET: ${{secrets.SHAREPOINT_CLIENT_SECRET}}
44+
HD_SHAREPOINT_CRM_SITE: ${{secrets.SHAREPOINT_CRM_SITE}}
45+
HD_SHAREPOINT_SITE_ID: ${{secrets.SHAREPOINT_SITE_ID}}
46+
HD_SHAREPOINT_TARGET_HOST: ${{secrets.SHAREPOINT_TARGET_HOST}}
47+
HD_SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
48+
HD_TENANT_ID: ${{secrets.TENANT_ID}}
49+
HD_TOKEN_PATH: ${{secrets.TOKEN_PATH}}
50+
deploy-client:
51+
name: 🛫 Deploy client
52+
needs: deploy-server
53+
environment:
54+
name: staging
55+
url: https://staging--labs-zap.netlify.app
56+
runs-on: ubuntu-latest
57+
env:
58+
HOST: ${{ vars.ZAP_API_HOST }}
59+
NYCID_CLIENT_ID: ${{ vars.NYCID_CLIENT_ID}}
60+
NYC_ID_HOST: ${{ vars.NYC_ID_HOST}}
61+
MAINTENANCE_START: ${{ vars.MAINTENANCE_START }}
62+
MAINTENANCE_END: ${{ vars.MAINTENANCE_END }}
63+
steps:
64+
- uses: actions/checkout@v4
65+
with:
66+
ref: 'main'
67+
sparse-checkout: client
68+
- name: Setup node
69+
uses: actions/setup-node@v4
70+
with:
71+
node-version: 14.x
72+
- name: Install application dependencies
73+
working-directory: client
74+
run: yarn install --immutable --immutable-cache --check-cache
75+
- name: Build client
76+
working-directory: client
77+
run: yarn run build --environment=production
78+
- name: Install netlify
79+
# Use npm over yarn because yarn was not respecting the exact version of a dependency
80+
run: npm i -g [email protected]
81+
- name: Deploy client to Netlify
82+
run: |
83+
netlify deploy \
84+
--dir client/dist \
85+
--alias staging \
86+
--site ${{secrets.NETLIFY_SITE_ID}} \
87+
--auth ${{secrets.NETLIFY_AUTH_TOKEN}} \
88+
--message "${{ github.event.head_commit.message }}"
89+

netlify.toml

Lines changed: 0 additions & 19 deletions
This file was deleted.

server/src/provider/msal.provider.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,11 @@ export const MsalProvider: FactoryProvider<MsalProviderType> = {
1717
"SHAREPOINT_CLIENT_SECRET"
1818
);
1919
const siteId: string | undefined = config.get("SHAREPOINT_SITE_ID");
20-
if (
21-
tenantId === undefined ||
22-
clientId === undefined ||
23-
clientSecret === undefined ||
24-
siteId === undefined
25-
) {
26-
throw new Error("Missing SharePoint credential");
27-
}
20+
21+
if(tenantId === undefined) throw new Error("Missing tenant id");
22+
if(clientId === undefined) throw new Error("Missing sharepoint client id");
23+
if(clientSecret === undefined) throw new Error("Missing sharepoint client secret");
24+
if(siteId === undefined) throw new Error("Missing sharepoint site id");
2825

2926
const cca = new msal.ConfidentialClientApplication({
3027
auth: {

0 commit comments

Comments
 (0)