188 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
### 📝 **Описание пайплайна: Сборка и ретегирование Docker-образов с помощью Buildah**
Этот пайплайна предназначен для **безопасной, rootless-совместимой сборки, тегирования и публикации Docker-образов** в приватный реестр с использованием **Buildah** — инструмента для работы с образами без необходимости запуска Docker-демона.
Пайплайн поддерживает:
- Сборку образов из `Dockerfile`.
- Автоматическое тегирование по ветке или тегу.
- Публикацию в GitLab Container Registry.
- Ретегирование существующих образов (например, `latest`, `stable`).
- Работу в CI/CD без привилегированных прав (поддержка rootless-режима).
---
### 🧱 **Основные возможности**
| Функция | Описание |
|--------|--------|
| ✅ `buildah bud` | Сборка образа из `Dockerfile` с поддержкой аргументов и кэширования |
| ✅ `buildah push` | Загрузка образа в приватный реестр |
| ✅ Авто-тегирование | Образы тегируются по имени ветки (`develop`, `feature/*`) или по тегу (`v1.2.3`) |
| ✅ `latest` для `main`/`master` | При коммите в `main` или `master` — образ дополнительно помечается как `:latest` |
| ✅ Ретегирование | Перенос тегов между образами (например, `app:v1.5``app:prod`) |
| 🔐 Безопасный login | Использование `--password-stdin` + base64-декодирование пароля |
---
### 🛠️ **Используемые Buildah-шаблоны**
```yaml
.buildah_info: &buildah-info
- until buildah --version; do sleep 1; done
```
> Проверяет доступность Buildah (полезно при старте контейнера).
```yaml
.buildah_login_stdin_base64: &buildah-login-stdin-base64
- echo "$REGISTRY_PASSWORD" | base64 -d | buildah login -u $REGISTRY_USER $REGISTRY --password-stdin
```
> Безопасный вход в реестр: пароль в base64-кодировке, не попадает в логи напрямую.
```yaml
.buildah_build: &buildah-build
- buildah bud $BUILD_STORAGE_DRIVER $BUILD_CACHE $BUILD_ARGS --isolation=$BUILDAH_ISOLATION -f $DOCKERFILE_PATH -t $DOCKER_TAG $CONTEXT_PATH
```
> Сборка образа с поддержкой:
> - кастомных `--build-arg`
> - отключения кэша (`--no-cache`)
> - выбора драйвера хранения (по умолчанию `vfs` — совместим с rootless)
```yaml
.buildah_push: &buildah-push
- buildah images
- buildah push $DOCKER_TAG
- if [[ "${CI_COMMIT_REF_SLUG}" == "main" || ... ]]; then buildah tag ... :latest; fi
- if [[ ... ]]; then buildah push ... :latest; fi
```
> Отправка образа в реестр и автоматическое обновление тега `:latest` на `main`/`master`.
```yaml
.buildah_retag: &buildah-retag
- buildah pull $SOURCE_IMAGE
- buildah tag $SOURCE_IMAGE $TARGET_IMAGE
- buildah push $TARGET_IMAGE
```
> Ретегирование: скачивает существующий образ и выставляет новый тег (например, для релизов или продакшена).
```yaml
.buildah_logout: &buildah-logout
- buildah logout $REGISTRY
```
> Очистка сессии после работы.
---
### 🏗️ **Стадии пайплайна**
#### 1. `build` — Сборка и публикация образа
- **Образ CI**: `sed-docker.artifacts.tn.tngrp.ru/buildah:v1.39.3-ca`
- **Переменные по умолчанию**:
- `CONTEXT_PATH`: корень проекта
- `DOCKERFILE_PATH`: `Dockerfile` в корне
- `DOCKER_TAG`: `$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG` (например, `image:develop`)
- **Тегирование по тегу релиза**:
```bash
Если CI_COMMIT_TAG = v1.2.3 → образ: image:v1.2.3
Иначе → image:feature-login
```
- **Автоматическое обновление `:latest`** при коммите в `main`/`master`.
#### 2. `retag` — Ретегирование существующего образа
- Используется для:
- Продвижения образа (например, `app:v1.5` → `app:prod`)
- Установки `:stable`, `:canary`, `:rollback` и т.п.
- Требует ручного запуска и указания:
- `SOURCE_IMAGE` — исходный образ (например, `registry/app:v1.5`)
- `TARGET_IMAGE` — целевой тег (например, `registry/app:prod`)
---
### ⚙️ **Ключевые переменные**
| Переменная | Описание |
|----------|--------|
| `CI_REGISTRY` / `CI_REGISTRY_USER` / `CI_REGISTRY_PASSWORD` | Данные для доступа к GitLab Registry (автоматически заданы в CI) |
| `CI_REGISTRY_IMAGE` | Полный путь к образу (например, `registry.example.com/group/app`) |
| `CI_COMMIT_REF_SLUG` | Имя ветки в URL-безопасном формате |
| `CI_COMMIT_TAG` | Тег коммита (если запущено по тегу) |
| `BUILD_ARGS` | Дополнительные аргументы сборки (через `--build-arg`) |
| `BUILD_CACHE` | Кэширование слоёв (`--no-cache` по умолчанию) |
| `BUILDAH_ISOLATION` | Режим изоляции: `chroot` (подходит для rootless) |
| `BUILD_STORAGE_DRIVER` | Драйвер хранения: `vfs` — рекомендуется для rootless |
---
### 🔐 **Безопасность**
- Пароль реестра **не передаётся в открытом виде** — используется `echo "$REGISTRY_PASSWORD" | base64 -d | buildah login --password-stdin`.
- Поддержка **rootless-режима** через `vfs` и `chroot`.
- Все операции выполняются в изолированном CI-раннере.
---
### 🧪 **Примеры использования**
#### ✅ Сборка при пуше в ветку `develop`
```bash
# Образ: registry/app:develop
# Сборка с --no-cache
# Без тега latest
```
#### ✅ Сборка при теге `v2.1.0`
```bash
# Образ: registry/app:v2.1.0
# Не влияет на latest
```
#### ✅ Сборка в `main` → обновление `:latest`
```bash
# Образ: registry/app:main + registry/app:latest
```
#### ✅ Ретегирование (ручной запуск)
```yaml
variables:
SOURCE_IMAGE: registry/app:v2.1.0
TARGET_IMAGE: registry/app:prod
```
> Результат: `registry/app:prod` указывает на тот же слой, что и `v2.1.0`.
---
### 📌 **Требования**
- GitLab CI с доступом к `buildah`-образу.
- Настроенные права на запись в Container Registry.
- Для `retag` — образ должен уже существовать в реестре.
- Раннер должен поддерживать выполнение `buildah` (обычно на хосте с `fuse-overlayfs` или `vfs`).
---
### 📎 Рекомендации
- Используйте `BUILD_CACHE: ""` для включения кэширования в промышленных сборках.
- Храните кастомные `BUILD_ARGS` в переменных CI.
- Для продакшена используйте `retag` вместо пересборки.
---
✅ **Назначение**: Современная, безопасная и гибкая альтернатива Docker-in-Docker (DinD) для сборки образов в CI/CD.
🔧 Подходит для GitLab CI, Kubernetes-раннеров, rootless-окружений и air-gapped систем.
---
Вы можете вставить это описание в начало `.gitlab-ci.yml`:
```yaml
# .gitlab-ci.yml
#
# === ПАЙПЛАЙН: Сборка образов через Buildah ===
#
# Описание:
# Данный пайплайн использует Buildah для rootless-сборки и публикации...
#
# ...
```
Или сохранить как `docs/ci-buildah-pipeline.md`.