Сценарий непрерывной интеграции (ci)¶
Переменная ODPM_SCENARIO=ci — подготовка готового Docker-образа проекта: исходники платформы, дополнения, окружение Python и конфигурация встроены в образ, каталоги Odoo не подключаются с диска машины сборки.
Назначение¶
Инженер сборки или конвейер автоматизации получает воспроизводимый артефакт: один и тот же код и те же зафиксированные ревизии git, что описаны в odpm.json и .odpm/deps.lock.json. После сборки образ можно публиковать в реестр и разворачивать на стендах теми средствами, которые уже приняты в организации.
odpm не заменяет GitHub Actions, GitLab CI или оркестраторы — он даёт команду сборки образа и согласованный способ запуска Odoo с теми же параметрами, что у разработчика и администратора.
Поведение окружения¶
| Область | Как устроено |
|---|---|
| Образ | Создаётся командой odpm --build-image (доступна только в этом сценарии). Бэкенд: docker (по умолчанию) или kaniko — см. ADR-016. |
| Исходники | Внутри образа, без подключения с хоста. |
| Окружение Python | Собрано при сборке образа, не пересоздаётся при каждом up. |
| Отладчик | Нет. |
| Секреты модулей | Mount .odpm/secrets.json с хоста отключён. Секреты приложения в CI-образ этим механизмом не попадают — см. локальные секреты (TD-FEAT-09). |
| Фиксация версий | Строгая проверка .odpm/deps.lock.json; несовместимости версий во вложенных описаниях — ошибка. |
| Base image | Профиль ci (slim Dockerfile): без Chromium/Xvfb/IDE; отдельный тег odoo-…-ci; пересборка при смене шаблона или Dockerfile — см. ADR-007. Для kaniko base собирается и пушится в ODPM_BASE_IMAGE_REGISTRY (ADR-019); final FROM использует registry ref. Existence для kaniko — local identity stamp (не probe registry); при stale registry удалите .odpm/base_image_identity.json и пересоберите. |
Типичный конвейер¶
отправка в git → машина сборки
→ ODPM_SCENARIO=ci
→ odpm --skip-start
→ odpm --build-image [--image-tag реестр/проект:метка] [--image-builder docker|kaniko] [--image-push]
→ публикация образа (или --image-push / артефакт tar для kaniko)
→ развёртывание (ваши инструменты)
Чеклист¶
- В git:
odpm.jsonи закоммиченный.odpm/deps.lock.json. - На машине сборки: odpm,
.envсODPM_SCENARIO=ci; дляdocker— Docker daemon; дляkaniko— executor (docker-runилиdirect) и pullable base из registry. - Перед слиянием:
odpm plan --strict— код возврата 1 при неожиданных изменениях. - Проверка: HTTP-ответ 200 на
/webпослеdocker compose up.
Примеры команд¶
# ~/.odpm/.env (daemonless)
# ODPM_SCENARIO=ci
# ODOO_PROJECTS_DIR=/data/odoo_projects
# ODPM_CI_IMAGE_BUILDER=kaniko
# ODPM_KANIKO_EXECUTOR_MODE=direct
# ODPM_BASE_IMAGE_REGISTRY=registry.example.com/odpm
# ODPM_CI_IMAGE_PUSH=1
export ODPM_SCENARIO=ci
odpm --skip-start
odpm --build-image --image-tag myregistry/client-odoo:19.0
odpm --build-image --image-builder kaniko --image-tag myregistry/client-odoo:19.0 --image-push
ODPM_CI_IMAGE_BUILDER=kaniko ODPM_KANIKO_EXECUTOR_MODE=direct \
ODPM_BASE_IMAGE_REGISTRY=registry.example.com/odpm \
odpm --build-image --image-tag myregistry/client-odoo:19.0 --image-push
docker compose up -d
# Module install after stack is up (bare odpm -d/-i is rejected in ci).
# Service key is "odoo" unless ODPM_COMPOSE_PREFIX is set (then "{prefix}odoo"):
ODOO_SVC="${ODPM_COMPOSE_PREFIX:-}odoo"
docker compose exec "$ODOO_SVC" odoo-bin -d test_db -i base --stop-after-init
В сценарии ci bare odpm без --skip-start / --build-image (и без allowlist: plan, manifest, database, --update-lock, --init, …) завершается ошибкой — см. ADR-017.
Без --image-push бэкенд kaniko пишет tar в .odpm/ci-build-context/odpm-ci-image.tar.
В режиме docker-run с --image-push нужен ~/.docker/config.json (docker login); иначе odpm завершится с ошибкой до запуска executor. Образ executor по умолчанию закреплён (gcr.io/kaniko-project/executor:v1.23.2); перекрывается ODPM_KANIKO_EXECUTOR_IMAGE. Opt-in Docker integration в CI покрывает только бэкенд docker; argv/direct для kaniko — unit-тесты.
Для direct под non-root пользователем сборки: odpm не работает от root, но Kaniko executor часто требует привилегий. Задайте ODPM_KANIKO_EXECUTOR_WRAPPER — скрипт, запускающий executor от root (рекомендуется), или ODPM_KANIKO_EXECUTOR_SUDO=1 с passwordless sudo для бинаря executor. Опционально ODPM_KANIKO_EXECUTOR_EXTRA_FLAGS (напр. --kaniko-dir=/tmp/kaniko) для путей runtime Kaniko. См. ADR-016.
Инициализация без диалогов:
export ODPM_SCENARIO=ci
export ODOO_PROJECTS_DIR=/data/odoo_projects
export BACKUP_DIR=/data/backups
odpm --init https://github.com/example/demo.git --skip-start
См. запуск без диалогов.