From 939a14f2415b00b7e486ac77a44b186c604b660c Mon Sep 17 00:00:00 2001 From: Miroslav Simek <3385642+mesemus@users.noreply.github.com> Date: Sun, 22 Mar 2026 09:12:21 +0100 Subject: [PATCH 1/2] feat: introduced no-op service helper. * Inside k8s, services setup could not be used because docker client is always initialized and it fails if docker is not accessible * Introduced no-op implementation for this usecase --- invenio_cli/cli/services.py | 7 ++++++- invenio_cli/helpers/docker_helper.py | 27 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/invenio_cli/cli/services.py b/invenio_cli/cli/services.py index 722615fa..709f7e2b 100644 --- a/invenio_cli/cli/services.py +++ b/invenio_cli/cli/services.py @@ -10,6 +10,7 @@ import click from ..commands import ServicesCommands +from ..helpers.docker_helper import NoOpDockerHelper from .utils import pass_cli_config, run_steps @@ -61,7 +62,11 @@ def setup(cli_config, force, no_demo_data, stop_services, services): """Setup local services.""" # no_demo_data = False (default) means "YES to demo_data" demo_data = not no_demo_data - commands = ServicesCommands(cli_config) + if not services: + docker_helper = NoOpDockerHelper() + else: + docker_helper = None + commands = ServicesCommands(cli_config, docker_helper=docker_helper) steps = commands.setup(force, demo_data, stop_services, services) on_fail = "Failed to setup services." on_success = "Successfully setup all services." diff --git a/invenio_cli/helpers/docker_helper.py b/invenio_cli/helpers/docker_helper.py index 31932df3..319461c1 100644 --- a/invenio_cli/helpers/docker_helper.py +++ b/invenio_cli/helpers/docker_helper.py @@ -137,3 +137,30 @@ def execute_cli_command(self, project_shortname, command): output="Web UI container not found. Is it up and running?", status_code=1, ) + + +class NoOpDockerHelper: + """A no-op implementation of DockerHelper that does nothing. + + It is used when services can not be started with docker (e.g. in CI/CD environments) + and has the same interface as DockerHelper. + """ + + def build_images(self, pull=False, cache=True): + """Build images action. Not implemented in NoOpDockerHelper.""" + raise NotImplementedError("Build images is not implemented in NoOpDockerHelper") + + def start_containers(self, app_only=False): + """Start containers according to the specified environment. + + :param app_only: Boot up only ui and api containers. + """ + return ProcessResponse() + + def stop_containers(self): + """Stop currently running containers.""" + return ProcessResponse() + + def destroy_containers(self): + """Stop and remove all containers, volumes and images.""" + return ProcessResponse() From 39258b1dda16dd341620cbe47880d610af2f53c3 Mon Sep 17 00:00:00 2001 From: Miroslav Simek <3385642+mesemus@users.noreply.github.com> Date: Sun, 19 Apr 2026 14:21:33 +0200 Subject: [PATCH 2/2] fix(review): condition inverted --- invenio_cli/cli/services.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/invenio_cli/cli/services.py b/invenio_cli/cli/services.py index 709f7e2b..a3f7cb68 100644 --- a/invenio_cli/cli/services.py +++ b/invenio_cli/cli/services.py @@ -62,10 +62,13 @@ def setup(cli_config, force, no_demo_data, stop_services, services): """Setup local services.""" # no_demo_data = False (default) means "YES to demo_data" demo_data = not no_demo_data - if not services: - docker_helper = NoOpDockerHelper() - else: + if services: + # use the default docker helper docker_helper = None + else: + # create a no-op docker helper as services are disabled + docker_helper = NoOpDockerHelper() + commands = ServicesCommands(cli_config, docker_helper=docker_helper) steps = commands.setup(force, demo_data, stop_services, services) on_fail = "Failed to setup services."