Skip to content

Deploy to Production Environment #11

Deploy to Production Environment

Deploy to Production Environment #11

Workflow file for this run

name: Deploy to Production Environment
on:
workflow_dispatch:
concurrency:
group: deploy-prod-${{ github.ref }}
cancel-in-progress: true
env:
NODE_VERSION: "22"
BUILD_DIR: "out"
jobs:
wait-for-ci:
name: Wait for CI
runs-on: ubuntu-latest
steps:
- name: Wait for CI workflow
uses: lewagon/wait-on-check-action@v1.3.4
with:
ref: ${{ github.ref }}
check-name: "Lint & Test"
repo-token: ${{ secrets.GITHUB_TOKEN }}
build-prod:
name: Build (Prod)
runs-on: ubuntu-latest
needs: wait-for-ci
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: "npm"
- name: Install dependencies
run: npm ci
- name: Build static site
run: |
npm run build
npm run postexport
env:
# Build-time envs used in next.config.js
NET: "mainnet"
INFURA_API_KEY: ${{ secrets.INFURA_API_KEY }}
ALCHEMY_API_KEY: ${{ secrets.ALCHEMY_API_KEY }}
GA4_TAG_ID: ${{ secrets.GA4_TAG_ID }}
TRUSTED_TLDS: ${{ secrets.TRUSTED_TLDS }}
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: static-site-prod
path: ${{ env.BUILD_DIR }}
deploy-prod:
name: Deploy to S3 (Prod)
needs: build-prod
runs-on: ubuntu-latest
steps:
- name: Download build artifact
uses: actions/download-artifact@v4
with:
name: static-site-prod
path: ${{ env.BUILD_DIR }}
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: Select target bucket
id: bucket
run: |
echo "bucket=${S3_BUCKET_PROD}" >> $GITHUB_OUTPUT
env:
S3_BUCKET_PROD: ${{ secrets.S3_BUCKET_PROD }}
- name: Sync static assets with long cache
run: |
aws s3 sync $BUILD_DIR s3://${{ steps.bucket.outputs.bucket }} \
--delete \
--exclude "*" \
--include "_next/*" \
--include "static/*" \
--cache-control "public, max-age=31536000, immutable"
- name: Sync HTML and other assets with no-cache
run: |
aws s3 sync $BUILD_DIR s3://${{ steps.bucket.outputs.bucket }} \
--delete \
--exclude "_next/*" \
--exclude "static/*" \
--cache-control "no-cache, no-store, must-revalidate"
- name: Invalidate CloudFront
env:
CLOUDFRONT_DISTRIBUTION_ID: ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }}
if: ${{ env.CLOUDFRONT_DISTRIBUTION_ID != '' }}
run: |
aws cloudfront create-invalidation \
--distribution-id ${{ secrets.CLOUDFRONT_DISTRIBUTION_ID }} \
--paths "/*"