Files
f7cloud_mobile/docs/CI.md
T
b-dev-mobile 2709dba03f ci: паркуем CI до Docker-режима (host-исполнение act_runner 0.2.13 сломано)
Диагноз: диспетчеризация 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 опубликован).
2026-07-09 04:56:43 +00:00

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.jks
  • F7_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) вручную.