Добавил реестр APK артефактов
Этот коммит содержится в:
@@ -0,0 +1,70 @@
|
|||||||
|
import json
|
||||||
|
import os
|
||||||
|
from datetime import datetime
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
DATA_DIR = Path(os.getenv('DEVCONSOLE_DATA_DIR', '/var/lib/devconsole'))
|
||||||
|
ARTIFACTS_FILE = DATA_DIR / 'apk_artifacts.json'
|
||||||
|
MAX_ARTIFACTS_PER_WORKSPACE = 50
|
||||||
|
|
||||||
|
|
||||||
|
def _read_all() -> list[dict]:
|
||||||
|
if not ARTIFACTS_FILE.exists():
|
||||||
|
return []
|
||||||
|
try:
|
||||||
|
data = json.loads(ARTIFACTS_FILE.read_text(encoding='utf-8'))
|
||||||
|
return data if isinstance(data, list) else []
|
||||||
|
except Exception:
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
|
def _write_all(items: list[dict]) -> list[dict]:
|
||||||
|
ARTIFACTS_FILE.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
ARTIFACTS_FILE.write_text(json.dumps(items, ensure_ascii=False, indent=2), encoding='utf-8')
|
||||||
|
return items
|
||||||
|
|
||||||
|
|
||||||
|
def list_artifacts(workspace: str | None = None, limit: int = 20) -> list[dict]:
|
||||||
|
items = _read_all()
|
||||||
|
if workspace:
|
||||||
|
items = [item for item in items if item.get('workspace') == workspace]
|
||||||
|
return sorted(items, key=lambda item: item.get('created_at', ''), reverse=True)[:limit]
|
||||||
|
|
||||||
|
|
||||||
|
def record_apk_artifact(
|
||||||
|
workspace: str,
|
||||||
|
apk_path: str,
|
||||||
|
project_name: str | None = None,
|
||||||
|
version: str | None = None,
|
||||||
|
build: str | int | None = None,
|
||||||
|
ota_result: dict | None = None,
|
||||||
|
source: str = 'runtime',
|
||||||
|
) -> dict:
|
||||||
|
path = Path(apk_path)
|
||||||
|
stat = path.stat() if path.exists() else None
|
||||||
|
item = {
|
||||||
|
'id': f"{datetime.utcnow().strftime('%Y%m%d%H%M%S')}-{abs(hash((workspace, apk_path))) % 1000000}",
|
||||||
|
'workspace': workspace,
|
||||||
|
'project_name': project_name or '',
|
||||||
|
'apk_path': path.as_posix(),
|
||||||
|
'apk_name': path.name,
|
||||||
|
'size_bytes': stat.st_size if stat else 0,
|
||||||
|
'version': version or '',
|
||||||
|
'build': str(build or ''),
|
||||||
|
'source': source,
|
||||||
|
'created_at': datetime.utcnow().isoformat() + 'Z',
|
||||||
|
'ota_success': bool((ota_result or {}).get('success')),
|
||||||
|
'ota_latest_json': (ota_result or {}).get('latest_json'),
|
||||||
|
'ota_uploaded': (ota_result or {}).get('uploaded') or [],
|
||||||
|
}
|
||||||
|
|
||||||
|
items = _read_all()
|
||||||
|
items.append(item)
|
||||||
|
|
||||||
|
workspace_items = [entry for entry in items if entry.get('workspace') == workspace]
|
||||||
|
workspace_items = sorted(workspace_items, key=lambda entry: entry.get('created_at', ''), reverse=True)
|
||||||
|
keep_ids = {entry.get('id') for entry in workspace_items[:MAX_ARTIFACTS_PER_WORKSPACE]}
|
||||||
|
items = [entry for entry in items if entry.get('workspace') != workspace or entry.get('id') in keep_ids]
|
||||||
|
|
||||||
|
_write_all(items)
|
||||||
|
return item
|
||||||
Ссылка в новой задаче
Block a user