# Gitea Actions | Workflow | Когда | Что | |----------|--------|-----| | [workflows/ci.yaml](workflows/ci.yaml) | pull request в main/master | quality gates + commitlint | | [workflows/cd.yaml](workflows/cd.yaml) | push в main/master | quality gates + semantic-release + docker push; wiki параллельно | | [workflows/quality.yaml](workflows/quality.yaml) | reusable (`workflow_call`) | changes, web, api, commitlint, docker-check | Подробнее: [docs/releasing.md](../docs/releasing.md). ## CI (quality gates) Job **changes** вычисляет флаги по путям в diff. Полный прогон: `.gitea/workflows/*`, `scripts/*`, корневой `package.json` / `pnpm-lock.yaml` / `.releaserc.json`. Правки `.cursor/`, `.claude/`, `*.md` quality jobs не запускают (wiki — отдельный job в CD). На **pull request** — **commitlint**. При изменении `deploy/docker/**` / `.dockerignore` — job **docker-check** (`bake --print`, bake без `--push` если есть доступ к registry). Кэш зависимостей — нативный `actions/cache` (cache server act_runner), ключ `sha256sum` lockfile (не `hashFiles`). Пути **абсолютные** (`$HOME/.pnpm-store`): тильда `~` на Gitea часто не раскрывается и даёт вечный miss. Кэшируется целиком: pnpm store + `node_modules` + corepack. При hit: `pnpm install --offline`. `HUSKY=0` в `scripts/ci/pnpm-ci.sh` (у корня есть `prepare: husky`). Если restore пишет `connect ECONNREFUSED` / `cache server not configured` — на runner включите cache server (см. ниже). Иначе каждый job снова качает пакеты (~минуты). Runner: `ubuntu-latest`, Docker для **docker-check** (PR) и **publish** (CD). ## CD (job publish) После успешных quality gates на **push в main** job **publish**: 1. `pnpm exec semantic-release` — тег `vX.Y.Z` на **текущий commit** (без дополнительного commit в main). 2. Gitea Release + `CHANGELOG.md` как attachment (не в git). 3. Зеркало base-образов в `cfdm-buildcache:base-*` (`deploy/docker/mirror-base-images.sh`; skip существующих тегов, `linux/amd64`, retry при 429). 4. `docker buildx bake default --push` с `VERSION=X.Y.Z`, `pull=false`, named builder `cfdm` (`cleanup: false`). Если releasable-коммитов нет — semantic-release no-op, образы не публикуются. Повтор упавшего **publish** (тег уже есть, bake нет): detect берёт `v*` на `HEAD` и всё равно пушит образы. Подробнее: [docs/releasing.md](../docs/releasing.md#перезапуск-упавшего-job-publish). Job **update-wiki** идёт **параллельно** publish (не блокирует образы): при diff `docs/Home.md` копирует файл в wiki-репозиторий (`GITEA_TOKEN`). ### Секреты **`ACTIONS_PAT`**: push tags, releases, Container Registry. Для git tag fallback: `gitea.token`. Push OCI — **только PAT** (у job token Gitea нет права packages). **`GITEA_TOKEN`**: clone/push wiki. ### Теги образов ```text git.shx.one//cfdm:latest git.shx.one//cfdm:v1.2.3 git.shx.one//cfdm:1.2.3 git.shx.one//cfdm: git.shx.one//cfdm:sha- ``` Тот же манифест публикуется как `cloudflare-domain-manager` (drop-in для текущего `docker pull`). Кэш сборки: `cfdm-buildcache:node-buildcache` и `cfdm-buildcache:base-*`. Пример: ```bash docker pull git.shx.one/denozord/cfdm:latest docker pull git.shx.one/denozord/cloudflare-domain-manager:latest ``` См. [deploy/docker/README.md](../deploy/docker/README.md). ## act_runner: cache server `actions/cache` ходит в **встроенный cache server** runner (не GitHub `type=gha`). Кэш локален для этого runner. В `config.yaml` runner: ```yaml cache: enabled: true dir: "" # по умолчанию $HOME/.cache/actcache host: "" # IP, доступный из job-контейнера (не 0.0.0.0) port: 8088 ``` Если runner в Docker, а jobs — отдельные контейнеры: пробросьте порт и задайте `host` (LAN IP хоста) или `external_server: "http://:8088/"`. Иначе restore — timeout/ECONNREFUSED и пакеты качаются снова. Не делайте `docker system prune -a` по cron: сотрётся и Docker-кэш FROM, и пользы от `cleanup: false` у buildx не будет.