Properly surface errors from push command

Failure exit code for `push` command is not currently forwarded as exit
code for podman-compose.
With this PR, podman-compose stops pushing when the underlying podman
command fails and forwards its exit code.

Signed-off-by: Monika Kairaityte <monika@kibit.lt>
This commit is contained in:
Monika Kairaityte
2025-07-02 19:59:10 +03:00
parent 2ed50b9538
commit 256b51c8ee
3 changed files with 29 additions and 2 deletions

View File

@ -0,0 +1 @@
Implemented forwarding failure exit code from `push` command.

View File

@ -2799,14 +2799,18 @@ async def compose_pull(compose: PodmanCompose, args: argparse.Namespace) -> None
@cmd_run(podman_compose, "push", "push stack images")
async def compose_push(compose: PodmanCompose, args: argparse.Namespace) -> None:
async def compose_push(compose: PodmanCompose, args: argparse.Namespace) -> int | None:
services = set(args.services)
status = 0
for cnt in compose.containers:
if "build" not in cnt:
continue
if services and cnt["_service"] not in services:
continue
await compose.podman.run([], "push", [cnt["image"]])
s = await compose.podman.run([], "push", [cnt["image"]])
if s is not None and s != 0:
status = s
return status
def is_context_git_url(path: str) -> bool:

View File

@ -29,3 +29,25 @@ class TestComposeBuildFailMulti(unittest.TestCase, RunSubprocessMixin):
)
self.assertIn("RUN false", str(output))
self.assertIn("while running runtime: exit status 1", str(error))
def test_push_command_fail(self) -> None:
# test that push command is able to return other than "0" return code
# "push" command fails due to several steps missing before running it (logging, tagging)
try:
output, error = self.run_subprocess_assert_returncode(
[
podman_compose_path(),
"-f",
compose_yaml_path(),
"push",
"good",
],
expected_returncode=125,
)
finally:
self.run_subprocess_assert_returncode([
podman_compose_path(),
"-f",
compose_yaml_path(),
"down",
])