<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: LaKaleigh Harris</title>
    <description>The latest articles on DEV Community by LaKaleigh Harris (@xilentdev).</description>
    <link>https://dev.to/xilentdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3239611%2Ff2a2633f-199d-4f95-96d9-b9ccac5c74b0.png</url>
      <title>DEV Community: LaKaleigh Harris</title>
      <link>https://dev.to/xilentdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xilentdev"/>
    <language>en</language>
    <item>
      <title>Shipping Your First Google ADK Agent: Deployment with Cloud Run &amp; GitHub Actions</title>
      <dc:creator>LaKaleigh Harris</dc:creator>
      <pubDate>Thu, 19 Jun 2025 07:34:10 +0000</pubDate>
      <link>https://dev.to/xilentdev/shipping-your-first-google-adk-agent-deployment-with-cloud-run-github-actions-581j</link>
      <guid>https://dev.to/xilentdev/shipping-your-first-google-adk-agent-deployment-with-cloud-run-github-actions-581j</guid>
      <description>&lt;p&gt;You’ve built your first intelligent agent with Google’s Agent Development Kit (ADK).&lt;br&gt;&lt;br&gt;
It works locally, passes its tests, and now it needs the final flourish: deployment.&lt;br&gt;&lt;br&gt;
Should you let &lt;code&gt;adk deploy cloud_run&lt;/code&gt; do the heavy lifting, or drop to &lt;code&gt;gcloud&lt;/code&gt; for full control?&lt;br&gt;&lt;br&gt;
And once it’s live, how do you automate updates and sanity-check your endpoints?&lt;/p&gt;

&lt;p&gt;This guide walks through exactly that—using our hackathon project for the Agent Development Kit Hackathon with Google Cloud : &lt;a href="https://get-hired-one.vercel.app/" rel="noopener noreferrer"&gt;&lt;strong&gt;GetHired&lt;/strong&gt;&lt;/a&gt;, a multi-agent job-search assistant, as the running example.&lt;/p&gt;


&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
Prerequisites
&lt;/li&gt;
&lt;li&gt;
Option 1: &lt;code&gt;adk deploy cloud_run&lt;/code&gt; (The Easy Button)
&lt;/li&gt;
&lt;li&gt;
Option 2: Custom Docker + &lt;code&gt;gcloud&lt;/code&gt; (Full Control)
&lt;/li&gt;
&lt;li&gt;
CI/CD with GitHub Actions
&lt;/li&gt;
&lt;li&gt;
Handling Secrets Like a Pro
&lt;/li&gt;
&lt;li&gt;
Testing Your Service
&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Google Cloud project with billing enabled
&lt;/li&gt;
&lt;li&gt;ADK-structured repository (&lt;a href="https://google.github.io/adk-docs/deploy/cloud-run/#agent-sample" rel="noopener noreferrer"&gt;sample layout&lt;/a&gt;)
&lt;/li&gt;
&lt;li&gt;GitHub repo with Actions enabled &lt;/li&gt;
&lt;li&gt;Some knowledge of Github Actions&lt;/li&gt;
&lt;li&gt;Optional: fresh coffee—builds can take a minute&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Option 1: &lt;code&gt;adk deploy cloud_run&lt;/code&gt; (The Easy Button)
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;adk deploy&lt;/code&gt; hides most boilerplate: it builds your container, sets environment variables, deploys to Cloud Run, and can toggle extras like a UI (a chat interface that allows you to create a session and interact with your agents), tracing, and artifact storage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install ADK&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;google-adk

&lt;span class="c"&gt;# Deploy from project root&lt;/span&gt;
adk deploy cloud_run my_agents &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--project&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YOUR_PROJECT_ID &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-central1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nv"&gt;$AGENT_PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ⚠️ If you decide to use this command, here are a couple of gotchas:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Interactive prompt&lt;/strong&gt; &lt;code&gt;adk deploy&lt;/code&gt; asks whether to allow unauthenticated traffic. In CI you’ll need to pre-answer (e.g., &lt;code&gt;yes | adk deploy ...&lt;/code&gt;).
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent path sanity&lt;/strong&gt; &lt;code&gt;$AGENT_PATH&lt;/code&gt; must contain an &lt;code&gt;__init__.py&lt;/code&gt; and your main agent file.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IAM bare minimum&lt;/strong&gt; - hopefully this saves you a few iterations&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Why you need it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;roles/run.admin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create/update Cloud Run services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;roles/iam.serviceAccountUser&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Impersonate the service account that actually runs the container&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;roles/cloudbuild.builds.editor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Kick off Cloud Build jobs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;roles/artifactregistry.writer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Push the built image&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Option 2: Custom Dockerfile + gcloud (Full Control)
&lt;/h2&gt;

