Как версионировать образы и интегрировать это с Jenkins?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Существуют различные стратегии версионирования образов:
-
Семантическое версионирование: Используем MAJOR.MINOR.PATCH.
- MAJOR: Значительные изменения (ломающие обратную совместимость).
- MINOR: Новые возможности (обратно совместимые).
- PATCH: Исправления ошибок (обратно совместимые).
-
Версионирование по хэшу Git: Используем полный или сокращенный хэш последнего комита. Гарантирует уникальность.
-
Версионирование по номеру сборки Jenkins: Используем автоинкрементный номер сборки Jenkins. Просто, но не привязано к исходному коду напрямую.
-
Комбинированное версионирование: Сочетание, например,
app_version-jenkins_buildилиapp_version-git_commit.
Интеграция с Jenkins включает следующие шаги:
-
Получение версии: В пайплайне Jenkins определяем версию образа. Это может быть:
- Чтение версии из файла проекта (
package.json,pom.xmlи т.д.). - Получение хэша комита Git (
git rev-parse HEAD). - Использование переменной окружения Jenkins (
$BUILD_NUMBER).
- Чтение версии из файла проекта (
-
Сборка образа с тегом: Используем команду
docker buildс опцией-tдля присвоения тега образу.# Dockerfile FROM ubuntu:latest COPY . /app # ...В Jenkinsfile:
// Jenkinsfile pipeline { agent any stages { stage('Build Docker Image') { steps { script { def appVersion = sh(returnStdout: true, script: 'cat VERSION').trim() // Пример чтения из файла def gitHash = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim() // Пример получения Git хэша def imageTag = "${appVersion}-${gitHash}-${env.BUILD_NUMBER}" // Комбинированный тег sh "docker build -t my-app:${imageTag} ." } } } } } -
Разметка (tagging) для репозитория (опционально): Для удобства можно создать дополнительные теги, например
latestили тег для окружения (dev,staging,prod).// В том же стейдже или новом steps { script { def imageTag = "${sh(returnStdout: true, script: 'cat VERSION').trim()}-${sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()}-${env.BUILD_NUMBER}" sh "docker build -t my-app:${imageTag} ." sh "docker tag my-app:${imageTag} my-registry/my-app:latest" // Добавление тега latest } } -
Push образа в репозиторий: Используем команду
docker pushс тегом.// В новом стейдже Push Docker Image stage('Push Docker Image') { steps { script { def imageTag = "${sh(returnStdout: true, script: 'cat VERSION').trim()}-${sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()}-${env.BUILD_NUMBER}" sh "docker push my-registry/my-app:${imageTag}" sh "docker push my-registry/my-app:latest" // Push тега latest } } } -
Применение в развертывании: В файлах манифеста (Kubernetes, Docker Compose) используем переменные окружения Jenkins или другие механизмы для указания нужной версии образа.
# Kubernetes deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 3 template: spec: containers: - name: my-app image: my-registry/my-app:${IMAGE_TAG} # Использование переменной окружения ports: - containerPort: 8080В Jenkinsfile, при развертывании:
// В стейдже Deployment stage('Deploy to Kubernetes') { environment { IMAGE_TAG = "${sh(returnStdout: true, script: 'cat VERSION').trim()}-${sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()}-${env.BUILD_NUMBER}" } steps { sh "kubectl apply -f deployment.yaml --namespace my-namespace" } }
Выбор конкретной стратегии версионирования зависит от требований проекта и команды. Комбинированный подход часто обеспечивает хорошую прослеживаемость от образа до исходного кода и номера сборки.