#!/bin/bash
# Deploy PageSpeed Monitor Cloud Run Job
#
# This job runs PageSpeed Insights on key CanadaGPT pages after deployments
# to detect performance regressions and create GitHub issues.
#
# Usage: ./scripts/deploy-pagespeed-monitor.sh
#
# Secrets are fetched from Google Cloud Secret Manager:
# - supabase-url
# - supabase-service-role-key
# - github-token (optional, for creating issues)
# - pagespeed-api-key (optional, for higher quota)
set -e
# Color codes for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
PROJECT_ID="canada-gpt-ca"
REGION="us-central1"
JOB_NAME="pagespeed-monitor"
echo -e "${BLUE}============================================${NC}"
echo -e "${BLUE} Deploying PageSpeed Monitor Job${NC}"
echo -e "${BLUE}============================================${NC}"
echo ""
# Check if gcloud is authenticated
echo -e "${YELLOW}→ Checking GCP authentication...${NC}"
if ! gcloud auth list --filter=status:ACTIVE --format="value(account)" | grep -q .; then
echo -e "${RED}✗ Not authenticated with gcloud. Please run:${NC}"
echo -e "${RED} gcloud auth login${NC}"
exit 1
fi
echo -e "${GREEN}✓ Authenticated${NC}"
# Set project
gcloud config set project ${PROJECT_ID} --quiet
# Verify required secrets exist
echo -e "${YELLOW}→ Verifying secrets in Secret Manager...${NC}"
REQUIRED_SECRETS=("supabase-url" "supabase-service-role-key")
for secret in "${REQUIRED_SECRETS[@]}"; do
if ! gcloud secrets describe ${secret} --project=${PROJECT_ID} &>/dev/null; then
echo -e "${RED}✗ Secret '${secret}' not found in Secret Manager${NC}"
echo -e "${RED} Create it with: gcloud secrets create ${secret} --data-file=-${NC}"
exit 1
fi
done
echo -e "${GREEN}✓ Required secrets exist${NC}"
# Check for optional secrets
OPTIONAL_SECRETS=("github-token" "pagespeed-api-key")
SECRETS_FLAG="SUPABASE_URL=supabase-url:latest,SUPABASE_SERVICE_ROLE_KEY=supabase-service-role-key:latest"
for secret in "${OPTIONAL_SECRETS[@]}"; do
if gcloud secrets describe ${secret} --project=${PROJECT_ID} &>/dev/null 2>&1; then
echo -e "${GREEN}✓ Optional secret '${secret}' found${NC}"
if [ "$secret" = "github-token" ]; then
SECRETS_FLAG="${SECRETS_FLAG},GITHUB_TOKEN=${secret}:latest"
elif [ "$secret" = "pagespeed-api-key" ]; then
SECRETS_FLAG="${SECRETS_FLAG},PAGESPEED_API_KEY=${secret}:latest"
fi
else
echo -e "${YELLOW}⚠ Optional secret '${secret}' not found (feature will be disabled)${NC}"
fi
done
# Navigate to data-pipeline directory
cd "$(dirname "$0")/../packages/data-pipeline"
echo ""
echo -e "${YELLOW}→ Building and pushing Docker image...${NC}"
gcloud builds submit \
--config=cloudbuild-pagespeed-monitor.yaml \
--project=$PROJECT_ID
echo ""
echo -e "${YELLOW}→ Creating/updating Cloud Run job...${NC}"
# Check if job exists
if gcloud run jobs describe $JOB_NAME --region=$REGION --project=$PROJECT_ID &>/dev/null; then
echo " Updating existing job..."
gcloud run jobs update $JOB_NAME \
--image=us-central1-docker.pkg.dev/$PROJECT_ID/canadagpt/pagespeed-monitor:latest \
--region=$REGION \
--project=$PROJECT_ID \
--memory=512Mi \
--cpu=1 \
--task-timeout=30m \
--max-retries=1 \
--set-env-vars="SITE_URL=https://canadagpt.ca,GITHUB_REPO=northernvariables/CanadaGPT" \
--set-secrets="$SECRETS_FLAG"
else
echo " Creating new job..."
gcloud run jobs create $JOB_NAME \
--image=us-central1-docker.pkg.dev/$PROJECT_ID/canadagpt/pagespeed-monitor:latest \
--region=$REGION \
--project=$PROJECT_ID \
--memory=512Mi \
--cpu=1 \
--task-timeout=30m \
--max-retries=1 \
--set-env-vars="SITE_URL=https://canadagpt.ca,GITHUB_REPO=northernvariables/CanadaGPT" \
--set-secrets="$SECRETS_FLAG"
fi
echo -e "${GREEN}✓ Cloud Run job configured${NC}"
echo ""
echo -e "${BLUE}============================================${NC}"
echo -e "${BLUE} Deployment Complete!${NC}"
echo -e "${BLUE}============================================${NC}"
echo ""
echo -e "${GREEN}Job:${NC} $JOB_NAME"
echo -e "${GREEN}Trigger:${NC} After frontend/API deployments (manual or automated)"
echo ""
echo -e "${GREEN}Commands:${NC}"
echo " Manual trigger (after deployment):"
echo " gcloud run jobs execute $JOB_NAME --region=$REGION \\"
echo " --update-env-vars='DEPLOYMENT_TYPE=manual,COMMIT_SHA=abc123'"
echo ""
echo " Dry run (no storage/issues):"
echo " gcloud run jobs execute $JOB_NAME --region=$REGION \\"
echo " --update-env-vars='DRY_RUN=true'"
echo ""
echo " View logs:"
echo " gcloud logging read 'resource.type=cloud_run_job AND resource.labels.job_name=$JOB_NAME' --limit=50"
echo ""
echo -e "${GREEN}Deployment completed successfully! 🎉${NC}"