&lt;p&gt;It gives you full control: specify build steps, fine-tune IAM roles, tweak concurrency settings, and wrestle with YAML. More power, more responsibility. If something breaks, congrats—you now own it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; python:3.11-slim&lt;/span&gt;

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PORT=8080 PYTHONUNBUFFERED=1 GOOGLE_GENAI_USE_VERTEXAI=true TIMEOUT=300&lt;/span&gt;

&lt;span class="c"&gt;# OS deps&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; curl gnupg &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# Node (for Firebase MCP helper)&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://deb.nodesource.com/setup_lts.x | bash - &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;     apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nodejs &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get clean &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# Python deps&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; jobsearch_agents/requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Node deps&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; jobsearch_agents/package*.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt; @gannonh/firebase-mcp

&lt;span class="c"&gt;# App code&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; template/ ./template/&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; jobsearch_agents/ .&lt;/span&gt;

&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; ${PORT}&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["python", "-m", "coordinator", "--host=0.0.0.0", "--port=8080"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The companion &lt;code&gt;requirements.txt&lt;/code&gt; lives in the same directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;google-adk&amp;gt;=1.1.1
google-genai&amp;gt;=1.5.0
google-cloud-bigquery&amp;gt;=3.31.0
# …snip…
firebase-admin&amp;gt;=6.4.0
google-cloud-storage&amp;gt;=2.10.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  CI/CD with GitHub Actions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Workflow Overview
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Target&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;push&lt;/code&gt; to &lt;code&gt;main&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;build → deploy-production&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pull_request&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;build → deploy-staging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Staging&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Authentication &amp;amp; Environment Setup
&lt;/h3&gt;

&lt;p&gt;Both build and deployment jobs begin by authenticating with GCP and setting up the necessary CLI tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auth&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;google-github-actions/auth@v2&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;credentials_json&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;${{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;secrets.GCP_CREDENTIALS&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}'&lt;/span&gt;
    &lt;span class="na"&gt;export_environment_variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;cleanup_credentials&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Set up Google Cloud SDK&lt;/span&gt;
  &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;google-github-actions/setup-gcloud@v2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key Points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GCP service account credentials are securely loaded via GitHub Secrets.&lt;/li&gt;
&lt;li&gt;These credentials are exported to the environment for use by the gcloud CLI, and they get cleaned up by the action post-run.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Docker Image Build &amp;amp; Push
&lt;/h3&gt;

&lt;p&gt;The build job performs the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Builds and tags a Docker image&lt;/li&gt;
&lt;li&gt;Pushes the image to Google Container Registry
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and Push Docker Image&lt;/span&gt;
        &lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
        &lt;span class="s"&gt;working-directory&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.workspace }}&lt;/span&gt;
        &lt;span class="s"&gt;run&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;# Build Docker image from project root to access template directory&lt;/span&gt;
          &lt;span class="s"&gt;IMAGE_NAME="gcr.io/$GOOGLE_CLOUD_PROJECT/gethired-agents"&lt;/span&gt;
          &lt;span class="s"&gt;IMAGE_TAG="${{ github.sha }}"&lt;/span&gt;

          &lt;span class="s"&gt;docker build -f jobsearch_agents/Dockerfile -t ${IMAGE_NAME}:${IMAGE_TAG} .&lt;/span&gt;
          &lt;span class="s"&gt;docker tag ${IMAGE_NAME}:${IMAGE_TAG} ${IMAGE_NAME}:latest&lt;/span&gt;

          &lt;span class="s"&gt;# Configure docker to use gcloud credentials&lt;/span&gt;
          &lt;span class="s"&gt;gcloud auth configure-docker gcr.io -q&lt;/span&gt;

          &lt;span class="s"&gt;# Push images to Google Container Registry&lt;/span&gt;
          &lt;span class="s"&gt;docker push ${IMAGE_NAME}:${IMAGE_TAG}&lt;/span&gt;
          &lt;span class="s"&gt;docker push ${IMAGE_NAME}:latest&lt;/span&gt;

          &lt;span class="s"&gt;echo "image=${IMAGE_NAME}:${IMAGE_TAG}" &amp;gt;&amp;gt; $GITHUB_OUTPUT&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker image tagged with SHA and latest&lt;/li&gt;
