diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..47d3a31 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +# --- Final Runtime Image --- +# Using python:3.11 as the base image to support evaluations that require Python, +# while still running the pre-compiled Go binary for the toolbox server. +FROM python:3.11 + +# Install necessary runtime certificates, standard C libraries, and curl +RUN apt-get update && apt-get install -y ca-certificates libc6 curl && rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +# Dynamically fetch the latest version and download the binary +RUN LATEST_VERSION=$(curl -s https://api.github.com/repos/googleapis/mcp-toolbox/releases/latest | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') && \ + curl -L https://storage.googleapis.com/mcp-toolbox-for-databases/${LATEST_VERSION}/linux/amd64/toolbox -o /app/toolbox +RUN chmod +x /app/toolbox + +# Copy the extension's skills and configuration into the container +COPY skills/ ./skills/ +COPY gemini-extension.json . + +# Add required tools.yaml placeholder to satisfy binary startup checks +RUN touch tools.yaml + +# Expose HTTP API and UI endpoints to successfully pass Cloud Run health checks +ENTRYPOINT ["/app/toolbox", "--prebuilt", "cloud-sql-postgres", "--address=0.0.0.0", "--port=8080", "--enable-api", "--ui"] diff --git a/cloudbuild.yaml b/cloudbuild.yaml new file mode 100644 index 0000000..1373f52 --- /dev/null +++ b/cloudbuild.yaml @@ -0,0 +1,96 @@ +steps: + + # --- STEP 1: Build and Push Docker Image --- + - name: 'gcr.io/cloud-builders/docker' + args: + - 'build' + - '-t' + - 'us-central1-docker.pkg.dev/$PROJECT_ID/toolbox-evals/cloud-sql-postgresql:latest' + - '.' + + - name: 'gcr.io/cloud-builders/docker' + args: + - 'push' + - 'us-central1-docker.pkg.dev/$PROJECT_ID/toolbox-evals/cloud-sql-postgresql:latest' + + # --- STEP 2: Deploy to Cloud Run --- + - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' + entrypoint: gcloud + args: + - 'run' + - 'deploy' + - 'cloud-sql-postgresql-server' + - '--image=us-central1-docker.pkg.dev/$PROJECT_ID/toolbox-evals/cloud-sql-postgresql:latest' + - '--region=us-central1' + - '--no-allow-unauthenticated' + - '--port=8080' + - '--timeout=300' + - '--set-env-vars=CLOUD_SQL_POSTGRES_PROJECT=$PROJECT_ID,CLOUD_SQL_POSTGRES_INSTANCE=omkar-demo-postgres-1,CLOUD_SQL_POSTGRES_REGION=us-central1,CLOUD_SQL_POSTGRES_DATABASE=postgres,CLOUD_SQL_POSTGRES_USER=postgres,CLOUD_SQL_POSTGRES_IP_TYPE=PUBLIC' + - '--set-secrets=CLOUD_SQL_POSTGRES_PASSWORD=cloud-sql-postgres-password:latest' + + # --- STEP 3: Fully Integrated Evaluation to Persist Results --- + - name: 'us-central1-docker.pkg.dev/$PROJECT_ID/toolbox-evals/eval_server:latest' + entrypoint: 'bash' + secretEnv: ['DB_PASSWORD'] + args: + - '-c' + - | + set -e + cd /evalbench + + export EVAL_GCP_PROJECT_ID=$PROJECT_ID + export EVAL_GCP_PROJECT_REGION=us-central1 + + echo "Compiling protobuf files..." + python3 -m grpc_tools.protoc --proto_path=evalbench/evalproto --python_out=evalbench/evalproto --grpc_python_out=evalbench/evalproto evalbench/evalproto/*.proto + + echo "Patching client to use insecure credentials..." + # sed -i 's/"localhost:50051"/"127.0.0.1:50051"/g' evalbench/client/eval_client.py + sed -i 's/grpc.alts_channel_credentials()/None/g' evalbench/client/eval_client.py + sed -i 's/grpc.aio.secure_channel(address, channel_creds)/grpc.aio.insecure_channel(address)/g' evalbench/client/eval_client.py + + echo "Patching server to listen on all IPv4 interfaces (0.0.0.0)..." + sed -i 's/"\[::\]:%s"/"0.0.0.0:%s"/g' /evalbench/evalbench/eval_server.py + echo "Checking bind success in server (writing to stderr)..." + sed -i 's|server.add_insecure_port("0.0.0.0:%s" % PORT)|bound_port = server.add_insecure_port("0.0.0.0:%s" % PORT)\n import sys\n sys.stderr.write(f"BOUND_PORT: {bound_port}\\n")\n if bound_port == 0: raise RuntimeError("Failed to bind to port!")|' /evalbench/evalbench/eval_server.py + + cd evalbench + export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python + export PYTHONPATH=./evalproto:. + export CLOUD_RUN=True + export PORT=50051 + + + + echo "Starting Evaluation Server in background..." + # NEW: Added