Этот файл про эксплуатацию репозитория и delivery-слой проекта. Главный README intentionally короткий; всё важное для разработки и публикации собрано здесь.
Текущая схема полностью завязана на версии в src/nagient/version.py и на централизованном конфиге config/project.toml.
Что происходит после пуша в main:
auto-tag.yml читает версию проекта.vX.Y.Z ещё нет, workflow создаёт его сам.auto-tag.yml сразу диспатчит release.yml на этот тег.release.yml собирает package, Docker image и GitHub release assets.update-center.yml публикует update center в GitHub Pages из main.Ключевое правило:
Release не должен запускаться на каждый пуш в main.Auto Tag завершится успешно, но релиз будет осознанно пропущен.update-center.yml, потому что environment github-pages обычно защищают по branch rules, а не по тегам.То есть вручную создавать теги больше не нужно. Достаточно:
mainФайл config/project.toml это единая база для:
Workflow-ы не дублируют эту логику вручную. Они используют:
Локальные runtime-переменные собраны в config/runtime.env.example.
Их можно:
.envПримеры значений для GitHub лежат в:
Открой:
Settings -> Secrets and variables -> Actions -> Variables
И создай переменные:
| Имя | Что туда вставлять | Пример |
|---|---|---|
UPDATE_BASE_URL |
полный публичный URL update center, можно с путём | https://updates.your-domain.tld |
CUSTOM_DOMAIN |
только hostname без https:// и без пути |
updates.your-domain.tld |
DOCKERHUB_NAMESPACE |
namespace или username в Docker Hub | mydockerhubname |
DOCKERHUB_IMAGE_NAME |
имя образа | nagient |
Очень важный момент:
UPDATE_BASE_URL это полный URL, его читают manifests и install/update scripts.CUSTOM_DOMAIN это только домен для CNAME, без пути.Если update center публикуется в корень домена:
UPDATE_BASE_URL=https://updates.your-domain.tld
CUSTOM_DOMAIN=updates.your-domain.tld
Если он публикуется в подпуть:
UPDATE_BASE_URL=https://updates.your-domain.tld/nagient
CUSTOM_DOMAIN=updates.your-domain.tld
Открой:
Settings -> Secrets and variables -> Actions -> Secrets
И создай секреты:
| Имя | Что туда вставлять |
|---|---|
DOCKERHUB_USERNAME |
логин Docker Hub |
DOCKERHUB_TOKEN |
access token Docker Hub |
Без этих секретов release workflow соберёт образ, но не сможет его опубликовать в Docker Hub.
Если секреты заданы и в логе есть push: true, но job потом упал на другом шаге, это не отменяет уже выполненный Docker push.
| Переменная | Где используется | Значение по умолчанию |
|---|---|---|
NAGIENT_HOME |
локальная рабочая директория | ~/.nagient |
NAGIENT_CONFIG |
путь до TOML-конфига | ~/.nagient/config.toml |
NAGIENT_STATE_DIR |
state / heartbeat | ~/.nagient/state |
NAGIENT_LOG_DIR |
лог-файлы | ~/.nagient/logs |
NAGIENT_RELEASES_DIR |
локально сохранённые manifests | ~/.nagient/releases |
NAGIENT_CHANNEL |
канал обновлений | stable |
NAGIENT_UPDATE_BASE_URL |
публичный URL update center | пусто, пока не задано |
NAGIENT_HEARTBEAT_INTERVAL |
heartbeat interval | 30 |
NAGIENT_DOCKER_PROJECT_NAME |
docker compose project name | nagient |
Что важно понимать:
UPDATE_BASE_URL.scripts/install.sh прямо из checkout без env, он теперь честно упадёт с сообщением “настрой URL”.Рекомендуемая версия Python: 3.12.
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e '.[dev]'
Проверка проекта:
make test PYTHON=python3.12
make smoke PYTHON=python3.12
PYTHONPATH=src python3.12 -m ruff check src tests scripts/release
PYTHONPATH=src python3.12 -m mypy src
PYTHONPATH=src python3.12 -m build --no-isolation
| Что нужно поменять | Где править |
|---|---|
| версия релиза | src/nagient/version.py |
| централизованные project defaults | config/project.toml |
| runtime config sample | config/nagient.example.toml |
| GitHub variables/secrets examples | config/github-actions.variables.example.env, config/github-actions.secrets.example.env |
| release env resolving | scripts/release/resolve_release_env.py |
| publish asset rendering | scripts/release/render_release_assets.py |
| install/update/uninstall behavior | scripts |
| runtime defaults in Python | src/nagient/app/settings.py |
| GitHub automation | .github/workflows |
Нормальный поток теперь такой:
0.2.0.main.auto-tag.yml создаёт v0.2.0, если такого тега ещё нет.auto-tag.yml диспатчит release.yml для v0.2.0.release.yml публикует артефакты и Docker image.update-center.yml публикует Pages из ветки main.Если тег vX.Y.Z уже существует, auto-tag его повторно не создаёт.
В таком случае новый Release run тоже не появится: это не ошибка, а защита от повторной публикации одной и той же версии.
Почему Pages не публикуется из release.yml:
github-pages часто ограничен branch protection rules.v0.1.2 из-за этого может быть отклонён GitHub.release.yml больше не пытается деплоить Pages, а update-center.yml остаётся единственным владельцем статического update center.Практический сценарий:
Settings -> Pages.Actions -> Variables добавить UPDATE_BASE_URL и CUSTOM_DOMAIN.Обычно достаточно:
CNAME -> <owner>.github.ioПример:
updates.your-domain.tld CNAME your-github-user.github.ioGitHub Pages обычно требует A-записи:
185.199.108.153185.199.109.153185.199.110.153185.199.111.153И AAAA-записи:
2606:50c0:8000::1532606:50c0:8001::1532606:50c0:8002::1532606:50c0:8003::153Официальная документация GitHub Pages:
Следующий полезный слой разработки:
auto-tag.yml, release.yml и update-center.yml.