Skip to content

Deploy HydroServer to AWS Cloud Deployment #12

Deploy HydroServer to AWS Cloud Deployment

Deploy HydroServer to AWS Cloud Deployment #12

name: Deploy HydroServer to AWS Cloud Deployment
on:
workflow_dispatch:
inputs:
environment:
description: 'Enter a deployment environment name.'
required: true
version:
description: 'Choose a release tag to deploy, or leave blank to use the latest version.'
required: false
jobs:
deploy-backend:
name: Deploy Backend
runs-on: ubuntu-latest
environment: ${{ github.event.inputs.environment }}
steps:
- name: Checkout backend repo
uses: actions/checkout@v4
with:
repository: hydroserver2/hydroserver-webapp-back
ref: refs/tags/${{ github.event.inputs.version || '$(curl -sL https://api.github.com/repos/hydroserver2/hydroserver-webapp-back/releases/latest | jq -r ".tag_name")' }}
path: backend
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: 'us-east-1'
- name: Create backend deployment package
working-directory: ./backend
run: zip -r deploy_package.zip ./
- name: Upload deployment package to S3
working-directory: ./backend
run: aws s3 cp deploy_package.zip s3://hydroserver-${{ github.event.inputs.environment }}-backend/deploy_package_${{ github.event.inputs.version }}.zip
- name: Configure Environment Variables
working-directory: ./backend
run: |
cat << EOF > environment.yaml
option_settings:
- namespace: aws:elasticbeanstalk:application:environment
option_name: ADMIN_EMAIL
value: ${{ vars.ADMIN_EMAIL }}
- namespace: aws:elasticbeanstalk:application:environment
option_name: ALLOWED_HOSTS
value: ${{ vars.ALLOWED_HOSTS }}
- namespace: aws:elasticbeanstalk:application:environment
option_name: AWS_ACCESS_KEY_ID
value: ${{ secrets.AWS_ACCESS_KEY_ID }}
- namespace: aws:elasticbeanstalk:application:environment
option_name: AWS_SECRET_ACCESS_KEY
value: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- namespace: aws:elasticbeanstalk:application:environment
option_name: AWS_STORAGE_BUCKET_NAME
value: hydroserver-${{ github.event.inputs.environment }}-storage
- namespace: aws:elasticbeanstalk:application:environment
option_name: DATABASE_URL
value: ${{ secrets.DATABASE_URL }}
- namespace: aws:elasticbeanstalk:application:environment
option_name: DEBUG
value: ${{ vars.DEBUG }}
- namespace: aws:elasticbeanstalk:application:environment
option_name: DEPLOYED
value: True
- namespace: aws:elasticbeanstalk:application:environment
option_name: "OAUTH_GOOGLE_CLIENT
value: ${{ secrets.OAUTH_GOOGLE_CLIENT }}
- namespace: aws:elasticbeanstalk:application:environment
option_name: OAUTH_GOOGLE_SECRET
value: ${{ secrets.OAUTH_GOOGLE_SECRET }}
- namespace: aws:elasticbeanstalk:application:environment
option_name: OAUTH_HYDROSHARE_CLIENT
value: ${{ secrets.OAUTH_HYDROSHARE_CLIENT }}
- namespace: aws:elasticbeanstalk:application:environment
option_name: OAUTH_HYDROSHARE_SECRET
value: ${{ secrets.OAUTH_HYDROSHARE_SECRET }}
- namespace: aws:elasticbeanstalk:application:environment
option_name: OAUTH_ORCID_CLIENT
value: ${{ secrets.OAUTH_ORCID_CLIENT }}
- namespace: aws:elasticbeanstalk:application:environment
option_name: OAUTH_ORCID_SECRET
value: ${{ secrets.OAUTH_ORCID_SECRET }}
- namespace: aws:elasticbeanstalk:application:environment
option_name: PROXY_BASE_URL
value: ${{ vars.PROXY_BASE_URL }}
- namespace: aws:elasticbeanstalk:application:environment
option_name: SECRET_KEY
value: ${{ secrets.DJANGO_SECRET_KEY }}
EOF
- name: Create ElasticBeanstalk Application Version
working-directory: ./backend
run: |
aws elasticbeanstalk create-application-version \
--application-name hydroserver-${{ github.event.inputs.environment }} \
--source-bundle S3Bucket="hydroserver-${{ github.event.inputs.environment }}-backend",S3Key="deploy_package_${{ github.event.inputs.version }}.zip" \
--version-label "${{ github.event.inputs.version }}" \
--description "HydroServer Version ${{ github.event.inputs.version }}"
- name: Update ElasticBeanstalk Environment
working-directory: ./backend
run: |
aws elasticbeanstalk update-environment \
--environment-name hydroserver-${{ github.event.inputs.environment }}-env \
--version-label "${{ github.event.inputs.version }}" \
--option-settings file://environment.yaml
deploy-frontend:
name: Build and Deploy Frontend
runs-on: ubuntu-latest
environment: ${{ github.event.inputs.environment }}
steps:
- name: Checkout frontend repo
uses: actions/checkout@v4
with:
repository: hydroserver2/hydroserver-webapp-front
ref: refs/tags/${{ github.event.inputs.version || '$(curl -sL https://api.github.com/repos/hydroserver2/hydroserver-webapp-front/releases/latest | jq -r ".tag_name")' }}
path: frontend
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: 'us-east-1'
- name: Setup Node 18.x
uses: actions/setup-node@v3
with:
node-version: 18.x
cache: npm
cache-dependency-path: frontend/package-lock.json
- name: Install dependencies
working-directory: ./frontend
run: npm ci
- name: Configure Environment Variables
working-directory: ./frontend
run: |
cat << EOF > .env
VITE_APP_VERSION=${{ github.event.inputs.version || '$(curl -sL https://api.github.com/repos/hydroserver2/hydroserver-webapp-front/releases/latest | jq -r ".tag_name")' }}
VITE_APP_GOOGLE_MAPS_API_KEY=${{ secrets.GOOGLE_MAPS_API_KEY }}
VITE_APP_GOOGLE_MAPS_API_ID=${{ secrets.GOOGLE_MAPS_MAP_ID }}
VITE_APP_PROXY_BASE_URL=${{ secrets.PROXY_BASE_URL }}
EOF
- name: Build frontend
working-directory: ./frontend
run: npm run build
- name: Deploy to S3
working-directory: ./frontend
run: |
aws s3 sync ./dist s3://hydroserver-${{ github.event.inputs.environment }}-web/ --delete
- name: Invalidate CloudFront distribution cache
run: |
aws cloudfront create-invalidation --distribution-id ${{ secrets.CLOUDFRONT_ID }} --paths "/*"