Диагноз: диспетчеризация Gitea работает, но host-исполнение act_runner роняет шаги (No such file / MODULE_NOT_FOUND, задвоение hostexecutor/.cache). Workflow → workflow_dispatch (не auto-fail на push), раннер остановлен. Рабочий путь на будущее — Docker-образ с JDK+SDK + gradle-кэш (docs/CI.md). Сборки/релизы пока вручную (v0.5.123 опубликован).
5.1 KiB
CI — Gitea Actions
Пайплайн: .gitea/workflows/ci.yml. Gitea на git.f7cloud.ru — 1.26.1
(Actions поддерживаются).
Что делает
| Триггер | Джоба | Действия |
|---|---|---|
push в main, любой PR |
verify |
testDebugUnitTest + :app:lintRelease + :app:assembleDebug (+ артефакт debug-APK) |
тег v* |
release |
подписанный assembleRelease + архив исходников (GPL §6) → Gitea Release |
Предпосылка: self-hosted раннер (инфра ячейки B)
Проект тяжёлый (vendor talk-android + WebRTC), поэтому раннер — self-hosted с тёплым
Gradle-кэшем, а не контейнер (иначе WebRTC качается каждый прогон). Требования к машине раннера —
как у билд-машины: JDK 21 (/usr/lib/jvm/java-21-openjdk-amd64) + Android SDK 36
(/opt/android-sdk, platform android-36, build-tools 36.0.0).
Регистрация — repo-токен из Gitea → репозиторий root/f7cloud_mobile → Settings → Actions →
Runners → Create new Runner (НЕ site-admin токен — тот регистрирует раннер общеинстансно и он
подхватывает джобы чужих ячеек; проверено — брал glb_adm/f7_talk). Метки self-hosted+f7-android
соответствуют runs-on: [self-hosted, f7-android].
Развёрнуто на инфре B (2026-07-09): act_runner v0.2.11 + Node 20 (/opt/nodejs) + Docker
(docker.io, нужен act_runner для старта, но джобы идут на хосте — метки :host, тёплый кэш
/root/.gradle). Конфиг /opt/act_runner/config.yaml (labels self-hosted:host,f7-android:host,
container.docker_host: "-"). systemd-сервис act_runner.service (enabled, Restart=always,
env JAVA_HOME/ANDROID_HOME/PATH+node). Регистрация — repo-scope (только f7cloud_mobile).
systemctl status act_runner # состояние
journalctl -u act_runner -f # логи
Secrets репозитория (Gitea → Settings → Actions → Secrets)
Для джобы release:
F7_KEYSTORE_BASE64— боевой keystore,base64 -w0 release.jksF7_KEYSTORE_PASSWORD,F7_KEY_ALIAS,F7_KEY_PASSWORD— см. RELEASE-SIGNING.md
GPL corresponding source
scripts/package-source.sh собирает архив всего исходника (вкл. vendor/talk-android GPL, LICENSE,
NOTICE) — обязательство GPLv3 §6. Работает и вручную:
scripts/package-source.sh dist/ # → dist/f7cloud-mobile-v<ver>-<rev>-source.tar.gz
В CI прикладывается к каждому Gitea Release. До появления раннера — публиковать исходник вручную этим скриптом к каждой распространяемой сборке.
Статус — ⏸️ ОТЛОЖЕНО (2026-07-09)
Раннер развёрнут на инфре B (act_runner 0.2.13 + Node 20 + Docker + systemd), диспетчеризация
Gitea работает (джобы доходят до раннера). НО host-исполнение act_runner 0.2.13 в нашем
окружении сломано: криво резолвит путь к шагам и JS-экшенам —
No such file or directory на .cache/act/<id>/act/workflow/0.sh и MODULE_NOT_FOUND на
actions/checkout (задвоение hostexecutor/.cache/act). Обойти на уровне workflow нельзя
(ломается сам запуск шага). Workflow запаркован (триггер workflow_dispatch), сервис
раннера остановлен и отключён от автозапуска — чтобы push'и не плодили падающие прогоны.
Рабочий путь (когда вернёмся): Docker-исполнение вместо host —
- кастомный образ с JDK 21 + Android SDK 36 (в дефолтном ubuntu их нет);
- volume для тёплого
~/.gradle(vendor/WebRTC); - раннер с меткой на docker-образ (не
:host); в docker-режиме пути корректны, JS-экшены работают; - регистрировать repo-токеном именно из
f7cloud_mobile(id 24) — при отладке «repo-токены» ошибочно регистрировали к чужомуf7cloud_client(id 4) или в user-scope; в Gitea осталось ~5 дублей раннераf7-b-android(удалить в админке).
Пока: сборки и релизы — вручную на билд-машине (боевой ключ владельца из
/root/.f7cloud-keys/), исходники — scripts/package-source.sh, Release в Gitea — через API.
Что и делаем: релиз v0.5.123 опубликован (APK + source) вручную.