ИППРПО

CI/CD

ИППРПО

План лекции

  • Введение в CI/CD
  • Основные концепции и принципы
  • Пайплайны и стадии
  • Инструменты CI/CD
  • Настройка Jenkins
  • GitHub Actions
  • GitLab CI
  • Docker в CI/CD
  • Тестирование в пайплайнах
  • Деплоймент стратегии
  • Мониторинг и логирование
  • Лучшие практики
CI/CD
ИППРПО

Введение в CI/CD

CI/CD (Continuous Integration/Continuous Deployment) — это практика автоматизации процессов сборки, тестирования и развертывания приложений.

Зачем нужен CI/CD?

  • Сокращение времени выхода новых функций
  • Повышение качества кода
  • Автоматизация рутинных операций
  • Снижение человеческого фактора
  • Ускорение обратной связи
CI/CD
ИППРПО

Что такое CI?

Continuous Integration (CI) — непрерывная интеграция:

  • Автоматическая сборка при каждом коммите
  • Автоматическое тестирование
  • Проверка качества кода
  • Создание артефактов

Преимущества CI:

  • Раннее обнаружение ошибок
  • Упрощение интеграции
  • Повышение уверенности в коде
CI/CD
ИППРПО

Что такое CD?

Continuous Delivery/Deployment (CD) — непрерывная доставка/развертывание:

Continuous Delivery:

  • Автоматическая подготовка к релизу
  • Ручное подтверждение деплоя
  • Готовность к развертыванию в любой момент

Continuous Deployment:

  • Полностью автоматическое развертывание
  • Нет ручного вмешательства
  • Мгновенный релиз после прохождения тестов
CI/CD
ИППРПО

Жизненный цикл CI/CD

center

CI/CD
ИППРПО

Основные компоненты CI/CD

Источник кода (SCM):

  • Git, SVN, Mercurial
  • GitHub, GitLab, Bitbucket

Сервер CI/CD:

  • Jenkins, GitLab CI, GitHub Actions
  • TeamCity, Bamboo, Azure DevOps

Среда выполнения:

  • Docker, Kubernetes
  • Виртуальные машины, облако
CI/CD
ИППРПО

Типы тестирования в CI/CD

center

CI/CD
ИППРПО

Инструменты CI/CD

Инструмент Тип Особенности
Jenkins Самостоятельный Гибкий, open-source
GitHub Actions Облачный Интеграция с GitHub
GitLab CI Облачный/Самостоятельный Встроен в GitLab
TeamCity Самостоятельный От JetBrains
Azure DevOps Облачный Microsoft
Bamboo Самостоятельный Atlassian
CI/CD
ИППРПО

Jenkins: Введение

Jenkins — самый популярный инструмент CI/CD с открытым исходным кодом.

Преимущества:

  • Огромное количество плагинов (1800+)
  • Гибкая настройка
  • Активное сообщество
  • Поддержка всех языков и платформ

Недостатки:

  • Требует настройки и обслуживания
  • Интерфейс устаревший
  • Нужен отдельный сервер
CI/CD
ИППРПО

Установка Jenkins

Docker способ (рекомендуемый):

# Запуск Jenkins в Docker
docker run -d \
  --name jenkins \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins_home:/var/jenkins_home \
  jenkins/jenkins:lts

# Получение начального пароля
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

Доступ: http://localhost:8080

CI/CD
ИППРПО

Настройка Jenkins

  1. Первоначальная настройка:

    • Ввод начального пароля
    • Установка рекомендованных плагинов
    • Создание администратора
  2. Необходимые плагины:

    • Pipeline
    • Git
    • Docker
    • Blue Ocean (современный UI)
CI/CD
ИППРПО

Jenkins Pipeline

Jenkinsfile — файл описания пайплайна:

