To make the CI/CD workflow function correctly, configure the following secret in your GitHub repository:
- Go to your GitHub repository
- Click Settings → Secrets and variables → Actions
- Click New repository secret
- Add
GCP_SA_KEYwith the full JSON contents of your Service Account key
export PROJECT_ID="p-brecha-251-219-11-cd"
# Enable Secret Manager API (IMPORTANT - required for secrets)
gcloud services enable secretmanager.googleapis.com --project=$PROJECT_ID
# Enable Cloud Run API
gcloud services enable run.googleapis.com --project=$PROJECT_ID
# Enable Artifact Registry API
gcloud services enable artifactregistry.googleapis.com --project=$PROJECT_IDPROJECT_ID="p-brecha-251-219-11-cd"
# Create GEMINI_API_KEY secret
echo -n "your-gemini-api-key-here" | gcloud secrets create GEMINI_API_KEY \
--data-file=- \
--project=$PROJECT_ID \
--replication-policy="automatic"
# Create GEMINI_MODEL_NAME secret
echo -n "gemini-2.0-flash-exp" | gcloud secrets create GEMINI_MODEL_NAME \
--data-file=- \
--project=$PROJECT_ID \
--replication-policy="automatic"PROJECT_ID="p-brecha-251-219-11-cd"
SERVICE_ACCOUNT="github-ci-service@${PROJECT_ID}.iam.gserviceaccount.com"
# Grant Secret Manager Secret Accessor role for GEMINI_API_KEY
gcloud secrets add-iam-policy-binding GEMINI_API_KEY \
--member=serviceAccount:$SERVICE_ACCOUNT \
--role=roles/secretmanager.secretAccessor \
--project=$PROJECT_ID
# Grant Secret Manager Secret Accessor role for GEMINI_MODEL_NAME
gcloud secrets add-iam-policy-binding GEMINI_MODEL_NAME \
--member=serviceAccount:$SERVICE_ACCOUNT \
--role=roles/secretmanager.secretAccessor \
--project=$PROJECT_ID# List all secrets
gcloud secrets list --project=$PROJECT_ID
# Verify permissions
gcloud secrets get-iam-policy GEMINI_API_KEY --project=$PROJECT_ID
gcloud secrets get-iam-policy GEMINI_MODEL_NAME --project=$PROJECT_ID| Branch | Environment | Project | Service Name |
|---|---|---|---|
main |
production | p-brecha-251-219-11-cd |
brecha-ai-service-py-prod |
dev |
development | d-brecha-251-219-11-CD |
brecha-ai-service-py-dev |
When you push to main or dev, GitHub Actions:
- Builds Docker image and tags with commit SHA
- Pushes to Artifact Registry
- Deploys to Cloud Run with:
- Environment variables (ENVIRONMENT, LOG_LEVEL, etc.)
- Secrets from Secret Manager (GEMINI_API_KEY, GEMINI_MODEL_NAME)
- Verifies deployment with health check
Public Variables (set-env-vars):
- ENVIRONMENT: production or development
- LOG_LEVEL: INFO or DEBUG
- ALLOWED_ORIGINS: *
- GEMINI_MAX_RETRIES: 5 (prod) or 3 (dev)
- GEMINI_RETRY_DELAY: 3 (prod) or 2 (dev)
Secret Variables (set-secrets):
- GEMINI_API_KEY: From Secret Manager
- GEMINI_MODEL_NAME: From Secret Manager
Note: PORT is automatically set to 8080 by Cloud Run
After first deployment, configure public access manually via Google Cloud Console or gcloud:
Option 1: Google Cloud Console
- Go to Cloud Run Console
- Select your service (e.g.,
brecha-ai-service-py-prod) - Click Security tab
- Under Authentication, select Allow unauthenticated invocations
- Click Save
Option 2: gcloud Command
# For Production
gcloud run services add-iam-policy-binding brecha-ai-service-py-prod \
--region=us-central1 \
--member="allUsers" \
--role="roles/run.invoker" \
--project=p-brecha-251-219-11-cd
# For Development
gcloud run services add-iam-policy-binding brecha-ai-service-py-dev \
--region=us-central1 \
--member="allUsers" \
--role="roles/run.invoker" \
--project=d-brecha-251-219-11-CDNote: This is done manually for security reasons, requiring explicit authorization for public access.
# Build the image
docker build -t brecha-ai-service-py:latest .
# Run the container
docker run -d --rm -p 8080:8080 \
--env-file .env \
--name brecha-ai-test \
brecha-ai-service-py:latest
# Test the health check
curl http://localhost:8080/health
# View logs
docker logs brecha-ai-test
# Stop the container
docker stop brecha-ai-test- Cause: Secret Manager API is not enabled
- Solution: Run the "Enable Required APIs" commands above
- Note: Wait 1-2 minutes for propagation after enabling
- Cause: Service account doesn't have access to the secret
- Solution: Run the "Grant Permissions" commands above
- Note: Wait 1-2 minutes for permissions to propagate
- Cause: The GitHub secret is not configured
- Solution: Add
GCP_SA_KEYto GitHub Settings → Secrets and variables → Actions
# Describe the service
gcloud run services describe brecha-ai-service-py-prod \
--region us-central1 \
--project p-brecha-251-219-11-cd
# View recent logs
gcloud run services logs read brecha-ai-service-py-prod \
--region us-central1 \
--project p-brecha-251-219-11-cd \
--limit 50
# Test the service URL
SERVICE_URL=$(gcloud run services describe brecha-ai-service-py-prod \
--region us-central1 \
--project p-brecha-251-219-11-cd \
--format 'value(status.url)')
curl -f $SERVICE_URL/health