- Introduced `docker_hub_token` and `docker_hub_username` secrets for Docker Hub login in CI/CD workflows. - Updated `.gitea/workflows/ci.yaml`, `.gitea/workflows/cd.yaml`, and `.gitea/workflows/quality.yaml` to utilize these secrets for Docker Hub authentication. - Enhanced README and releasing documentation to clarify the use of Docker Hub credentials for image mirroring and builds.
Gitea Actions
| Workflow | Когда | Что |
|---|---|---|
| workflows/ci.yaml | pull request в main/master | quality gates + commitlint |
| workflows/cd.yaml | push в main/master | quality gates + semantic-release + docker push |
| workflows/quality.yaml | reusable (workflow_call) |
changes, openapi, web, go, bird2, commitlint, docker-check |
Подробнее: docs/releasing.md.
CI (quality gates)
Job changes вычисляет флаги по путям в diff. Полный прогон: .gitea/workflows/*, scripts/*, .golangci.yml, .pre-commit-config.yaml, корневой package.json / .releaserc.json. Правки .cursor/, .claude/, *.md (кроме docs/api.md / docs/access.md / docs/openapi.yaml) quality jobs не запускают.
На pull request — commitlint. При изменении deploy/docker/** — job docker-check (bake --print, bake без --push если есть доступ к registry).
Кэш зависимостей — нативный actions/cache (cache server act_runner), ключ sha256sum lockfile (не hashFiles). Пути абсолютные ($HOME/.pnpm-store, go env GOMODCACHE / GOCACHE): тильда ~ на Gitea часто не раскрывается и даёт вечный miss.
Кэшируется целиком: pnpm store + node_modules + corepack; Go modules + GOCACHE + golangci-lint в GOBIN. При hit: pnpm install --offline, go mod download без сети. setup-go cache: и golangci-lint-action не используем — они завязаны на hashFiles.
Если restore пишет connect ECONNREFUSED / cache server not configured — на runner включите cache server (см. ниже). Иначе каждый job снова качает пакеты (~минуты).
Runner: ubuntu-latest, bird2 из apt, Docker для docker-check (PR) и publish (CD).
CD (job publish)
После успешных quality gates на push в main job publish:
pnpm exec semantic-release— тегvX.Y.Zна текущий commit (без дополнительного commit в main).- Gitea Release +
CHANGELOG.mdкак attachment (не в git). - Зеркало base-образов в
evobgp-buildcache:base-*(deploy/docker/mirror-base-images.sh; skip существующих тегов,linux/amd64, retry при 429). docker buildx bake default --pushсVERSION=X.Y.Z,pull=false, named builderevobgp(cleanup: false).
Если releasable-коммитов нет — semantic-release no-op, образы не публикуются.
Повтор упавшего publish (тег уже есть, bake нет): detect берёт v* на HEAD и всё равно пушит образы. Подробнее: docs/releasing.md.
Секреты
ACTIONS_PAT: push tags, releases, Container Registry. Для git tag fallback: github.token. Push OCI — только PAT (у GITEA_TOKEN нет права packages).
docker_hub_token: PAT Docker Hub (Settings → Actions → Secrets, можно на уровне организации). Логин перед зеркалом docker.io и bake, чтобы не ловить anonymous 429. Логин: docker_hub_username (если задан) или gitea.actor.
Теги образов
git.shx.one/<owner>/<имя>:latest
git.shx.one/<owner>/<имя>:v1.2.3
git.shx.one/<owner>/<имя>:1.2.3
git.shx.one/<owner>/<имя>:<short-sha>
git.shx.one/<owner>/<имя>:sha-<full-sha>
Имена образов: evobgp-api, evobgp-all, evobgp-scheduler, evobgp-ingest, evobgp-render, evobgp-deploy, evobgp-node, evobgp-web, evobgp-web-all, evobgp-agent, evobgp-bird2.
Кэш сборки: evobgp-buildcache:{go,web,birdc}-buildcache и evobgp-buildcache:base-*.
Удалённый спикер (compose deploy/compose/docker-compose.remote-speaker.yaml): evobgp-bird2, evobgp-agent, evobgp-node (fallback profile); Traefik — внешний traefik:latest. CI: scripts/validate-remote-speaker-compose.sh.
Пример:
docker pull git.shx.one/myuser/evobgp-api:1.2.3
См. deploy/docker/README.md, docs/quickstart.md.
act_runner: cache server
actions/cache ходит в встроенный cache server runner (не GitHub type=gha). Кэш локален для этого runner.
В config.yaml runner:
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://<host>:8088/". Иначе restore — timeout/ECONNREFUSED и пакеты качаются снова.
Не делайте docker system prune -a по cron: сотрётся и Docker-кэш FROM, и пользы от cleanup: false у buildx не будет.