&lt;li&gt;Image URL passed to subsequent deploy jobs via outputs.image&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deploy to Google Cloud Run
&lt;/h3&gt;

&lt;p&gt;Two deployment jobs handle release to staging and production:&lt;/p&gt;

&lt;p&gt;✅ Deploy-Staging&lt;br&gt;
Triggered by: pull_request&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
gcloud run deploy gethired-agents-staging &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="p"&gt;{ needs.build.outputs.image &lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-central1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--allow-unauthenticated&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2Gi &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cpu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2.0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set-env-vars&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The snippet above is an example of a staging/ testing container that we used to test a change. Here are a few key takeaways&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses moderate resources&lt;/li&gt;
&lt;li&gt;Deploys the same Docker image as built&lt;/li&gt;
&lt;li&gt;Sets necessary environment variables like:&lt;/li&gt;
&lt;li&gt;GOOGLE_CLOUD_LOCATION&lt;/li&gt;
&lt;li&gt;FIREBASE_SERVICE_ACCOUNT_KEY # if you're using the Firebase MCP with your agents&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  💡For production, you might want to give attention to giving your containers more resources, setting min-instances to reduce cold starts, and using a secret manager alongside your service.
&lt;/h4&gt;




&lt;p&gt;Speaking of it...&lt;/p&gt;

&lt;h3&gt;
  
  
  Handling Secrets Like a Pro
&lt;/h3&gt;

&lt;p&gt;Use Google Secret Manager for secure credential management in production.&lt;br&gt;
Via the &lt;code&gt;gcloud run deploy&lt;/code&gt; command, you can grab stored secrets and set them as environment variables or mount them as files within your Cloud Run containers. To do the ladder, you can add this parameter to your &lt;code&gt;gcloud run deploy&lt;/code&gt; command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--update-secrets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;&lt;span class="nt"&gt;-TO-SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;secret-service-account-key:&amp;lt;version&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is how to expose the secret as an environment variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcloud run deploy SERVICE &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--image&lt;/span&gt; IMAGE_URL &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--update-secrets&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;ENV_VAR_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;SECRET_NAME:VERSION
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't forget to allow Cloud Run to access the secret by adding the following role to your service account in addition to the roles mentioned previously in this post:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Secret Manager Secret Accessor (roles/secretmanager.secretAccessor)&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing Your Service
&lt;/h2&gt;

&lt;p&gt;Ready to test them out? Here are a couple of ways you can test your agents without the attached UI:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Swagger UI&lt;/strong&gt; Visit &lt;code&gt;&amp;lt;SERVICE_URL&amp;gt;/docs&lt;/code&gt; test your endpoints.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Curl one-liner&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SERVICE_URL&lt;/span&gt;&lt;span class="s2"&gt;/run"&lt;/span&gt;   &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt;   &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"message":"Hello, agent!"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the response looks good, your agent is live.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;You now have two paths to production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;adk deploy cloud_run&lt;/code&gt;&lt;/strong&gt; when speed &amp;gt; need for control and additional tools in your environments. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Docker + &lt;code&gt;gcloud&lt;/code&gt;&lt;/strong&gt; when control &amp;gt; convenience
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Either way, your agents are ready to power UIs, talk to other agents, or whatever else you dream up.&lt;/p&gt;

&lt;p&gt;👀&lt;br&gt;
Have you deployed an agent using the ADK yet? How was your experience?&lt;/p&gt;

&lt;p&gt;Stay tuned for a follow-up on &lt;strong&gt;Agent Engine&lt;/strong&gt;, Google Cloud’s managed runtime that handles sessions, scaling, and leaves you free to build smarter agents.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>googlecloud</category>
      <category>githubactions</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
