WoodpeckerRunner & some VCS changes

This commit is contained in:
Piotr Dec 2025-11-02 00:35:33 +01:00
parent 34ee5f8754
commit 312631f0b5
Signed by: stawros
GPG key ID: 74B18A3F0F1E99C0
2 changed files with 54 additions and 35 deletions

View file

@ -12,23 +12,50 @@ logger = logging.getLogger(__name__)
class WoodpeckerRunner(Process):
def __init__(self, event: WoodpeckerEvent):
super().__init__()
def __init__(self, git: GitService, docker: DockerService, success_callback=None, error_callback=None):
super().__init__(daemon=True)
self._git = git
self._docker = docker
self._success_callback = success_callback
self._error_callback = error_callback
self._event: WoodpeckerEvent | None = None
def process_event(self, event: WoodpeckerEvent):
self._event = event
self.start()
def run(self):
super().run()
"""
event: WebhookEvent = task.payload
# TODO: persist event data
commit_hash = self._git.get_new_commit_hash()
if commit_hash != event.commit:
logger.warning(f"Commit hash mismatch: {commit_hash} != {event.commit}")
return Result(task.id, False, "Commit hash mismatch")
# TODO: persist commit data
service = self._get_service(event.files)
try:
service = self.get_service(self._event.files)
if service is None:
logger.info("No service found.")
return self._success_callback()
"""
self._git.checkout(self._event.commit)
"""
TODO:
check for *.mo.* files
subs mo from pass
docker compose up -d -f service/docker-compose.yml
"""
return self._success_callback()
except Exception as e:
return self._error_callback(e)
def get_service(self, files: list[str]) -> str | None:
supported_files = []
for f in files:
f_parts = f.split("/")
if f_parts[0] in ["compose", "files"]:
supported_files.append(f[1])
match len(set(supported_files)):
case 0:
return None
case 1:
return supported_files[0]
case _:
raise Exception("Multiple services are not supported.")
@injectable(singleton=True)
@ -52,7 +79,9 @@ class Woodpecker:
self._start_runner(event)
def _start_runner(self, event: WoodpeckerEvent):
pass
with self._lock:
self._runner = WoodpeckerRunner(self._git, self._docker, self._on_runner_completed)
self._runner.process_event(event)
def _on_runner_completed(self):
logger.info("Runner completed.")
@ -62,3 +91,12 @@ class Woodpecker:
if len(self._pending) > 0:
event = self._pending.popleft()
self._start_runner(event)
def _on_runner_error(self, t: Exception):
logger.error(f"Runner error: {t}", exc_info=True)
self._runner.join()
with self._lock:
self._runner = None
if len(self._pending) > 0:
event = self._pending.popleft()
self._start_runner(event)