feat: manual reload

This commit is contained in:
Piotr Dec 2026-04-14 01:27:56 +02:00
parent dfb4de6288
commit e0bc04770b
Signed by: stawros
GPG key ID: 74B18A3F0F1E99C0
5 changed files with 54 additions and 1 deletions

View file

@ -9,7 +9,7 @@ from starlette.responses import JSONResponse, Response
from karl.api.models import Request
from karl.core.injects import AutowireSupport
from karl.core.woodpecker import Woodpecker
from karl.model.webhook import WoodpeckerEvent
from karl.model.webhook import WoodpeckerEvent, ReloadEvent
router = APIRouter()
logger = logging.getLogger(__name__)
@ -39,3 +39,10 @@ class APIv1:
async def ci(self, request: Request):
await self.bus.dispatch(mapper.map(request))
return Response(status_code=201)
@router.post("/reload", summary="Manual service reload")
async def reload(self, service: str = None):
if service is None:
return Response(status_code=400)
await self.bus.dispatch(ReloadEvent(service=service))
return Response(status_code=201)

7
src/karl/model/vcs.py Normal file
View file

@ -0,0 +1,7 @@
from dataclasses import dataclass
@dataclass
class Head:
sha: str
branch: str

View file

@ -10,3 +10,6 @@ class WoodpeckerEvent(BaseEvent):
message: str
started: int
files: List[str]
class ReloadEvent(BaseEvent):
service: str

View file

@ -0,0 +1,29 @@
from datetime import datetime
from typing import Annotated
from bubus import EventBus
from injectable import injectable, autowired, Autowired
from model.webhook import ReloadEvent, WoodpeckerEvent
from services import GitService
@injectable(singleton=True)
class ReloadService:
@autowired
def __init__(self, bus: Annotated[EventBus, Autowired]):
self._bus = bus
self._bus.on(ReloadEvent, self.on_reload)
self._git = GitService()
def on_reload(self, event: ReloadEvent):
head = self._git.get_head()
self._bus.dispatch(WoodpeckerEvent(
_id=-1,
commit=head.sha,
ref=head.branch,
message=f"Manual reload of {event.service}",
started=int(datetime.now().timestamp()),
files=[f"compose/{event.service}/docker-compose.yml"]
))

View file

@ -2,6 +2,7 @@ from git import Repo, Remote
from injectable import injectable
from karl.config import GitConfig, get_settings
from model.vcs import Head
@injectable(singleton=True)
@ -27,3 +28,9 @@ class GitService:
def checkout(self, sha: str):
self._origin.fetch()
self._repo.git.checkout(sha)
def get_head(self) -> Head:
return Head(
self._repo.active_branch.commit.hexsha,
self._repo.active_branch.name
)