"""GAS run_all()을 Gitea CI 스케줄러에서 원격 트리거. 언어 선택: Python — 이미 이 저장소의 모든 CI/도구가 Python이고(requests만으로 HTTP POST 한 번이면 충분), 새 언어를 도입할 이유가 없다(불필요한 복잡성 증가 경계). 대상 엔드포인트: src/gas/core/gas_lib.gs:doPost action="trigger_run_all" — 공유 비밀키로 보호된 GAS 웹앱. run_all()은 데이터 갱신/분석만 수행하며 매수/매도 주문을 실행하지 않는다(governance/rules/06,07과 동일 원칙). 필요한 자격정보(Windows 환경변수, KIS와 동일한 레지스트리 폴백 사용): GAS_WEBAPP_URL — Apps Script 배포 웹앱 URL RUN_ALL_TRIGGER_SECRET — gas_lib.gs Script Properties에 설정한 것과 동일한 값 """ from __future__ import annotations import json import sys from pathlib import Path import requests ROOT = Path(__file__).resolve().parents[1] if str(ROOT) not in sys.path: sys.path.insert(0, str(ROOT)) from src.quant_engine.kis_api_client_v1 import _read_env_var # 동일한 env+registry 폴백 재사용 def trigger_run_all(timeout_sec: int = 280) -> dict: webapp_url = _read_env_var("GAS_WEBAPP_URL") secret = _read_env_var("RUN_ALL_TRIGGER_SECRET") if not webapp_url or not secret: return {"status": "ERROR", "message": "GAS_WEBAPP_URL/RUN_ALL_TRIGGER_SECRET 환경변수 없음"} resp = requests.post( webapp_url, json={"action": "trigger_run_all", "secret": secret}, timeout=timeout_sec, ) resp.raise_for_status() return resp.json() def main() -> int: result = trigger_run_all() print(json.dumps(result, ensure_ascii=False, indent=2)) return 0 if result.get("status") == "OK" else 1 if __name__ == "__main__": raise SystemExit(main())