diff --git a/sync.py b/sync.py index a8df6d0..ef50174 100644 --- a/sync.py +++ b/sync.py @@ -12,7 +12,6 @@ class Images(BaseModel): target: str tags: list[str] = [] - async def run_command(command: str) -> int | None: process = await asyncio.create_subprocess_shell( command, @@ -27,15 +26,15 @@ async def run_command(command: str) -> int | None: print(f"[STDERR]\n{stderr.decode()}") return process.returncode - + async def docker_pull(image: str) -> int | None: print(f"Pulling image {image}...") return await run_command(f"docker pull {image}") - + async def docker_tag(source: str, target: str) -> int | None: print(f"Tagging image {source} as {target}...") return await run_command(f"docker tag {source} {target}") - + async def docker_push(image: str) -> int | None: print(f"Pushing image {image}...") return await run_command(f"docker push {image}") @@ -57,8 +56,7 @@ semaphore = asyncio.Semaphore(50) async def limited_task[T: Any](semaphore: asyncio.Semaphore, task: Callable[[], Coroutine[None, None, T]]) -> T: async with semaphore: - return task() - + return await task() async def main(): async with aiofiles.open('images.yaml', 'r') as file: @@ -74,16 +72,12 @@ async def main(): for image in config.images: if len(image.tags) > 0: for tag in image.tags: - - tasks.append(limited_task(semaphore, docker_task(f"{image.target}:{tag}", f"{image.target}:{tag}"))) + tasks.append(limited_task(semaphore, lambda: docker_task(f"{image.source}:{tag}", f"{image.target}:{tag}"))) else: - tasks.append(limited_task(semaphore, docker_task(image.source, image.target))) + tasks.append(limited_task(semaphore, lambda: docker_task(image.source, image.target))) results = await asyncio.gather(*tasks) - failed_tasks = 0 - for result in results: - if result is not None and result != 0: - failed_tasks += 1 + failed_tasks = sum(1 for result in results if result is not None and result != 0) print(f"{len(results)} tasks completed. {len(results) - failed_tasks} succeed, {failed_tasks} failed.") if failed_tasks > 0: raise Exception(f"{failed_tasks} tasks failed.")