todolist-proto/deploy.py

143 lines
3.8 KiB
Python
Raw Permalink Normal View History

2026-01-20 18:40:33 +01:00
#!/usr/bin/env python3
"""
Deployment script for dalex-todo-proto to Gitea Package Registry
Pushes Docker images to https://brokkr.robotico.dev/dalex/-/packages
"""
import os
import sys
import subprocess
from pathlib import Path
from dotenv import load_dotenv
def log_info(message: str):
"""Print info message"""
2026-01-20 20:40:12 +01:00
print(f"[+] {message}")
2026-01-20 18:40:33 +01:00
def log_error(message: str):
"""Print error message"""
2026-01-20 20:40:12 +01:00
print(f"[!] Error: {message}", file=sys.stderr)
2026-01-20 18:40:33 +01:00
def run_command(command: list[str], description: str) -> bool:
"""Run a shell command and return success status"""
try:
log_info(f"{description}...")
result = subprocess.run(
command,
check=True,
capture_output=True,
text=True
)
return True
except subprocess.CalledProcessError as e:
log_error(f"{description} failed")
if e.stdout:
print(e.stdout)
if e.stderr:
print(e.stderr, file=sys.stderr)
return False
def main():
"""Main deployment function"""
# Load environment variables from .env file
env_file = Path(".env")
if not env_file.exists():
log_error(".env file not found!")
log_error("Please create .env file with PUBLISH_TOKEN variable.")
log_error("See .env.example for template.")
log_error("See ENV_SETUP.md for detailed instructions.")
sys.exit(1)
load_dotenv()
publish_token = os.getenv("PUBLISH_TOKEN")
if not publish_token:
log_error("PUBLISH_TOKEN not set in .env file")
sys.exit(1)
# Configuration
gitea_server = "https://brokkr.robotico.dev"
2026-01-20 20:40:12 +01:00
gitea_domain = "brokkr.robotico.dev" # Domain without https:// for Docker registry
2026-01-20 18:40:33 +01:00
gitea_owner = "dalex"
2026-01-20 20:40:12 +01:00
registry = f"{gitea_domain}/{gitea_owner}"
2026-01-20 18:40:33 +01:00
# Image names
backend_local = "todolist-proto-backend:latest"
frontend_local = "todolist-proto-frontend:latest"
backend_remote = f"{registry}/dalex-todo-backend:latest"
frontend_remote = f"{registry}/dalex-todo-frontend:latest"
log_info("Starting deployment process...")
print(f"Registry: {registry}")
print()
# Build images
if not run_command(
["docker-compose", "build"],
"Building Docker images"
):
sys.exit(1)
# Tag images for Gitea registry
if not run_command(
["docker", "tag", backend_local, backend_remote],
"Tagging backend image"
):
sys.exit(1)
if not run_command(
["docker", "tag", frontend_local, frontend_remote],
"Tagging frontend image"
):
sys.exit(1)
# Login to Gitea registry
log_info("Logging in to Gitea registry...")
login_process = subprocess.Popen(
2026-01-20 20:40:12 +01:00
["docker", "login", gitea_domain, "-u", gitea_owner, "--password-stdin"],
2026-01-20 18:40:33 +01:00
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
stdout, stderr = login_process.communicate(input=publish_token)
if login_process.returncode != 0:
log_error("Login to Gitea registry failed")
print(stderr, file=sys.stderr)
sys.exit(1)
log_info("Successfully logged in to Gitea registry")
# Push backend image
if not run_command(
["docker", "push", backend_remote],
"Pushing backend image"
):
sys.exit(1)
# Push frontend image
if not run_command(
["docker", "push", frontend_remote],
"Pushing frontend image"
):
sys.exit(1)
# Success
print()
log_info("Deployment complete!")
print()
print("Images published to:")
print(f"{backend_remote}")
print(f"{frontend_remote}")
print()
print(f"View packages at: {gitea_server}/{gitea_owner}/-/packages")
if __name__ == "__main__":
main()