fix(ci): test jobs fail on sudo in act runner #4

Closed
opened 2026-08-09 21:38:39 +03:00 by slaid098 · 1 comment
Owner

Контекст

CI workflow .github/workflows/ci.yml падает на всех test-jobs (3.12, 3.13) в Forgejo act runner. Job test содержит шаг:

- run: sudo apt-get update && sudo apt-get install -y libsdl2-dev libportaudio2

Act runner выполняет команды в Docker-контейнере, где пользователь уже root, и sudo не установлен. Лог Forgejo Actions (run 251, job 521):

sudo apt-get update && sudo apt-get install -y libsdl2-dev libportaudio2
/var/run/act/workflow/3: line 2: sudo: command not found
❌  Failure - Main sudo apt-get update && sudo apt-get install -y libsdl2-dev libportaudio2
exitcode '127': command not found

Проблема проявилась на PR#3 (feat/wake-word/openwakeword-detector), но workflow ci.yml не менялся с исходного коммита f179e14 (PR#1 на master) — значит CI был сломан с самого начала и ни разу не проходил зелёным на test-jobs.

Параллельно lint и typecheck падают на astral-sh/setup-uv@v3 с lstat .../docs: no such file or directory — это flaky act cache, отдельная инфраструктурная проблема (act runner, не репо).

Задача

Заставить test-jobs проходить в act runner, убрав зависимость от sudo.

Контракты

  • ci.yml — единственный CI workflow (lint / typecheck / test / complexity)
  • Test-jobs matrix: Python 3.12, 3.13
  • apt-пакеты libsdl2-dev и libportaudio2 нужны для sounddevice и pygame (SDL2) — системные зависимости, без которых uv sync --extra dev может установить пакеты, но импорт/тест упадёт
  • Act runner контейнер уже root — sudo избыточен

Инварианты

  • Решение должно работать в act runner (Docker, root, без sudo)
  • Не сломать запуск на GitHub Actions (если когда-нибудь вернётся) — apt-get без sudo работает и там для root-user
  • Минимальные изменения: только убираем sudo, оставляем apt-get
  • Не менять matrix, не менять порядок шагов

Граничные случаи

  • apt-get без sudo в act: работает (контейнер root)
  • apt-get без sudo в GitHub Actions ubuntu-latest: работает для root-runner'а (runner по умолчанию не root, но для root-user шаг с apt-get сработает; если runner не root — нужен sudo). Решение: условный sudo через shell-проверку if command -v sudo >/dev/null 2>&1; then sudo apt-get ...; else apt-get ...; fi — либо просто apt-get (act-only). Предпочтителен первый вариант для совместимости.
  • Flaky setup-uv@v3 (lstat docs) — отдельная проблема, НЕ чинить в этом issue

Влияние на связанные компоненты

  • ci.yml → test-jobs (3.12, 3.13): начнут доходить до uv run pytest
  • complexity job: не затронут (не использует apt-get)
  • lint/typecheck: не затронуты (тоже падают, но на setup-uv — отдельная проблема)

Вне scope

  • Flaky astral-sh/setup-uv@v3 (lstat docs) — act cache, инфраструктура runner'а
  • Добавление openwakeword/onnxruntime в dependencies (если понадобится — отдельный issue после зелёного CI)
  • Изменение matrix Python версий

Критерии приемки

  • ci.yml шаг apt-get работает без sudo в act runner
  • Test-jobs доходят до uv run pytest (не падают на apt-get)
  • CI зелёный на test-jobs (при условии что pytest проходит)
  • Решение совместимо с GitHub Actions (не только act)
## Контекст CI workflow `.github/workflows/ci.yml` падает на всех test-jobs (3.12, 3.13) в Forgejo act runner. Job `test` содержит шаг: ```yaml - run: sudo apt-get update && sudo apt-get install -y libsdl2-dev libportaudio2 ``` Act runner выполняет команды в Docker-контейнере, где пользователь уже `root`, и `sudo` не установлен. Лог Forgejo Actions (run 251, job 521): ``` sudo apt-get update && sudo apt-get install -y libsdl2-dev libportaudio2 /var/run/act/workflow/3: line 2: sudo: command not found ❌ Failure - Main sudo apt-get update && sudo apt-get install -y libsdl2-dev libportaudio2 exitcode '127': command not found ``` Проблема проявилась на PR#3 (feat/wake-word/openwakeword-detector), но workflow `ci.yml` не менялся с исходного коммита `f179e14` (PR#1 на master) — значит CI был сломан с самого начала и ни разу не проходил зелёным на test-jobs. Параллельно `lint` и `typecheck` падают на `astral-sh/setup-uv@v3` с `lstat .../docs: no such file or directory` — это flaky act cache, отдельная инфраструктурная проблема (act runner, не репо). ## Задача Заставить test-jobs проходить в act runner, убрав зависимость от `sudo`. ## Контракты - `ci.yml` — единственный CI workflow (lint / typecheck / test / complexity) - Test-jobs matrix: Python 3.12, 3.13 - apt-пакеты `libsdl2-dev` и `libportaudio2` нужны для `sounddevice` и `pygame` (SDL2) — системные зависимости, без которых `uv sync --extra dev` может установить пакеты, но импорт/тест упадёт - Act runner контейнер уже root — `sudo` избыточен ## Инварианты - Решение должно работать в act runner (Docker, root, без sudo) - Не сломать запуск на GitHub Actions (если когда-нибудь вернётся) — `apt-get` без sudo работает и там для root-user - Минимальные изменения: только убираем `sudo`, оставляем `apt-get` - Не менять matrix, не менять порядок шагов ## Граничные случаи - `apt-get` без sudo в act: работает (контейнер root) - `apt-get` без sudo в GitHub Actions `ubuntu-latest`: работает для root-runner'а (runner по умолчанию не root, но для root-user шаг с `apt-get` сработает; если runner не root — нужен `sudo`). Решение: условный `sudo` через shell-проверку `if command -v sudo >/dev/null 2>&1; then sudo apt-get ...; else apt-get ...; fi` — либо просто `apt-get` (act-only). Предпочтителен первый вариант для совместимости. - Flaky `setup-uv@v3` (lstat docs) — отдельная проблема, НЕ чинить в этом issue ## Влияние на связанные компоненты - `ci.yml` → test-jobs (3.12, 3.13): начнут доходить до `uv run pytest` - `complexity` job: не затронут (не использует apt-get) - `lint`/`typecheck`: не затронуты (тоже падают, но на setup-uv — отдельная проблема) ## Вне scope - Flaky `astral-sh/setup-uv@v3` (lstat docs) — act cache, инфраструктура runner'а - Добавление `openwakeword`/`onnxruntime` в dependencies (если понадобится — отдельный issue после зелёного CI) - Изменение matrix Python версий ## Критерии приемки - [ ] `ci.yml` шаг apt-get работает без `sudo` в act runner - [ ] Test-jobs доходят до `uv run pytest` (не падают на apt-get) - [ ] CI зелёный на test-jobs (при условии что pytest проходит) - [ ] Решение совместимо с GitHub Actions (не только act)
Author
Owner

Fixed in PR #3 (conditional if command -v sudo guard in ci.yml). Closing as resolved.

Fixed in PR #3 (conditional `if command -v sudo` guard in ci.yml). Closing as resolved.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
slaid098/voice_assistant#4
No description provided.