diff --git a/app/config.py b/app/config.py index 6b0829a..82e81a0 100644 --- a/app/config.py +++ b/app/config.py @@ -148,7 +148,8 @@ class Settings(BaseSettings): llm: LLMSettings = Field(default_factory=LLMSettings) sourcecraft: SourceCraftSettings = Field(default_factory=SourceCraftSettings) git: GitSettings = Field(default_factory=GitSettings) - ci: CISettings = Field(default_factory=CISettings) + # not `ci`: Settings has no env prefix, and CI runners export CI=true + uploads_ci: CISettings = Field(default_factory=CISettings) docker: DockerSettings = Field(default_factory=DockerSettings) runner: RunnerSettings = Field(default_factory=RunnerSettings) runtime: RuntimeSettings = Field(default_factory=RuntimeSettings) diff --git a/app/main.py b/app/main.py index 2e642b2..4ea75bf 100644 --- a/app/main.py +++ b/app/main.py @@ -100,7 +100,7 @@ async def run(settings: Settings) -> None: ) repo = UploadsRepo(settings.git) runner = RunnerClient(settings.runner) if settings.runner.host else None - ci = make_ci(settings.ci) + ci = make_ci(settings.uploads_ci) deployer = Deployer(repo, runner, alerts) if runner else None # Without CI and runner there is nothing to watch: the push message just says what was pushed pipeline = ( @@ -111,9 +111,9 @@ async def run(settings: Settings) -> None: ci, deployer, commit_url_template=settings.git.commit_url_template, - poll_interval=settings.ci.poll_interval, - max_poll_interval=settings.ci.max_poll_interval, - run_timeout=timedelta(minutes=settings.ci.run_timeout_minutes), + poll_interval=settings.uploads_ci.poll_interval, + max_poll_interval=settings.uploads_ci.max_poll_interval, + run_timeout=timedelta(minutes=settings.uploads_ci.run_timeout_minutes), ) if ci or deployer else None @@ -150,7 +150,7 @@ async def run(settings: Settings) -> None: "via proxy" if proxy else "direct", "on" if docker else "off", settings.llm.provider if agent else "off", - settings.ci.provider if ci else "off", + settings.uploads_ci.provider if ci else "off", settings.runner.host or "off", ) try: diff --git a/tests/test_config.py b/tests/test_config.py index a711c81..2cfc722 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -3,7 +3,7 @@ from pathlib import Path import pytest from pydantic import ValidationError -from app.config import AccessSettings +from app.config import AccessSettings, Settings from app.texts import load_texts @@ -21,3 +21,11 @@ def test_texts_with_missing_key_fail_fast(tmp_path: Path) -> None: (tmp_path / "texts.yaml").write_text("menu: {commit: x}\n", encoding="utf-8") with pytest.raises(ValidationError): load_texts(tmp_path) + + +def test_ci_runner_env_does_not_break_settings(monkeypatch: pytest.MonkeyPatch) -> None: + # Gitea/GitHub runners export CI=true; it must not collide with a settings field + monkeypatch.setenv("CI", "true") + monkeypatch.setenv("TELEGRAM_BOT_TOKEN", "42:x") + + assert Settings().uploads_ci.provider == "none"