From 6c784ca0cae618e2ed2a65b2ad052400f7ed98f7 Mon Sep 17 00:00:00 2001 From: anrzeszutek Date: Thu, 13 Nov 2025 09:39:23 +0100 Subject: [PATCH 1/4] Fix cloud run deploy on Windows --- src/google/adk/cli/cli_deploy.py | 15 +++++++++++++-- .../cli/utils/test_cli_deploy_to_cloud_run.py | 8 +++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/google/adk/cli/cli_deploy.py b/src/google/adk/cli/cli_deploy.py index 335c786b9f..d7b638ee25 100644 --- a/src/google/adk/cli/cli_deploy.py +++ b/src/google/adk/cli/cli_deploy.py @@ -24,6 +24,7 @@ import click from packaging.version import parse +IS_WINDOWS = os.name == 'nt' _DOCKERFILE_TEMPLATE: Final[str] = """ FROM python:3.11-slim WORKDIR /app @@ -372,8 +373,13 @@ def _resolve_project(project_in_option: Optional[str]) -> str: if project_in_option: return project_in_option + if IS_WINDOWS: + gcloud_cmd = 'gcloud.cmd' + else: + gcloud_cmd = 'gcloud' + result = subprocess.run( - ['gcloud', 'config', 'get-value', 'project'], + [gcloud_cmd, 'config', 'get-value', 'project'], check=True, capture_output=True, text=True, @@ -578,9 +584,14 @@ def to_cloud_run( # Validate that extra gcloud args don't conflict with ADK-managed args _validate_gcloud_extra_args(extra_gcloud_args, adk_managed_args) + if IS_WINDOWS: + gcloud = 'gcloud.cmd' + else: + gcloud = 'gcloud' + # Build the command with extra gcloud args gcloud_cmd = [ - 'gcloud', + gcloud, 'run', 'deploy', service_name, diff --git a/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py b/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py index cc5c30c23d..12ac928a3b 100644 --- a/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py +++ b/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py @@ -21,6 +21,7 @@ import shutil import subprocess import tempfile +import os from typing import Any from typing import Dict from typing import List @@ -172,8 +173,13 @@ def test_to_cloud_run_happy_path( assert len(run_recorder.calls) == 1 gcloud_args = run_recorder.get_last_call_args()[0] + if os.name == "nt": + gcloud_cmd = "gcloud.cmd" + else: + gcloud_cmd = "gcloud" + expected_gcloud_command = [ - "gcloud", + gcloud_cmd, "run", "deploy", "svc", From 71f77482317d7de22c0e00782a21a20ea9363c6e Mon Sep 17 00:00:00 2001 From: anrzeszutek Date: Thu, 13 Nov 2025 10:47:24 +0100 Subject: [PATCH 2/4] Remove code duplication --- src/google/adk/cli/cli_deploy.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/google/adk/cli/cli_deploy.py b/src/google/adk/cli/cli_deploy.py index d7b638ee25..39ec78fc4a 100644 --- a/src/google/adk/cli/cli_deploy.py +++ b/src/google/adk/cli/cli_deploy.py @@ -25,6 +25,8 @@ from packaging.version import parse IS_WINDOWS = os.name == 'nt' +GCLOUD_CMD = 'gcloud.cmd' if IS_WINDOWS else 'gcloud' + _DOCKERFILE_TEMPLATE: Final[str] = """ FROM python:3.11-slim WORKDIR /app @@ -373,13 +375,8 @@ def _resolve_project(project_in_option: Optional[str]) -> str: if project_in_option: return project_in_option - if IS_WINDOWS: - gcloud_cmd = 'gcloud.cmd' - else: - gcloud_cmd = 'gcloud' - result = subprocess.run( - [gcloud_cmd, 'config', 'get-value', 'project'], + [GCLOUD_CMD, 'config', 'get-value', 'project'], check=True, capture_output=True, text=True, @@ -584,14 +581,9 @@ def to_cloud_run( # Validate that extra gcloud args don't conflict with ADK-managed args _validate_gcloud_extra_args(extra_gcloud_args, adk_managed_args) - if IS_WINDOWS: - gcloud = 'gcloud.cmd' - else: - gcloud = 'gcloud' - # Build the command with extra gcloud args gcloud_cmd = [ - gcloud, + GCLOUD_CMD, 'run', 'deploy', service_name, From ed802c87b259288b7ecb10f31262cf9c7637d405 Mon Sep 17 00:00:00 2001 From: anrzeszutek Date: Thu, 13 Nov 2025 10:47:24 +0100 Subject: [PATCH 3/4] Remove code duplication --- src/google/adk/cli/cli_deploy.py | 16 ++++------------ .../cli/utils/test_cli_deploy_to_cloud_run.py | 8 +------- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/src/google/adk/cli/cli_deploy.py b/src/google/adk/cli/cli_deploy.py index d7b638ee25..39ec78fc4a 100644 --- a/src/google/adk/cli/cli_deploy.py +++ b/src/google/adk/cli/cli_deploy.py @@ -25,6 +25,8 @@ from packaging.version import parse IS_WINDOWS = os.name == 'nt' +GCLOUD_CMD = 'gcloud.cmd' if IS_WINDOWS else 'gcloud' + _DOCKERFILE_TEMPLATE: Final[str] = """ FROM python:3.11-slim WORKDIR /app @@ -373,13 +375,8 @@ def _resolve_project(project_in_option: Optional[str]) -> str: if project_in_option: return project_in_option - if IS_WINDOWS: - gcloud_cmd = 'gcloud.cmd' - else: - gcloud_cmd = 'gcloud' - result = subprocess.run( - [gcloud_cmd, 'config', 'get-value', 'project'], + [GCLOUD_CMD, 'config', 'get-value', 'project'], check=True, capture_output=True, text=True, @@ -584,14 +581,9 @@ def to_cloud_run( # Validate that extra gcloud args don't conflict with ADK-managed args _validate_gcloud_extra_args(extra_gcloud_args, adk_managed_args) - if IS_WINDOWS: - gcloud = 'gcloud.cmd' - else: - gcloud = 'gcloud' - # Build the command with extra gcloud args gcloud_cmd = [ - gcloud, + GCLOUD_CMD, 'run', 'deploy', service_name, diff --git a/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py b/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py index 12ac928a3b..c17935c1ee 100644 --- a/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py +++ b/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py @@ -21,7 +21,6 @@ import shutil import subprocess import tempfile -import os from typing import Any from typing import Dict from typing import List @@ -173,13 +172,8 @@ def test_to_cloud_run_happy_path( assert len(run_recorder.calls) == 1 gcloud_args = run_recorder.get_last_call_args()[0] - if os.name == "nt": - gcloud_cmd = "gcloud.cmd" - else: - gcloud_cmd = "gcloud" - expected_gcloud_command = [ - gcloud_cmd, + cli_deploy.GCLOUD_CMD, "run", "deploy", "svc", From 679536494d033d0115fba71e7945dfbe479e909c Mon Sep 17 00:00:00 2001 From: anrzeszutek Date: Fri, 14 Nov 2025 09:32:16 +0100 Subject: [PATCH 4/4] Change variable names to be consistent --- src/google/adk/cli/cli_deploy.py | 8 ++++---- tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/google/adk/cli/cli_deploy.py b/src/google/adk/cli/cli_deploy.py index 39ec78fc4a..bfbf84d1ab 100644 --- a/src/google/adk/cli/cli_deploy.py +++ b/src/google/adk/cli/cli_deploy.py @@ -24,8 +24,8 @@ import click from packaging.version import parse -IS_WINDOWS = os.name == 'nt' -GCLOUD_CMD = 'gcloud.cmd' if IS_WINDOWS else 'gcloud' +_IS_WINDOWS = os.name == 'nt' +_GCLOUD_CMD = 'gcloud.cmd' if _IS_WINDOWS else 'gcloud' _DOCKERFILE_TEMPLATE: Final[str] = """ FROM python:3.11-slim @@ -376,7 +376,7 @@ def _resolve_project(project_in_option: Optional[str]) -> str: return project_in_option result = subprocess.run( - [GCLOUD_CMD, 'config', 'get-value', 'project'], + [_GCLOUD_CMD, 'config', 'get-value', 'project'], check=True, capture_output=True, text=True, @@ -583,7 +583,7 @@ def to_cloud_run( # Build the command with extra gcloud args gcloud_cmd = [ - GCLOUD_CMD, + _GCLOUD_CMD, 'run', 'deploy', service_name, diff --git a/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py b/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py index c17935c1ee..17e91e988f 100644 --- a/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py +++ b/tests/unittests/cli/utils/test_cli_deploy_to_cloud_run.py @@ -173,7 +173,7 @@ def test_to_cloud_run_happy_path( gcloud_args = run_recorder.get_last_call_args()[0] expected_gcloud_command = [ - cli_deploy.GCLOUD_CMD, + cli_deploy._GCLOUD_CMD, "run", "deploy", "svc",