Junior
113
questionbank
Расскажи о основных этапах CI/CD.
Ответ от нейросети
sobes.tech AI
Концептуально CI/CD делится на два основных этапа:
-
Continuous Integration (CI):
- Commit (Фиксация изменений): Разработчики фиксируют изменения в общем репозитории кода (например, Git).
- Build (Сборка): Автоматически запускается сборка приложения из исходного кода.
- Test (Тестирование): Прогоняются автоматизированные тесты (юнит, интеграционные, статические анализаторы).
-
Continuous Delivery/Deployment (CD):
- Deploy to Staging (Развертывание на Stage): Успешно собранный и протестированный артефакт развертывается в промежуточной среде (Stage), имитирующей продакшен.
- Automated Acceptance Testing (Автоматическое приемочное тестирование): На Stage-среде выполняются автоматизированные приемочные тесты для проверки бизнес-логики.
- Manual Testing/Exploratory Testing (Ручное/Исследовательское тестирование): При необходимости проводится ручное тестирование на Stage.
- Deploy to Production (Развертывание в Production): При успешном прохождении всех предыдущих этапов артефакт развертывается в продакшен-среде. В случае Continuous Deployment этот этап полностью автоматизирован. В случае Continuous Delivery, может требоваться ручное подтверждение.
- Monitoring and Feedback (Мониторинг и Обратная связь): После развертывания ведется мониторинг работы приложения в продакшене для выявления проблем и сбора обратной связи.
Вот пример пайплайна в Jenkinsfile:
// Jenkinsfile
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn clean install -DskipTests' // Пример сборки Maven, пропуск тестов на этом этапе
}
}
stage('Test') {
steps {
sh 'mvn test' // Запуск юнит- и интеграционных тестов
}
post {
always {
junit '**/TEST-*.xml' // Публикация результатов тестов
}
}
}
stage('Static Analysis') {
steps {
sh 'mvn sonar:sonar' // Пример статического анализа с SonarQube
}
}
stage('Build Docker Image') {
steps {
script {
docker.build("my-app:${env.BUILD_NUMBER}") // Сборка Docker-образа с тегом по номеру сборки
}
}
}
stage('Deploy to Stage') {
steps {
sh 'ssh user@stage-server "deploy_script.sh my-app:${env.BUILD_NUMBER}"' // Пример развертывания на Stage по SSH
}
}
stage('Acceptance Tests') {
steps {
sh 'run_acceptance_tests.sh' // Запуск автоматических приемочных тестов на Stage
}
}
stage('Deploy to Production') {
when {
environment name: 'CONTINUOUS_DEPLOYMENT', value: 'true' // Пример условия для автоматического развертывания в Production
}
steps {
sh 'ssh user@prod-server "deploy_script.sh my-app:${env.BUILD_NUMBER}"' // Развертывание в Production
}
}
stage('Manual Approval for Production') { // Этот этап может быть включен для Continuous Delivery
when {
environment name: 'CONTINUOUS_DEPLOYMENT', value: 'false'
}
steps {
input message: 'Deploy to Production?', ok: 'Deploy Now'
sh 'ssh user@prod-server "deploy_script.sh my-app:${env.BUILD_NUMBER}"'
}
}
}
post {
failure {
mail to: 'devops@example.com', subject: "Build ${env.BUILD_NUMBER} Failed", body: "Build failed for ${env.JOB_NAME}" // Отправка уведомления о фейле
}
success {
mail to: 'devops@example.com', subject: "Build ${env.BUILD_NUMBER} Succeeded", body: "Build succeeded for ${env.JOB_NAME}" // Отправка уведомления об успехе
}
}
}
Основные различия между Continuous Delivery и Continuous Deployment:
| Характеристика | Continuous Delivery | Continuous Deployment |
|---|---|---|
| Развертывание в Production | Требует ручного подтверждения | Полностью автоматизировано |
| Частота развертываний | Возможность развертываться часто | Развертывание происходит при каждом успешном изменении |
| Стабильность | Высокая, но с ручным контролем | Максимально высокая при надлежащих автоматизированных тестах |
| Риски | Ниже из-за ручного контроля | Выше, но снижаются за счет комплексного тестирования |
Каждый этап пайплайна должен быть автоматизирован и выполнять свою специфическую задачу.