#!/bin/bash
# Deploy Activity Feed Ingestion Cloud Run Job
#
# This job populates the Supabase activity_items table with parliamentary
# activity data (votes, bill updates, committee meetings) from Neo4j.
#
# Usage: ./scripts/deploy-activity-feed-ingestion.sh
#
# Secrets are fetched from Google Cloud Secret Manager:
# - neo4j-password
# - supabase-url
# - supabase-service-role-key
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="activity-feed-ingestion"
VPC_CONNECTOR="canadagpt-vpc-connector"
echo -e "${BLUE}============================================${NC}"
echo -e "${BLUE} Deploying Activity Feed Ingestion 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 secrets exist
echo -e "${YELLOW}→ Verifying secrets in Secret Manager...${NC}"
REQUIRED_SECRETS=("neo4j-password" "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}✓ All required secrets exist${NC}"
# 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-activity-feed-ingestion.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/activity-feed-ingestion:latest \
--region=$REGION \
--project=$PROJECT_ID \
--memory=1Gi \
--cpu=1 \
--task-timeout=15m \
--max-retries=1 \
--vpc-connector=$VPC_CONNECTOR \
--set-env-vars="NEO4J_URI=bolt://10.128.0.3:7687,NEO4J_USERNAME=neo4j,ACTIVITY_LOOKBACK_DAYS=7" \
--set-secrets="NEO4J_PASSWORD=neo4j-password:latest,SUPABASE_URL=supabase-url:latest,SUPABASE_SERVICE_ROLE_KEY=supabase-service-role-key:latest"
else
echo " Creating new job..."
gcloud run jobs create $JOB_NAME \
--image=us-central1-docker.pkg.dev/$PROJECT_ID/canadagpt/activity-feed-ingestion:latest \
--region=$REGION \
--project=$PROJECT_ID \
--memory=1Gi \
--cpu=1 \
--task-timeout=15m \
--max-retries=1 \
--vpc-connector=$VPC_CONNECTOR \
--set-env-vars="NEO4J_URI=bolt://10.128.0.3:7687,NEO4J_USERNAME=neo4j,ACTIVITY_LOOKBACK_DAYS=7" \
--set-secrets="NEO4J_PASSWORD=neo4j-password:latest,SUPABASE_URL=supabase-url:latest,SUPABASE_SERVICE_ROLE_KEY=supabase-service-role-key:latest"
fi
echo -e "${GREEN}✓ Cloud Run job configured${NC}"
echo ""
echo -e "${YELLOW}→ Setting up Cloud Scheduler (4x daily at 5am, 11am, 5pm, 11pm UTC)...${NC}"
# Check if scheduler job exists
SCHEDULER_JOB="activity-feed-daily"
if gcloud scheduler jobs describe $SCHEDULER_JOB --location=$REGION --project=$PROJECT_ID &>/dev/null; then
echo " Updating existing scheduler job..."
gcloud scheduler jobs update http $SCHEDULER_JOB \
--location=$REGION \
--project=$PROJECT_ID \
--schedule="0 5,11,17,23 * * *" \
--time-zone="UTC" \
--uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/$JOB_NAME:run" \
--http-method=POST \
--oauth-service-account-email="$PROJECT_ID@appspot.gserviceaccount.com"
else
echo " Creating new scheduler job..."
gcloud scheduler jobs create http $SCHEDULER_JOB \
--location=$REGION \
--project=$PROJECT_ID \
--schedule="0 5,11,17,23 * * *" \
--time-zone="UTC" \
--uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/$JOB_NAME:run" \
--http-method=POST \
--oauth-service-account-email="$PROJECT_ID@appspot.gserviceaccount.com"
fi
echo -e "${GREEN}✓ Cloud Scheduler 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}Schedule:${NC} 4x daily at 5am, 11am, 5pm, 11pm UTC"
echo ""
echo -e "${GREEN}Commands:${NC}"
echo " Manual trigger:"
echo " gcloud run jobs execute $JOB_NAME --region=$REGION"
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}"