pipeline {
    agent any
    
    stages {
        stage('Checkout') {
            steps {
                git 'https://github.com/myapp.git'
            }
        }
        
        stage('Build') {
            steps {
                sh 'npm install'
                sh 'npm run build'
            }
        }
        
        stage('Test') {
            steps {
                sh 'npm test'
            }
        }
    }
}
CI/CD
ИППРПО

GitHub Actions: Введение

GitHub Actions — встроенная система CI/CD от GitHub.

Преимущества:

  • Интеграция с GitHub
  • Большое сообщество и marketplace
  • Бесплатные минуты для публичных репозиториев
  • Простота настройки

Файл конфигурации: .github/workflows/main.yml

CI/CD
ИППРПО

Структура GitHub Actions

name: CI/CD Pipeline

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18'
    - name: Install dependencies
      run: npm install
    - name: Run tests
      run: npm test
CI/CD
ИППРПО

GitHub Actions: Примеры триггеров

# Триггер на push в определенные ветки
on:
  push:
    branches: [ main, develop ]

# Триггер на pull request
on:
  pull_request:
    branches: [ main ]

# Триггер по расписанию
on:
  schedule:
    - cron: '0 2 * * *'  # Каждый день в 2:00

# Ручной запуск
on:
  workflow_dispatch:
CI/CD
ИППРПО

GitHub Actions: Матрица сборок

strategy:
  matrix:
    node-version: [14.x, 16.x, 18.x]
    os: [ubuntu-latest, windows-latest, macos-latest]

runs-on: ${{ matrix.os }}

steps:
- uses: actions/checkout@v3
- name: Setup Node.js
  uses: actions/setup-node@v3
  with:
    node-version: ${{ matrix.node-version }}
- name: Install dependencies
  run: npm install
- name: Run tests
  run: npm test
CI/CD
ИППРПО

GitLab CI: Введение

GitLab CI/CD — встроенная система в GitLab.

Преимущества:

  • Полная интеграция с GitLab
  • Docker встроен по умолчанию
  • Auto DevOps для автоматической настройки
  • Гибкая конфигурация

Файл конфигурации: .gitlab-ci.yml

CI/CD
ИППРПО

Структура GitLab CI

stages:
  - build
  - test
  - deploy

variables:
  NODE_VERSION: "18"

build:
  stage: build
  image: node:${NODE_VERSION}
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - dist/

test:
  stage: test
  image: node:${NODE_VERSION}
  script:
    - npm test

deploy:
  stage: deploy
  script:
    - echo "Deploying application"
  only:
    - main
CI/CD
ИППРПО

Docker в CI/CD

Преимущества использования Docker:

  • Консистентность окружений
  • Изоляция зависимостей
  • Легковесность и быстрота
  • Версионирование окружений

Использование Docker в пайплайнах:

  • Сборка образов
  • Запуск тестов в контейнерах
  • Развертывание контейнеров
  • Мульти-стейдж сборки
CI/CD
ИППРПО

Docker в GitHub Actions

name: Docker Build and Deploy

on:
  push:
    branches: [ main ]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Build Docker image
      run: docker build -t myapp:${{ github.sha }} .
    
    - name: Run tests in container
      run: docker run myapp:${{ github.sha }} npm test
    
    - name: Login to Docker Hub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
    
    - name: Push to Docker Hub
      run: |
        docker tag myapp:${{ github.sha }} myapp:latest
        docker push myapp:latest
CI/CD
ИППРПО

Мульти-стейдж Docker сборка

# Stage 1: Build
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# Stage 2: Production
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
CI/CD
ИППРПО

Тестирование в CI/CD

Типы тестов и их место в пайплайне:

stages:
  - unit-tests      # Быстрые тесты (1-5 мин)
  - integration     # Интеграционные (5-15 мин)
  - e2e-tests       # E2E тесты (15-60 мин)
  - performance     # Производительность (30+ мин)
  - security        # Безопасность (10-30 мин)
CI/CD
ИППРПО

Unit тесты

