#129 add export function to frontend #83
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Deploy | |
| on: | |
| push: | |
| branches: [main, live] | |
| env: | |
| AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
| AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
| AWS_REGION: us-east-2 | |
| jobs: | |
| determine-environment: | |
| name: Determine Environment | |
| runs-on: ubuntu-latest | |
| outputs: | |
| environment_name: ${{ steps.set-env.outputs.environment_name }} | |
| steps: | |
| - id: set-env | |
| run: | | |
| if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then | |
| echo "environment_name=dev" >> $GITHUB_OUTPUT | |
| elif [[ "${{ github.ref }}" == "refs/heads/live" ]]; then | |
| echo "environment_name=prod" >> $GITHUB_OUTPUT | |
| fi | |
| verify-ssm-parameters: | |
| name: Verify SSM Parameters | |
| needs: determine-environment | |
| runs-on: ubuntu-latest | |
| environment: ${{ needs.determine-environment.outputs.environment_name }} | |
| steps: | |
| - name: Configure AWS credentials | |
| uses: aws-actions/configure-aws-credentials@v4 | |
| with: | |
| aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }} | |
| aws-region: us-east-2 | |
| - name: Check required SSM parameters | |
| run: | | |
| REQUIRED_PARAMS=( | |
| "/zipcase/portal_url" | |
| "/zipcase/portal_case_url" | |
| "/zipcase/cognito/user_pool_id" | |
| "/zipcase/cognito/app_client_id" | |
| "/zipcase/alert-email" | |
| ) | |
| MISSING_PARAMS=0 | |
| for param in "${REQUIRED_PARAMS[@]}"; do | |
| echo "Checking SSM parameter: $param" | |
| if ! aws ssm get-parameter --name "$param" --with-decryption 2>/dev/null; then | |
| echo "::error::Missing required SSM parameter: $param" | |
| MISSING_PARAMS=1 | |
| fi | |
| done | |
| if [ $MISSING_PARAMS -ne 0 ]; then | |
| echo "::error::One or more required SSM parameters are missing" | |
| exit 1 | |
| fi | |
| echo "All required SSM parameters are present" | |
| terraform-apply: | |
| name: Terraform Apply | |
| runs-on: ubuntu-latest | |
| needs: [determine-environment, verify-ssm-parameters] | |
| environment: ${{ needs.determine-environment.outputs.environment_name }} | |
| defaults: | |
| run: | |
| working-directory: ./infra/terraform | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Setup Terraform | |
| uses: hashicorp/setup-terraform@v3 | |
| with: | |
| terraform_version: '1.11.4' | |
| - name: Configure AWS credentials | |
| uses: aws-actions/configure-aws-credentials@v4 | |
| with: | |
| aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }} | |
| aws-region: us-east-2 | |
| - name: Set Terraform environment variables | |
| run: | | |
| echo "TF_VAR_alert_email=${{ vars.ALERT_EMAIL }}" >> $GITHUB_ENV | |
| echo "TF_VAR_capsolver_api_key=${{ secrets.CAPSOLVER_API_KEY }}" >> $GITHUB_ENV | |
| - name: Terraform Init | |
| working-directory: ./infra/terraform/${{ needs.determine-environment.outputs.environment_name }} | |
| run: terraform init | |
| - name: Terraform Apply | |
| working-directory: ./infra/terraform/${{ needs.determine-environment.outputs.environment_name }} | |
| run: | | |
| terraform apply -auto-approve | |
| deploy-backend: | |
| name: Deploy Backend | |
| runs-on: ubuntu-latest | |
| needs: [determine-environment, terraform-apply] | |
| environment: ${{ needs.determine-environment.outputs.environment_name }} | |
| defaults: | |
| run: | |
| working-directory: ./serverless | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Use Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| cache: 'npm' | |
| cache-dependency-path: './serverless/package-lock.json' | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Install serverless framework | |
| run: npm install -g serverless | |
| - name: Deploy with serverless compose | |
| env: | |
| SERVERLESS_ACCESS_KEY: ${{ secrets.SERVERLESS_ACCESS_KEY }} | |
| run: serverless deploy --stage ${{ needs.determine-environment.outputs.environment_name }} | |
| deploy-frontend: | |
| name: Deploy Frontend | |
| runs-on: ubuntu-latest | |
| needs: [determine-environment, deploy-backend] | |
| environment: ${{ needs.determine-environment.outputs.environment_name }} | |
| defaults: | |
| run: | |
| working-directory: ./frontend | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Use Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '20' | |
| cache: 'npm' | |
| cache-dependency-path: './frontend/package-lock.json' | |
| - name: Install dependencies | |
| run: npm ci | |
| - name: Configure AWS credentials | |
| uses: aws-actions/configure-aws-credentials@v4 | |
| with: | |
| aws-access-key-id: ${{ env.AWS_ACCESS_KEY_ID }} | |
| aws-secret-access-key: ${{ env.AWS_SECRET_ACCESS_KEY }} | |
| aws-region: us-east-2 | |
| - name: Retrieve environment values from SSM | |
| run: | | |
| # Start with a clean .env.production file | |
| echo "# ZipCase Environment Variables" > .env.production | |
| # Get Portal URL | |
| PORTAL_URL=$(aws ssm get-parameter --name "/zipcase/portal_url" --with-decryption --query "Parameter.Value" --output text) | |
| echo "VITE_PORTAL_URL=$PORTAL_URL" >> .env.production | |
| # Set API URL from environment variables | |
| echo "VITE_API_URL=${{ vars.API_BASE_URL }}" >> .env.production | |
| # Get Cognito User Pool ID | |
| USER_POOL_ID=$(aws ssm get-parameter --name "/zipcase/cognito/user_pool_id" --with-decryption --query "Parameter.Value" --output text) | |
| echo "VITE_COGNITO_USER_POOL_ID=$USER_POOL_ID" >> .env.production | |
| # Get Cognito App Client ID | |
| APP_CLIENT_ID=$(aws ssm get-parameter --name "/zipcase/cognito/app_client_id" --with-decryption --query "Parameter.Value" --output text) | |
| echo "VITE_COGNITO_CLIENT_ID=$APP_CLIENT_ID" >> .env.production | |
| # Get Portal Case URL (with fallback) | |
| PORTAL_CASE_URL=$(aws ssm get-parameter --name "/zipcase/portal_case_url" --with-decryption --query "Parameter.Value" --output text 2>/dev/null || echo "/app/RegisterOfActions") | |
| echo "VITE_PORTAL_CASE_URL=$PORTAL_CASE_URL" >> .env.production | |
| # Display the environment variables (with redacted values for security) | |
| echo "Environment variables set (values redacted):" | |
| grep -o "^VITE_[A-Z_]*=" .env.production | |
| - name: Build frontend | |
| run: npm run build | |
| - name: Deploy to S3 | |
| run: | | |
| aws s3 sync dist/ s3://zipcase-frontend-${{ needs.determine-environment.outputs.environment_name }} --delete | |
| - name: Invalidate CloudFront cache | |
| run: | | |
| DISTRIBUTION_ID=$(aws cloudfront list-distributions --query "DistributionList.Items[?Aliases.Items[?contains(@, 'zipcase')]].Id" --output text) | |
| aws cloudfront create-invalidation --distribution-id $DISTRIBUTION_ID --paths "/*" | |
| create-release: | |
| name: Create Release | |
| runs-on: ubuntu-latest | |
| if: github.ref == 'refs/heads/live' | |
| needs: [deploy-frontend] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Get version | |
| id: get-version | |
| run: | | |
| CURRENT_DATE=$(date +'%Y.%m.%d') | |
| RELEASE_COUNT=$(git tag -l "v$CURRENT_DATE.*" | wc -l) | |
| RELEASE_VERSION="v$CURRENT_DATE.$((RELEASE_COUNT + 1))" | |
| echo "version=$RELEASE_VERSION" >> $GITHUB_OUTPUT | |
| - name: Create Release | |
| uses: ncipollo/release-action@v1 | |
| with: | |
| tag: ${{ steps.get-version.outputs.version }} | |
| name: Release ${{ steps.get-version.outputs.version }} | |
| generateReleaseNotes: true |