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 опубликован).
This commit is contained in:
+58
-25
@@ -1,15 +1,22 @@
|
|||||||
name: CI
|
name: CI
|
||||||
|
|
||||||
# Self-hosted раннер на инфре B (host-исполнение, тёплый Gradle-кэш).
|
# ⏸️ ПАРКОВКА (2026-07-09): CI отложен. Раннер на инфре B развёрнут, но
|
||||||
# ВАЖНО: без JS-экшенов (actions/checkout, upload-artifact и т.п.) — в host-режиме
|
# host-исполнение act_runner 0.2.13 в нашем окружении сломано (криво резолвит
|
||||||
# act_runner 0.2.13 криво резолвит путь к node-экшену (MODULE_NOT_FOUND, задвоенный
|
# пути к шагам/JS-экшенам: MODULE_NOT_FOUND / "No such file", задвоение
|
||||||
# hostexecutor/.cache/act). Поэтому checkout делаем обычным git.
|
# hostexecutor/.cache/act). Рабочий путь — Docker-исполнение с кастомным образом
|
||||||
# Release-сборка/публикация в Gitea Release — пока вручную (та же причина: JS-экшены);
|
# (JDK 21 + Android SDK 36) и volume для ~/.gradle. До этого — сборки/релизы вручную
|
||||||
# см. docs/CI.md.
|
# на билд-машине (см. docs/CI.md).
|
||||||
|
#
|
||||||
|
# Триггер временно ручной (workflow_dispatch), чтобы push'и не создавали падающие
|
||||||
|
# прогоны. Когда настроим Docker-раннер — вернуть блок on: push/pull_request ниже.
|
||||||
|
#
|
||||||
|
# on:
|
||||||
|
# push:
|
||||||
|
# branches: [main]
|
||||||
|
# tags: ['v*']
|
||||||
|
# pull_request:
|
||||||
on:
|
on:
|
||||||
push:
|
workflow_dispatch:
|
||||||
branches: [main]
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
JAVA_HOME: /usr/lib/jvm/java-21-openjdk-amd64
|
JAVA_HOME: /usr/lib/jvm/java-21-openjdk-amd64
|
||||||
@@ -18,22 +25,48 @@ env:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
verify:
|
verify:
|
||||||
# detekt + unit-тесты + debug-сборка на каждый push в main
|
# detekt + unit-тесты + Android Lint + debug-сборка на каждый push в main и на PR
|
||||||
runs-on: [self-hosted, f7-android]
|
runs-on: [self-hosted, f7-android]
|
||||||
|
if: github.ref_type != 'tag'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout (git, без JS-экшена)
|
- uses: actions/checkout@v4
|
||||||
env:
|
- name: Статанализ (detekt + ktlint-форматирование)
|
||||||
GITHUB_TOKEN: ${{ github.token }}
|
run: ./gradlew detekt --no-daemon
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
rm -rf src && mkdir src && cd src
|
|
||||||
git init -q
|
|
||||||
git remote add origin "https://x-access-token:${GITHUB_TOKEN}@git.f7cloud.ru/${GITHUB_REPOSITORY}.git"
|
|
||||||
git -c protocol.version=2 fetch -q --depth 1 origin "${GITHUB_SHA}"
|
|
||||||
git checkout -q FETCH_HEAD
|
|
||||||
- name: Статанализ (detekt + ktlint)
|
|
||||||
run: cd src && ./gradlew detekt --no-daemon
|
|
||||||
- name: Unit-тесты
|
- name: Unit-тесты
|
||||||
run: cd src && ./gradlew testDebugUnitTest --no-daemon
|
run: ./gradlew testDebugUnitTest --no-daemon
|
||||||
- name: Debug-сборка
|
- name: Android Lint (release)
|
||||||
run: cd src && ./gradlew :app:assembleDebug --no-daemon
|
run: ./gradlew :app:lintRelease --no-daemon
|
||||||
|
- name: Debug-сборка (артефакт для QA)
|
||||||
|
run: ./gradlew :app:assembleDebug --no-daemon
|
||||||
|
- name: Публикация debug-APK
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: f7cloud-mobile-debug
|
||||||
|
path: app/build/outputs/apk/debug/*.apk
|
||||||
|
|
||||||
|
release:
|
||||||
|
# по тегу v*: подписанный release + архив исходников (GPL corresponding source) в Gitea Release
|
||||||
|
runs-on: [self-hosted, f7-android]
|
||||||
|
if: github.ref_type == 'tag'
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Развернуть keystore из secret
|
||||||
|
run: |
|
||||||
|
echo "${{ secrets.F7_KEYSTORE_BASE64 }}" | base64 -d > "$RUNNER_TEMP/release.jks"
|
||||||
|
- name: Release-сборка (подписанная)
|
||||||
|
env:
|
||||||
|
F7_KEYSTORE_FILE: ${{ runner.temp }}/release.jks
|
||||||
|
F7_KEYSTORE_PASSWORD: ${{ secrets.F7_KEYSTORE_PASSWORD }}
|
||||||
|
F7_KEY_ALIAS: ${{ secrets.F7_KEY_ALIAS }}
|
||||||
|
F7_KEY_PASSWORD: ${{ secrets.F7_KEY_PASSWORD }}
|
||||||
|
run: ./gradlew :app:assembleRelease --no-daemon
|
||||||
|
- name: Архив исходников (GPL corresponding source)
|
||||||
|
run: bash scripts/package-source.sh "$RUNNER_TEMP/dist"
|
||||||
|
- name: Публикация Gitea Release (APK + исходники)
|
||||||
|
uses: akkuman/gitea-release-action@v1
|
||||||
|
with:
|
||||||
|
files: |
|
||||||
|
app/build/outputs/apk/release/*.apk
|
||||||
|
${{ runner.temp }}/dist/*-source.tar.gz
|
||||||
|
|||||||
+20
-5
@@ -48,9 +48,24 @@ scripts/package-source.sh dist/ # → dist/f7cloud-mobile-v<ver>-<rev>-sourc
|
|||||||
В CI прикладывается к каждому Gitea Release. До появления раннера — публиковать исходник
|
В CI прикладывается к каждому Gitea Release. До появления раннера — публиковать исходник
|
||||||
вручную этим скриптом к каждой распространяемой сборке.
|
вручную этим скриптом к каждой распространяемой сборке.
|
||||||
|
|
||||||
## Статус
|
## Статус — ⏸️ ОТЛОЖЕНО (2026-07-09)
|
||||||
|
|
||||||
**Активно (2026-07-09):** self-hosted раннер `f7-b-android` зарегистрирован и запущен на инфре B
|
Раннер развёрнут на инфре B (act_runner 0.2.13 + Node 20 + Docker + systemd), диспетчеризация
|
||||||
(scope — репозиторий, host-исполнение). Workflow срабатывает на push/PR (lint+тесты+assembleDebug).
|
Gitea работает (джобы доходят до раннера). **НО host-исполнение act_runner 0.2.13 в нашем
|
||||||
Осталось для джобы `release` по тегу: завести Secrets репозитория (keystore base64 + пароли) —
|
окружении сломано**: криво резолвит путь к шагам и JS-экшенам —
|
||||||
пока release-сборки делаются вручную на билд-машине тем же ключом.
|
`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) вручную.
|
||||||
|
|||||||
Reference in New Issue
Block a user