В Jenkins CI (Continuous Integration) и CD (Continuous Delivery/Deployment) можно разделять на разные стадии (stages) или отдельные пайплайны. Это повышает гибкость, упрощает отладку и делает процесс масштабируемым.
🚩Разделение CI и CD внутри одного `Jenkinsfile`
Можно использовать разные стадии (stages) в
Jenkinsfile: Пример:
pipeline {
agent any
stages {
stage('CI: Build & Test') {
steps {
echo "📦 Сборка и тестирование кода"
sh 'mvn clean package' // Сборка
sh 'mvn test' // Юнит-тесты
}
}
stage('CI: Code Analysis') {
steps {
echo "🧐 Анализ кода (SonarQube)"
sh 'sonar-scanner'
}
}
stage('CD: Staging Deployment') {
steps {
echo "🚀 Деплой на стейджинг"
sh 'kubectl apply -f k8s/staging.yaml'
}
}
stage('CD: Production Deployment') {
when {
branch 'main' // Только для main-ветки
}
steps {
echo "🔥 Деплой в прод"
sh 'kubectl apply -f k8s/production.yaml'
}
}
}
}🚩Отдельные пайплайны для CI и CD
Можно разделить CI и CD на разные пайплайны, используя
Jenkins Multibranch Pipeline. CI-пайплайн (
Jenkinsfile.ci) pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
}
post {
success {
archiveArtifacts artifacts: '**/target/*.jar'
build job: 'CD-Pipeline', wait: false // Запуск CD после успешного CI
}
}
}CD-пайплайн (
Jenkinsfile.cd) pipeline {
agent any
stages {
stage('Deploy to Staging') {
steps {
sh 'kubectl apply -f k8s/staging.yaml'
}
}
stage('Manual Approval') {
steps {
input message: "Deploy to Production?"
}
}
stage('Deploy to Production') {
steps {
sh 'kubectl apply -f k8s/production.yaml'
}
}
}
}🚩Использование `Jenkins Shared Library` для разделения логики
Если много пайплайнов, лучше вынести CI/CD-логику в общую библиотеку (
vars/ci.groovy, vars/cd.groovy). Пример CI (
vars/ci.groovy) def call() {
pipeline {
agent any
stages {
stage('Build & Test') {
steps {
sh 'mvn clean package && mvn test'
}
}
}
}
}Пример CD (
vars/cd.groovy) def call() {
pipeline {
agent any
stages {
stage('Deploy') {
steps {
sh 'kubectl apply -f k8s/production.yaml'
}
}
}
}
}Jenkinsfile с использованием библиотек
@Library('my-shared-library') _
ci() // Запуск CI
cd() // Запуск CDСтавь 👍 и забирай 📚 Базу знаний