43 lines
1.4 KiB
Python
43 lines
1.4 KiB
Python
"""Abstract CI/CD connector interface."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from datetime import datetime
|
|
from typing import Protocol, Optional, Sequence
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class BuildInfo:
|
|
build_id: str
|
|
pipeline_name: str
|
|
status: str # success | failed | running | cancelled
|
|
started_at: Optional[datetime] = None
|
|
finished_at: Optional[datetime] = None
|
|
triggered_by: Optional[str] = None
|
|
branch: Optional[str] = None
|
|
commit_sha: Optional[str] = None
|
|
url: Optional[str] = None
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class DeploymentInfo:
|
|
deployment_id: str
|
|
environment: str # dev | staging | prod | ...
|
|
status: str # success | failed | in_progress
|
|
version_ref: Optional[str] = None
|
|
started_at: Optional[datetime] = None
|
|
finished_at: Optional[datetime] = None
|
|
target: Optional[str] = None
|
|
url: Optional[str] = None
|
|
|
|
|
|
class CICDConnector(Protocol):
|
|
"""Jenkins / GitLab CI / GitHub Actions / ArgoCD / ..."""
|
|
|
|
async def get_build(self, pipeline: str, build_id: str) -> Optional[BuildInfo]: ...
|
|
async def list_builds(self, pipeline: str, limit: int = 50) -> Sequence[BuildInfo]: ...
|
|
|
|
async def get_deployment(self, deployment_id: str) -> Optional[DeploymentInfo]: ...
|
|
async def list_deployments(self, environment: str, limit: int = 50) -> Sequence[DeploymentInfo]: ...
|