Ответ
Семантичное тегирование — критически важная практика в DevOps для отслеживаемости, развертывания и отката версий. Я использую разные стратегии для Git и Docker.
1. Docker-образы (в Container Registry): Тег содержит идентификатор конкретной сборки и метаданные.
- Основной семантический тег:
{app-name}:{major}.{minor}.{patch}(например,api-service:1.2.3). - Тег с привязкой к коммиту (для отслеживаемости):
{app-name}:{short-commit-sha}(например,api-service:a1b2c3d). Часто используется в CI для тестирования. - Плавающий тег для окружений:
{app-name}:latest(для dev),{app-name}:staging,{app-name}:prod. Важно:latestне должен использоваться в продакшене из-за неявности версии. - Комбинированный тег (рекомендуемый):
{app-name}:{semver}-{short-sha}(например,api-service:1.2.3-a1b2c3d). Дает и версию, и точную ссылку на код.
Пример команды в CI/CD:
# Сборка и тегирование образа
docker build -t my-registry/api-service:1.2.3-${CI_COMMIT_SHORT_SHA} .
docker push my-registry/api-service:1.2.3-${CI_COMMIT_SHORT_SHA}
# Дополнительно проставляем тег 'staging' для деплоя
docker tag my-registry/api-service:1.2.3-${CI_COMMIT_SHORT_SHA} my-registry/api-service:staging
docker push my-registry/api-service:staging
2. Git-теги: Используются для отметки релизов в репозитории. Тег — это постоянная метка на конкретном коммите.
- Семантическое версионирование:
v{major}.{minor}.{patch}(например,v1.2.3). - Аннотированные теги с описанием: Содержат информацию о релизе.
git tag -a v1.2.3 -m "Release 1.2.3 - Добавлена интеграция с PaymentGateway - Исправлена утечка памяти в кэше" git push origin v1.2.3
Связь между тегами: Хеш коммита, на который указывает Git-тег v1.2.3, должен совпадать с хешем, из которого был собран Docker-образ с тегом :1.2.3-*. Это обеспечивает полную прослеживаемость от контейнера в кластере до строки кода.