# Gitea Actions: bash в job-образе, секреты, апгрейд runner — 2026-08-30 (bigbox, gitea.nixg.ru) ## ГЛАВНЫЙ ПИТФОЛЛ: job-образ обязан содержать bash Gitea Actions (как и GitHub) исполняет **каждый** run-шаг через `bash --noprofile --norc -e -o pipefail` — жёсткий дефолт, одинаковый в act_runner 0.6.x и gitea/runner 3.x. - `docker:27` (Alpine) имеет только busybox sh → мгновенный failure шага: `OCI runtime exec failed: exec: "bash": executable file not found in $PATH`, exit 127. - Job-контейнер при этом **стартует нормально** (в логе видны docker create/run) — падает только exec шага. - Это объясняет серию мгновенных failures (0 сек) без видимой причины в docker logs runner (там только info "task N repo is ..."). ### Фикс: тонкий job-образ docker:27 + bash ```bash docker build -t docker27-bash:latest - <<'EOF' FROM docker:27 RUN apk add --no-cache bash EOF ``` Label runner'а → `GITEA_RUNNER_LABELS=ubuntu-24.04:docker://docker27-bash:latest`. Перерегистрация не нужна: gitea/runner v3 обновляет labels на лету (в логах "labels updated to: [...]"). С bash в образе пишутся обычные bash-шаги. Костыли `shell: sh` / `sh -c '...'` не нужны (в act_runner v0.6.1 `shell:` под run не поддерживался). ## Секреты: GITHUB_TOKEN vs персональный токен - **secrets.GITHUB_TOKEN** — выдаётся Gitea Actions автоматически, имеет доступ к репозиторию (clone). `git clone "https://hermes:${{ secrets.GITHUB_TOKEN }}@gitea.nixg.ru/hermes/icq.git" .` - Персональный токен со scope только `write:package` → git clone даёт **403 Forbidden** (`remote: Forbidden`) — нет read:repository. - docker login в registry: `echo "${{ secrets.PKG_TOKEN }}" | docker login gitea.nixg.ru -u hermes --password-stdin` (scope write:package). - Проброс секрета через `env:` НЕ доходил до git clone; инлайн `user:token@` в URL работает. ## Апгрейд runner: act_runner → gitea/runner - Проект переехал: gitea.com/gitea/act_runner → gitea.com/gitea/runner (тег v3.3.1, авг 2026). - Docker Hub `gitea/act_runner` заморожен на 0.6.1 (апр 2026); свежие образы — `gitea/runner:3.3.1` / `latest` / `nightly`. - Env совместимы: GITEA_INSTANCE_URL, GITEA_RUNNER_REGISTRATION_TOKEN, GITEA_RUNNER_NAME, GITEA_RUNNER_LABELS, GITEA_INSECURE_SKIP_VERIFY. - `.runner` переживает мажорный апгрейд (id/labels сохраняются). - v3: `gitea-runner daemon --labels` меняет labels без перерегистрации; `config generate`; `log.job.dir` пишет логи задач на диск. ## Диагностика run — рабочие эндпоинты ```bash AUTH="-u hermes:PASS"; BASE="https://gitea.nixg.ru/api/v1" # Статус + steps (работает и для completed) curl -s $AUTH "$BASE/repos/hermes/icq/actions/runs/N/jobs" # ПОЛНЫЙ лог шагов — доступен ПОСЛЕ завершения run (лив-логи не отдаёт): curl -s $AUTH "$BASE/repos/hermes/icq/actions/jobs/{id}/logs" # HTTP 200, весь вывод ``` - Логи шагов НЕ видны в docker logs job-контейнера (stdout уходит в Gitea). - `git commit --allow-empty` НЕ триггерит Actions — нужен реальный change (например, правка самого workflow-файла). ## Результат сессии - Образ gitea.nixg.ru/hermes/icq-prosody (теги 13.0, latest, digest идентичны) собран из hermes/icq: prosody-docker/Dockerfile (base prosodyim/prosody:13.0) + COPY кастомных модулей /opt/icq/modules в /usr/lib/prosody/modules/. - Workflow run 11: success (Checkout → Login → Build → Push). Сборка идёт хостовым docker-демоном через docker.sock. - Внутри образа: prosody 13.0 + mod_admin_web, mod_http_upload_external, mod_muc_moderation, mod_vcard_muc, mod_privilege.lua.