mirror of
https://github.com/ansible-collections/community.docker.git
synced 2026-07-29 11:55:04 +00:00
docker_compose_v2: add ignore_build_events option; ignore build events by default (#1011)
* Add ignore_build_events option. * Adjust docs and tests. * Switch default to true. * Remove unnecessary parts from tests.
This commit is contained in:
@@ -57,6 +57,8 @@ DOCKER_STATUS_DONE = frozenset((
|
||||
'Recreated',
|
||||
# Extras for pull events
|
||||
'Pulled',
|
||||
# Extras for built events
|
||||
'Built',
|
||||
))
|
||||
DOCKER_STATUS_WORKING = frozenset((
|
||||
'Creating',
|
||||
@@ -76,6 +78,10 @@ DOCKER_STATUS_PULL = frozenset((
|
||||
'Pulled',
|
||||
'Pulling',
|
||||
))
|
||||
DOCKER_STATUS_BUILD = frozenset((
|
||||
'Built',
|
||||
'Building',
|
||||
))
|
||||
DOCKER_STATUS_ERROR = frozenset((
|
||||
'Error',
|
||||
))
|
||||
@@ -542,11 +548,13 @@ def parse_events(stderr, dry_run=False, warn_function=None, nonzero_rc=False):
|
||||
return events
|
||||
|
||||
|
||||
def has_changes(events, ignore_service_pull_events=False):
|
||||
def has_changes(events, ignore_service_pull_events=False, ignore_build_events=False):
|
||||
for event in events:
|
||||
if event.status in DOCKER_STATUS_WORKING:
|
||||
if ignore_service_pull_events and event.status in DOCKER_STATUS_PULL:
|
||||
continue
|
||||
if ignore_build_events and event.status in DOCKER_STATUS_BUILD:
|
||||
continue
|
||||
return True
|
||||
if event.resource_type == ResourceType.IMAGE_LAYER and event.status in DOCKER_PULL_PROGRESS_WORKING:
|
||||
return True
|
||||
@@ -802,8 +810,20 @@ class BaseComposeManager(DockerBaseClass):
|
||||
def emit_warnings(self, events):
|
||||
emit_warnings(events, warn_function=self.client.warn)
|
||||
|
||||
def update_result(self, result, events, stdout, stderr, ignore_service_pull_events=False):
|
||||
result['changed'] = result.get('changed', False) or has_changes(events, ignore_service_pull_events=ignore_service_pull_events)
|
||||
def update_result(
|
||||
self,
|
||||
result,
|
||||
events,
|
||||
stdout,
|
||||
stderr,
|
||||
ignore_service_pull_events=False,
|
||||
ignore_build_events=False,
|
||||
):
|
||||
result['changed'] = result.get('changed', False) or has_changes(
|
||||
events,
|
||||
ignore_service_pull_events=ignore_service_pull_events,
|
||||
ignore_build_events=ignore_build_events,
|
||||
)
|
||||
result['actions'] = result.get('actions', []) + extract_actions(events)
|
||||
result['stdout'] = combine_text_output(result.get('stdout'), to_native(stdout))
|
||||
result['stderr'] = combine_text_output(result.get('stderr'), to_native(stderr))
|
||||
|
||||
@@ -82,6 +82,16 @@ options:
|
||||
- When O(state) is V(present) or V(restarted), specify whether or not to include linked services.
|
||||
type: bool
|
||||
default: true
|
||||
ignore_build_events:
|
||||
description:
|
||||
- Ignores image building events for change detection.
|
||||
- If O(state=present) and O(ignore_build_events=true) and O(build=always), a rebuild that does
|
||||
not trigger a container restart no longer results in RV(ignore:changed=true).
|
||||
- Note that Docker Compose 2.31.0 is the first Compose 2.x version to emit build events.
|
||||
For older versions, the behavior is always as if O(ignore_build_events=true).
|
||||
type: bool
|
||||
default: true
|
||||
version_added: 4.2.0
|
||||
recreate:
|
||||
description:
|
||||
- By default containers will be recreated when their configuration differs from the service definition.
|
||||
@@ -439,6 +449,7 @@ class ServicesManager(BaseComposeManager):
|
||||
self.dependencies = parameters['dependencies']
|
||||
self.pull = parameters['pull']
|
||||
self.build = parameters['build']
|
||||
self.ignore_build_events = parameters['ignore_build_events']
|
||||
self.recreate = parameters['recreate']
|
||||
self.remove_images = parameters['remove_images']
|
||||
self.remove_volumes = parameters['remove_volumes']
|
||||
@@ -517,7 +528,7 @@ class ServicesManager(BaseComposeManager):
|
||||
rc, stdout, stderr = self.client.call_cli(*args, cwd=self.project_src)
|
||||
events = self.parse_events(stderr, dry_run=self.check_mode, nonzero_rc=rc != 0)
|
||||
self.emit_warnings(events)
|
||||
self.update_result(result, events, stdout, stderr, ignore_service_pull_events=True)
|
||||
self.update_result(result, events, stdout, stderr, ignore_service_pull_events=True, ignore_build_events=self.ignore_build_events)
|
||||
self.update_failed(result, events, args, stdout, stderr, rc)
|
||||
return result
|
||||
|
||||
@@ -548,7 +559,7 @@ class ServicesManager(BaseComposeManager):
|
||||
rc_1, stdout_1, stderr_1 = self.client.call_cli(*args_1, cwd=self.project_src)
|
||||
events_1 = self.parse_events(stderr_1, dry_run=self.check_mode, nonzero_rc=rc_1 != 0)
|
||||
self.emit_warnings(events_1)
|
||||
self.update_result(result, events_1, stdout_1, stderr_1, ignore_service_pull_events=True)
|
||||
self.update_result(result, events_1, stdout_1, stderr_1, ignore_service_pull_events=True, ignore_build_events=self.ignore_build_events)
|
||||
is_failed_1 = is_failed(events_1, rc_1)
|
||||
if not is_failed_1 and not self._are_containers_stopped():
|
||||
# Make sure all containers are stopped
|
||||
@@ -639,6 +650,7 @@ def main():
|
||||
scale=dict(type='dict'),
|
||||
wait=dict(type='bool', default=False),
|
||||
wait_timeout=dict(type='int'),
|
||||
ignore_build_events=dict(type='bool', default=True),
|
||||
)
|
||||
argspec_ex = common_compose_argspec_ex()
|
||||
argument_spec.update(argspec_ex.pop('argspec'))
|
||||
|
||||
Reference in New Issue
Block a user