← Назад к вопросам

Какие знаешь основные этапы CI/CD?

1.6 Junior🔥 221 комментариев
#CI/CD и автоматизация

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI21 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Основные этапы CI/CD pipeline

Что такое CI/CD

CI/CD — это автоматизация процесса разработки, тестирования и развёртывания приложений:

  • CI (Continuous Integration) — непрерывная интеграция кода
  • CD (Continuous Deployment/Delivery) — непрерывное развёртывание в production

Архитектура типичного CI/CD pipeline

Разработчик пушит код
        ↓
    [SCM] Git push
        ↓
    [TRIGGER] Webhook → CI/CD сервер
        ↓
    [BUILD] Компиляция, зависимости
        ↓
    [TEST] Unit, Integration, E2E тесты
        ↓
    [ANALYZE] SonarQube, security scanning
        ↓
    [ARTIFACT] Packaging (Docker image, JAR, WAR)
        ↓
    [REGISTRY] Push in Docker Registry / Artifactory
        ↓
    [DEPLOY] Staging → Production
        ↓
    [VERIFY] Smoke tests, Health checks
        ↓
    [MONITOR] Logs, Metrics, Alerts

1. Trigger (Инициирование)

Способы запуска pipeline:

# GitHub Actions trigger
on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]
  schedule:
    - cron: '0 2 * * *'  # Nightly build

# GitLab CI trigger
schedule:
  - if: '$CI_COMMIT_BRANCH == "main"'
    when: push

Типы триггеров:

  • Push в main/develop branch
  • Pull request создан/обновлён
  • Tag (релиз)
  • Расписание (nightly builds)
  • Manual trigger
  • Webhook от стороннего сервиса

2. Checkout (Получение кода)

# CI/CD сервер клонирует репозиторий
git clone https://github.com/org/repo.git
git checkout $CI_COMMIT_SHA

3. Build (Сборка)

Компиляция кода и подготовка артефактов:

# Java
mvn clean package

# Node.js
npm install
npm run build

# Python
pip install -r requirements.txt
python setup.py build

# Go
go build -o app

# Docker image
docker build -t app:$VERSION .

4. Unit & Integration Tests (Тестирование)

Запуск автоматических тестов:

# Unit тесты
npm test
mvn test
pytest tests/

# Coverage
npm run test:coverage
mvn jacoco:report

# Integration тесты
npm run test:integration
mvn verify

# E2E тесты (Playwright, Cypress)
playwright test
npm run test:e2e

Требование: coverage >= 80-90%

5. Code Quality Analysis (Анализ качества)

Проверка стиля и уязвимостей:

# Linting
npm run lint
pylint src/
golangci-lint run

# Security scanning
npm audit
safety check  # Python
gosec ./...

# SonarQube analysis
sonar-scanner \
  -Dsonar.projectKey=my-app \
  -Dsonar.sources=src

# Container scanning
trivy image myapp:latest

6. Artifact Creation (Создание артефакта)

Упаковка и публикация:

# Docker image
docker build -t myapp:$CI_COMMIT_SHA .
docker tag myapp:$CI_COMMIT_SHA myapp:latest
docker push gcr.io/myproject/myapp:$CI_COMMIT_SHA

# JAR
mvn clean package -DskipTests
# Артефакт: target/app-1.0.0.jar

# NPM package
npm publish