unit-tests:
  stage: test
  script:
    - npm install
    - npm run test:unit
  coverage: '/Coverage: \d+\.\d+%/'
  artifacts:
    reports:
      junit: test-results.xml
      coverage_report:
        coverage_format: cobertura
        path: coverage.xml
CI/CD
ИППРПО

Интеграционные тесты

integration-tests:
  stage: integration
  services:
    - postgres:15
    - redis:7
  variables:
    DATABASE_URL: postgresql://postgres:postgres@postgres:5432/test
    REDIS_URL: redis://redis:6379
  script:
    - npm install
    - npm run test:integration
  coverage: '/Coverage: \d+\.\d+%/'
CI/CD
ИППРПО

E2E тесты

e2e-tests:
  stage: e2e-tests
  image: cypress/browsers:node18.12.0-chrome107
  services:
    - name: nginx:alpine
      alias: app
  script:
    - npm install
    - npm run build
    - npm run test:e2e
  artifacts:
    when: always
    paths:
      - cypress/videos/
      - cypress/screenshots/
    expire_in: 1 week
CI/CD
ИППРПО

Стратегии деплоя

Стратегия Описание Преимущества Недостатки
Recreate Удалить все, создать новое Простота Простой
Rolling Постепенное обновление Нет простоя Долго
Blue/Green Две одинаковые среды Быстрый откат Дорого
Canary Постепенное переключение трафика Контроль риска Сложность
A/B Testing Тестирование версий Данные о поведении Сложность
CI/CD
ИППРПО

Blue/Green Deployment

deploy-blue-green:
  stage: deploy
  script:
    - # Deploy to Green environment
    - kubectl apply -f green-deployment.yaml
    - # Run health checks
    - kubectl wait --for=condition=ready pod -l app=myapp-green
    - # Switch traffic to Green
    - kubectl patch service myapp -p '{"spec":{"selector":{"version":"green"}}}'
    - # If successful, delete Blue
    - kubectl delete deployment myapp-blue
  after_script:
    - # Rollback if failed
    - kubectl patch service myapp -p '{"spec":{"selector":{"version":"blue"}}}'
CI/CD
ИППРПО

Canary Deployment

deploy-canary:
  stage: deploy
  script:
    - # Deploy Canary version (10% трафика)
    - kubectl apply -f canary-deployment.yaml
    - # Monitor metrics for 30 minutes
    - sleep 1800
    - # Check error rate
    - ERROR_RATE=$(check-metrics.sh)
    - |
      if [ "$ERROR_RATE" -lt 5 ]; then
        # Increase to 50%
        kubectl scale deployment myapp-canary --replicas=5
        sleep 1800
        # If still good, deploy 100%
        kubectl patch service myapp -l version=stable
      else
        # Rollback
        kubectl delete deployment myapp-canary
      fi
CI/CD
ИППРПО

Мониторинг и логирование

Ключевые метрики для мониторинга:

  • Время сборки
  • Процент успешных сборок
  • Время деплоя
  • Время восстановления (MTTR)
  • Частота деплоя
  • Процент ошибок в продакшене
CI/CD
ИППРПО

Интеграция с мониторингом

notify-metrics:
  stage: notify
  script:
    - |
      # Отправка метрик в Prometheus
      cat <<EOF | curl -X POST -H "Content-Type: text/plain" --data-binary @- http://pushgateway:9091/metrics/job/ci_cd/instance/$CI_COMMIT_REF_NAME
      ci_build_duration_seconds $CI_JOB_DURATION
      ci_build_status{status="$CI_JOB_STATUS"} 1
      ci_deployment_timestamp $(date +%s)
      EOF
    
    - |
      # Уведомление в Slack
      curl -X POST -H 'Content-Type: application/json' \
        -d "{\"text\":\"Deployment completed: $CI_COMMIT_REF_NAME - $CI_JOB_STATUS\"}" \
        $SLACK_WEBHOOK_URL
