Skip to content

Deploy

Deploy #15

Workflow file for this run

name: Deploy
on:
workflow_dispatch:
inputs:
version:
description: 'Version to deploy'
required: true
default: 'e.g. v1.20.1-freetown.1'
env:
type: choice
description: Environment to deploy to
options:
- dev
- test
- prod
default: 'dev'
env:
project-directory: ./
repository: 'Greenstand/treetracker-admin-client'
node-version: '16.10'
jobs:
prepare:
name: checking and prepare settings for jobs
runs-on: ubuntu-latest
outputs:
CHANNEL: ${{ steps.resolver.outputs.CHANNEL }}
S3_BUCKET_SECRET_NAME: ${{ steps.resolver.outputs.S3_BUCKET_SECRET_NAME }}
CDN_ID_SECRET_NAME: ${{ steps.resolver.outputs.CDN_ID_SECRET_NAME }}
steps:
- uses: actions/setup-node@v1
with:
node-version: '18.x'
- uses: actions/checkout@v2
with:
# have to checkout master, to read releaserc, which means we must update the rc file in master with the newest settings
ref: master
- run: |
echo "::debug:: begin preparing...";
echo "::debug:: version to deploy: $VERSION_TO_DEPLOY";
echo "::debug:: env to deploy: ${{ github.event.inputs.env }}";
ls -a
node <<EOF >> $GITHUB_OUTPUT
const s3BucketSecretNames = {
"master-dev": "DEV_CDN_S3_BUCKET",
"master-prod": "PROD_CDN_S3_BUCKET",
"freetown-dev": "DEV_CDN_S3_BUCKET_FREETOWN",
"freetown-prod": "PROD_CDN_S3_BUCKET_FREETOWN",
"beta-dev": "DEV_STAGING_CDN_S3_BUCKET",
"beta-prod": "STAGING_CDN_S3_BUCKET",
"alpha-dev": "DEV_ALPHA_CDN_S3_BUCKET",
"alpha-prod": "PROD_ALPHA_CDN_S3_BUCKET",
}
const cdnIdSecretNames = {
"master-dev": "DEV_CDN_DISTRIBUTION_ID",
"master-prod": "PROD_CDN_DISTRIBUTION_ID",
"freetown-dev": "DEV_CDN_DISTRIBUTION_ID_FREETOWN",
"freetown-prod": 'PROD_CDN_DISTRIBUTION_ID_FREETOWN"',
"beta-dev": "DEV_STAGING_CDN_DISTRIBUTION_ID",
"beta-prod": "STAGING_CDN_DISTRIBUTION_ID",
"alpha-dev": "DEV_ALPHA_CDN_DISTRIBUTION_ID",
"alpha-prod": "PROD_ALPHA_CDN_DISTRIBUTION_ID",
}
const releaseJson = require("./.releaserc.json");
const version = process.env.VERSION_TO_DEPLOY
const env = process.env.ENV_TO_DEPLOY;
const m = version.match(/^v\d+\.\d+.\d+(-([\w-\/\.]+)\.\d+)?$/)
let channel;
let s3BucketSecretName;
let cdnIdSecretName;
if(!m){
throw '::error:: wrong version:' + version;
}else{
if(!m[1]){
channel = "master";
}else{
const releaseName = m[2];
channel = releaseJson.branches.reduce((a,c) => a || (c.prerelease === releaseName && c.channel) || (c.name === releaseName && c.channel), false);
}
}
s3BucketSecretName = s3BucketSecretNames[channel + '-' + env];
if(!s3BucketSecretName){
throw '::error:: can not find s3 bucket secret name by, channel:' + channel + ' env:' + env;
}
cdnIdSecretName = cdnIdSecretNames[channel + '-' + env];
console.log("CHANNEL=" + channel);
console.log("S3_BUCKET_SECRET_NAME=" + s3BucketSecretName);
console.log("CDN_ID_SECRET_NAME=" + cdnIdSecretName);
EOF
id: resolver
env:
VERSION_TO_DEPLOY: ${{ github.event.inputs.version }}
ENV_TO_DEPLOY: ${{ github.event.inputs.env }}
- run: |
echo "resolver: ${{ steps.resolver.outputs.CHANNEL}}"
echo "resolver: ${{ steps.resolver.outputs.S3_BUCKET_SECRET_NAME}}"
echo "resolver: ${{ steps.resolver.outputs.CDN_ID_SECRET_NAME}}"
name: Print resolver
frontend:
name: Build Frontend Project
runs-on: ubuntu-latest
needs: prepare
if: |
!contains(github.event.head_commit.message, 'skip-ci')
steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.inputs.version }}
- name: Use Node.js ${{ env.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ env.node-version }}
- name: npm clean install
run: npm ci --legacy-peer-deps
working-directory: ${{ env.project-directory }}
# define the endpoints for PROD in github secrets
- name: build frontend project
run: npm run build:staging
working-directory: ${{ env.project-directory }}
- uses: actions/upload-artifact@v2
with:
name: frontend-bundle
path: build
deploy:
name: Deploy to CDN
runs-on: ubuntu-latest
needs: [frontend, prepare]
if: |
github.repository == ${{ github.env.repository }}
steps:
- name: Print vars
run: |
echo "channel: ${{ needs.prepare.outputs.CHANNEL }}"
echo "s3: ${{ needs.prepare.outputs.S3_BUCKET_SECRET_NAME }}"
echo "cdn: ${{ needs.prepare.outputs.CDN_ID_SECRET_NAME }}"
- name: Download bundled frontend resources
uses: actions/download-artifact@v2
with:
name: frontend-bundle
path: build
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_KEY_ID_DADIOR }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_DADIOR }}
aws-region: us-east-1
- name: Copy front end resources to s3 bucket
run: |
aws s3 sync build s3://${{secrets[needs.prepare.outputs.S3_BUCKET_SECRET_NAME]}} --delete
- name: Invalidate cloudfront caches
run: |
aws cloudfront create-invalidation --distribution-id ${{ secrets[needs.prepare.outputs.CDN_ID_SECRET_NAME]}} --paths "/*"