# Python package
twine upload dist/*

7. Push to Registry (Публикация)

# Docker Registry
docker push gcr.io/project/app:latest

# Artifactory
curl -u user:pass -T app.jar http://artifactory/repo/app.jar

# Package managers
npm publish
pip upload dist/*

8. Deploy to Staging (Развёртывание в Staging)

Первая среда для тестирования:

# GitLab CI deployment
deploy-staging:
  stage: deploy
  script:
    - kubectl set image deployment/app app=myapp:$CI_COMMIT_SHA -n staging
    - kubectl rollout status deployment/app -n staging
  environment:
    name: staging
    url: https://staging.example.com
  only:
    - develop

9. Smoke Tests (Проверка на дыме)

Базовые проверки после развёртывания:

#!/bin/bash
# Проверка health endpoint
curl -f https://staging.example.com/health || exit 1

# Проверка версии приложения
VERSION=$(curl https://staging.example.com/api/version)
echo "Deployed version: $VERSION"

# Базовый функциональный тест
curl -X POST https://staging.example.com/api/test

10. Approval & Deploy to Production

Manual approval

# GitHub Actions
deployment_review:
  runs-on: ubuntu-latest
  needs: deploy-staging
  environment:
    name: production
    url: https://example.com
  steps:
    - name: Deploy
      run: kubectl set image deployment/app app=myapp:${{ github.sha }}

Deployment strategies

# 1. Rolling deployment (постепенный)
kubectl set image deployment/app app=myapp:new
kubectl rollout status deployment/app

# 2. Blue-Green deployment
kubectl apply -f deployment-green.yaml
kubectl patch service app -p '{"spec":{"selector":{"color":"green"}}}'

# 3. Canary deployment (5% → 50% → 100%)
# Argo Rollouts или Flagger
kubectl argo rollouts set image myapp myapp=new:version --all

11. Health Checks & Validation

#!/bin/bash
# Проверка приложения в production

# 1. HTTP status
STATUS=$(curl -o /dev/null -s -w "%{http_code}" https://example.com)
if [ $STATUS -ne 200 ]; then
  echo "FAILED: HTTP status $STATUS"
  exit 1
fi

# 2. Response time
RESPONSE_TIME=$(curl -o /dev/null -s -w "%{time_total}" https://example.com)
if [ ${RESPONSE_TIME%.*} -gt 2 ]; then
  echo "FAILED: Response time $RESPONSE_TIME"
  exit 1
fi

# 3. Database connectivity
psql -h db.example.com -U user -d db -c "SELECT 1" > /dev/null || exit 1

12. Monitoring & Alerts

# Prometheus alert rules
alert: HighErrorRate
expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.05
for: 5m

alert: HighResponseTime
expr: histogram_quantile(0.95, http_request_duration_seconds) > 2
for: 10m

alert: PodCrashLooping
expr: rate(kube_pod_container_status_restarts_total[15m]) > 0
for: 5m

Типовой Gitlab CI/CD pipeline

stages:
  - build
  - test
  - analyze
  - package
  - deploy-staging
  - deploy-production

build:
  stage: build
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - dist/

test:unit:
  stage: test
  script:
    - npm test -- --coverage
  coverage: '/Coverage: (\d+)%/'

test:e2e:
  stage: test
  script:
    - npm run test:e2e

analyze:sonar:
  stage: analyze
  script:
    - sonar-scanner

package:docker:
  stage: package
  script:
    - docker build -t myapp:$CI_COMMIT_SHA .
    - docker push gcr.io/project/myapp:$CI_COMMIT_SHA
  only:
    - main

deploy:staging:
  stage: deploy-staging
  script:
    - kubectl set image deployment/app app=myapp:$CI_COMMIT_SHA -n staging
    - kubectl rollout status deployment/app -n staging
  environment:
    name: staging
    url: https://staging.example.com

deploy:production:
  stage: deploy-production
  script:
    - kubectl set image deployment/app app=myapp:$CI_COMMIT_SHA -n production
    - kubectl rollout status deployment/app -n production
  environment:
    name: production
    url: https://example.com
  when: manual  # Manual approval
  only:
    - main

Ключевые метрики CI/CD

МетрикаИдеалХорошоПлохо
Build time<5 мин<10 мин>20 мин
Test coverage>90%>80%<70%
Deployment frequencyDailyWeeklyMonthly
Lead time<1 day<1 week>1 month
MTTR (Mean Time To Recover)<30 min<1 hour>4 hours

Best Practices

  1. Быстрый feedback — пайплайн должен выполняться за 5-10 минут
  2. Раннее тестирование — тесты запускаются как можно раньше
  3. Артефакты один раз — собирай один раз, используй везде
  4. Окружения как код — staging и production идентичны (IaC)
  5. Откат — каждый deployment должен быть откатываемым
  6. Мониторинг — настрой alerting ДО развёртывания в production
  7. Документация — runbooks для инцидентов
  8. Безопасность — secrets в vault, не в коде

Это система, которая превращает pull request в production готовый код за минуты, с полной автоматизацией и контролем качества.

Какие знаешь основные этапы CI/CD? | PrepBro