CI/CD
ИППРПО

Кэширование зависимостей

# GitHub Actions
- name: Cache dependencies
  uses: actions/cache@v3
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-

# GitLab CI
cache:
  paths:
    - node_modules/
    - .npm/
  key: "$CI_COMMIT_REF_SLUG"
CI/CD
ИППРПО

Артефакты и отчеты

artifacts:
  when: always
  paths:
    - coverage/
    - test-results/
    - build/
  reports:
    junit: test-results/junit.xml
    coverage_report:
      coverage_format: cobertura
      path: coverage/cobertura-coverage.xml
    codequality: codequality.json
  expire_in: 30 days
CI/CD
ИППРПО

Секреты и безопасность

# GitHub Secrets
${{ secrets.DOCKER_USERNAME }}
${{ secrets.DOCKER_PASSWORD }}
${{ secrets.API_KEY }}
${{ secrets.SSH_PRIVATE_KEY }}

# GitLab CI Variables
${DOCKER_USERNAME}
${DOCKER_PASSWORD}
${CI_JOB_TOKEN}
${CI_REGISTRY_USER}
CI/CD
ИППРПО

Проверка безопасности

security-scan:
  stage: security
  script:
    - npm audit --audit-level moderate
    - docker run --rm -v "$PWD":/src clair-scanner:latest
    - sonar-scanner \
        -Dsonar.projectKey=myproject \
        -Dsonar.sources=. \
        -Dsonar.host.url=$SONAR_URL \
        -Dsonar.login=$SONAR_TOKEN
  allow_failure: true
CI/CD
ИППРПО

Лучшие практики CI/CD

  1. Держите пайплайны быстрыми

    • Параллелизируйте тесты
    • Используйте кэширование
    • Оптимизируйте сборку
  2. Тестируйте в production-подобной среде

    • Используйте Docker
    • Контейнеризуйте зависимости
    • Тестируйте конфигурации
  3. Автоматизируйте всё

    • Сборка, тесты, деплой
    • Уведомления
    • Откат при ошибках
CI/CD
ИППРПО

Лучшие практики (продолжение)

  1. Используйте feature flags

    • Контроль включения функций
    • Постепенный ролл-аут
    • Быстрый откат
  2. Мониторьте и измеряйте

    • Время пайплайна
    • Процент успешных деплоев
    • Время восстановления
  3. Документируйте

    • Описание пайплайнов
    • Процедуры отката
    • Конфигурации
CI/CD
ИППРПО

Ошибки в CI/CD

Распространенные ошибки:

  • Слишком долгие сборки
  • Игнорирование тестов
  • Разные окружения для dev/prod
  • Отсутствие мониторинга
  • Сложные пайплайны
  • Отсутствие стратегии отката

Как избежать:

  • Профилируйте и оптимизируйте
  • Не пропускайте упавшие тесты
  • Используйте Docker
  • Настройте мониторинг
  • Делайте пайплайны простыми
  • Планируйте откат заранее
CI/CD
ИППРПО

Итоги

CI/CD — это фундамент современной разработки:

  • Автоматизация рутинных операций
  • Быстрая обратная связь о качестве кода
  • Надежность процессов развертывания
  • Масштабируемость команд и проектов
  • Контроль качества и безопасности

Ключ к успеху — начать с простого и постепенно улучшать!

CI/CD
ИППРПО

Контрольные вопросы

  1. В чем различие между CI и CD?
  2. Какие существуют стратегии деплоя и когда их использовать?
  3. Какие преимущества использования Docker в CI/CD?
  4. Как оптимизировать время выполнения пайплайна?
  5. Что такое Blue/Green deployment?
  6. Какие метрики важно отслеживать в CI/CD?
  7. Как обеспечить безопасность в CI/CD?
  8. Какие инструменты CI/CD вы бы выбрали для своего проекта и почему?
CI/CD
ИППРПО

Дополнительные материалы

CI/CD