Предварительные условия
Установите deckhouse-cli (d8):
sh -c "$(curl -fsSL https://raw.githubusercontent.com/deckhouse/deckhouse-cli/main/tools/install.sh)"
Войдите в реестр пакетов с помощью лицензионного токена:
d8 dk cr login -u license-token dev-registry.deckhouse.io --password <ВАШ_ТОКЕН>
Бутстрап нового Application
d8 package bootstrap application <name> создаёт директорию <name>/ в текущей рабочей директории со скелетом пакета и инициализирует git-репозиторий с первым коммитом.
d8 package bootstrap application myapp --hooks
cd myapp
git remote add origin <gitlab-repo.git>
git push --set-upstream origin main
Флаги:
| Флаг | Описание |
|---|---|
--hooks |
Сгенерировать скелет Go-хуков |
--werf |
Использовать werf для сборки образов |
--extended |
Добавить расширенный набор файлов |
-o, --output <path> |
Кастомный путь вывода (по умолчанию: <cwd>/<name>) |
Структура проекта
myapp/
├── .gitignore
├── .gitlab-ci.yml # Пайплайн CI/CD
├── changelog.yaml
├── docs/
│ └── README.md # Документация приложения
├── hooks/ # Go-хуки
│ ├── hooks.yaml
│ └── batch/
│ ├── go.mod
│ ├── go.sum
│ ├── main.go
│ └── triggers/
│ └── hook.go
├── images/ # Исходный код образов или инструкции для их загрузки
│ └── myapp/
│ └── werf.inc.yaml
├── openapi/
│ ├── config-values.yaml # OpenAPI-схема для Application.spec.settings
│ └── values.yaml # OpenAPI-схема для Helm values
├── oss.yaml
├── package.yaml # Манифест пакета
└── templates/ # Helm-шаблоны
├── deployment.yaml
├── registry-secret.yaml
└── service.yaml
package.yaml
Центральный манифест пакета Application. Определяет метаданные, тип, требования и совместимость.
apiVersion: v1
type: "Application"
name: redis
descriptions:
ru: "Redis — in-memory база данных"
en: "Redis — in-memory database"
version: "v1.0.1" # Инжектируется автоматически при сборке.
stage: "Preview"
category: "Databases"
# Требования к окружению.
requirements:
deckhouse:
constraint: ">= 1.70"
kubernetes:
constraint: ">= 1.31"
modules:
mandatory:
- name: cert-manager
constraint: ">= 1.0.0"
Справочник полей:
| Поле | Обязательное | Описание |
|---|---|---|
name |
Да | Уникальное имя пакета |
descriptions |
Да | Локализованное описание для каталога и UI (ru, en) |
version |
Да | Semver-версия; инжектируется при сборке |
type |
Да | Application или Module |
stage |
Да | Стадия зрелости (Preview, General Availability и т. д.) |
category |
Да | Категория для классификации в каталоге |
requirements.deckhouse |
Нет | Ограничение на минимальную версию DKP |
requirements.kubernetes |
Нет | Ограничение на минимальную версию Kubernetes |
requirements.modules |
Нет | Зависимости от модулей (semver-ограничения) |
Локальная сборка
Сборка и публикация пакета в реестр:
d8 package build -v v0.0.1 -r dev-registry.deckhouse.io/deckhouse/packages
Для локальной разработки используйте модуль payload-registry в качестве личного реестра.
Линтинг
Проверка структуры и конфигурации пакета:
d8 package verify
Выводит ошибки и предупреждения на основе .pkglint.yaml и встроенных правил.
Настройка CI/CD
Переменные окружения
| Переменная | Описание |
|---|---|
PACKAGES_REGISTRY_LOGIN |
Логин для публикации в реестр |
PACKAGES_REGISTRY_PASSWORD |
Пароль или токен реестра |
Выпуск релиза
Пайплайн запускается по semver git-тегу:
git tag v0.1.0
git push origin v0.1.0
Пайплайн собирает пакет и публикует его в реестр. После завершения пайплайна версия пакета становится доступной для сканирования через PackageRepository.
Организация OCI-артефактов в реестре
registry.deckhouse.io/deckhouse/<edition>/packages:<name>
Тег с именем пакета — для поддержки листинга
registry.deckhouse.io/deckhouse/<edition>/packages/<name>:<version>
Bundle — содержит шаблоны, openapi/, hooks/
registry.deckhouse.io/deckhouse/<edition>/packages/<name>/extra/<image>:<version>
Дополнительные образы (контейнеры приложения)
registry.deckhouse.io/deckhouse/<edition>/packages/<name>/version:<version>
Метаданные версии — содержат package.yaml, version.json, changelog.yaml
registry.deckhouse.io/deckhouse/<edition>/packages/<name>/version:<release-channel>
Рекомендуемая версия для release channel
Содержимое bundle
Основной образ bundle (<name>:<version>) содержит:
├── package.yaml # Манифест пакета
├── openapi/ # Схемы settings и values
├── templates/ # Helm-шаблоны
└── hooks/ # Хуки жизненного цикла
Содержимое образа метаданных
Образ метаданных версии (<name>/version:<version>) содержит:
├── package.yaml # Манифест пакета
├── version.json # Semver-версия
└── changelog.yaml # Release notes