from pathlib import Path from shutil import rmtree from subprocess import PIPE, run from requests import post def buildx(repository: str, tags: list[str], build_platforms: list[str], dockerfile: str | Path = "Dockerfile", build_args: dict[str, str] | None = None, directory: str = ".", push: bool = True, pull: bool = False, progress: str = "auto", write_command: bool = False): if build_args is None: build_args = dict() labels = [f"{repository}:{tag}" for tag in tags] command = list(filter(None, ["docker", "buildx", "build", "--platform", ",".join(build_platforms), *[t for (key, value) in build_args.items() for t in ("--build-arg", f"{key}={value}")], "--file", str(dockerfile), *[t for label in labels for t in ("--tag", label)], f"--progress={progress}", "--pull" if pull else None, "--push" if push else None, directory])) if write_command: print(" ".join(command)) run(command, check=True) def get_webhook(): try: with open("portainer-webhook.txt", "r") as f: return f.read().strip() except Exception: return None def update_portainer_stack(webhook_id: str): print("Updating portainer stack...") resp = post(f"https://docker.cnml.de/api/stacks/webhooks/{webhook_id}") if not resp.ok: try: try: error = resp.json() except Exception: error = resp.content.decode() raise Exception(error) raise Exception(f"{error['message']} ({error['details']})") except Exception as e: print("Failed to update:", e) else: print("Stack successfully updated!") if __name__ == '__main__': output_path = Path("dist") if output_path.exists(): rmtree(output_path) output_path.mkdir() dockerfile = Path("Dockerfile.local").resolve() run(["python", "createreadmes.py"], check=True) run(["bundle.bat", "exec", "jekyll", "build", "--destination", output_path], check=True) branch = run(["git", "branch", "--show-current"], stdout=PIPE, check=True).stdout.decode().strip() short_sha = run(["git", "rev-parse", "--short", "HEAD"], stdout=PIPE, check=True).stdout.decode().strip() tags = [branch, short_sha] if branch == 'main': default_branch_tag = "latest" print(f"On default branch, also building {default_branch_tag} tag!") tags.append(default_branch_tag) platforms = ['linux/amd64', 'linux/arm/v6', 'linux/arm/v7', 'linux/arm64/v8', 'linux/386', 'linux/ppc64le', 'linux/s390x'] buildx("chenio/code2dfd", tags, platforms, dockerfile=dockerfile) webhook_id = get_webhook() if webhook_id is not None: update_portainer_stack(webhook_id)