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.api.models import Request
from karl.core.injects import AutowireSupport from karl.core.injects import AutowireSupport
from karl.core.woodpecker import Woodpecker from karl.core.woodpecker import Woodpecker
from karl.model.webhook import WoodpeckerEvent from karl.model.webhook import WoodpeckerEvent, ReloadEvent
router = APIRouter() router = APIRouter()
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -39,3 +39,10 @@ class APIv1:
async def ci(self, request: Request): async def ci(self, request: Request):
await self.bus.dispatch(mapper.map(request)) await self.bus.dispatch(mapper.map(request))
return Response(status_code=201) 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 message: str
started: int started: int
files: List[str] 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 injectable import injectable
from karl.config import GitConfig, get_settings from karl.config import GitConfig, get_settings
from model.vcs import Head
@injectable(singleton=True) @injectable(singleton=True)
@ -27,3 +28,9 @@ class GitService:
def checkout(self, sha: str): def checkout(self, sha: str):
self._origin.fetch() self._origin.fetch()
self._repo.git.checkout(sha) self._repo.git.checkout(sha)
def get_head(self) -> Head:
return Head(
self._repo.active_branch.commit.hexsha,
self._repo.active_branch.name
)