CI/CD Pipeline: что это и как настроить непрерывную интеграцию

Всем привет! Если вы хоть раз выкатывали баги в прод или ловили лютую боль при ручном деплое, то наверняка слышали про CI/CD. Это не магия, а просто способ автоматизировать всё, что можно автоматизировать, чтобы не было мучительно больно за свои коммиты. В этом посте разберёмся, что такое CI/CD pipeline, зачем он нужен, как его поднять на коленке и что делать, если что-то пошло не так. Всё будет на реальных примерах, без занудства.

Возможности CI/CD

  • Автоматизация тестов и сборки — никакого “ой, забыл запустить тесты”.
  • Быстрый и безопасный деплой — пушнул в main, через пару минут код уже на сервере.
  • Меньше человеческого фактора — роботы не устают и не забывают.
  • Легко масштабируется — хочешь деплой на 10 серверов? Пару строчек в конфиге, и готово.

Что потребуется для старта?

  • ОС: любой Linux (Ubuntu 22.04 — самое простое, но можно и CentOS, Debian, даже MacOS, если очень хочется)
  • Железо: хватит VPS с 2ГБ RAM и 1-2 CPU для старта, или любой старый ноут — главное, чтобы тянул Docker
  • GitHub или GitLab репозиторий — пример будет на GitHub Actions, но можно и на GitLab CI
  • Docker — не обязателен, но очень советую, чтобы не плясать с зависимостями
  • Прямые руки и желание автоматизировать

Установка: Пошаговая инструкция

Покажу на примере GitHub Actions — это бесплатно и работает из коробки, если у вас уже есть репозиторий на GitHub.

  1. Создаём папку для workflow:
    В корне репозитория создаём папку .github/workflows.
  2. Добавляем файл workflow:
    Создаём файл ci.yml (или любое другое имя) в .github/workflows.
  3. Пишем базовый pipeline:
    name: CI
    
    on:
      push:
        branches:
          - main
      pull_request:
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
          - name: Checkout code
            uses: actions/checkout@v3
    
          - name: Set up Python
            uses: actions/setup-python@v4
            with:
              python-version: "3.11"
    
          - name: Install dependencies
            run: |
              python -m pip install --upgrade pip
              pip install -r requirements.txt
    
          - name: Run tests
            run: |
              pytest
    

    Это минимальный рабочий пример для Python-проекта. Для Node, Go, Java — меняете шаги под свой стек.

  4. Пушим изменения:
    git add .github/workflows/ci.yml && git commit -m "Add CI pipeline" && git push
  5. Проверяем результат:
    Заходим во вкладку Actions на GitHub, смотрим зелёные (или красные) галочки.

Всё, теперь любой пуш или PR в main будет автоматически прогонять тесты.

Использование: команды и варианты

  • Параметры запуска: Можно запускать workflow по расписанию (cron), по тегам, по релизам и т.д. Пример:
    on:
      schedule:
        - cron: '0 3 * * *' # каждый день в 3:00 UTC
    
  • Деплой на сервер: Можно добавить шаг деплоя через SSH:
    - name: Deploy to server
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USER }}
        key: ${{ secrets.SSH_KEY }}
        script: |
          cd /var/www/myapp
          git pull
          docker-compose up -d --build
    

    Секреты (HOST, USER, SSH_KEY) добавляются в настройках репозитория на GitHub (подробнее тут).

  • Разделение на этапы: Можно делать отдельные jobs для тестов, сборки, деплоя, линтинга, и они могут идти параллельно или последовательно.
  • Матричные сборки: Прогонять тесты на разных версиях Python/Node и ОС. Пример:
    strategy:
      matrix:
        python-version: [3.9, 3.10, 3.11]
        os: [ubuntu-latest, macos-latest]
    

Типичные ошибки и как не надо делать

  • Хардкодить пароли/ключи в workflow-файлы — используйте секреты!
  • Делать один гигантский job — разбивайте pipeline, иначе дебажить будете до седых волос.
  • Игнорировать статус тестов — если тесты не зелёные, не катите в прод (даже если “очень надо”).
  • Не обновлять версии action’ов — используйте актуальные версии, иначе получите баги или уязвимости.
  • Не чистить временные файлы — если билдите образы, не забывайте про cleanup, иначе диск быстро закончится.

Пример из реальной жизни

В одном pet-проекте на Django мы с командой устали вручную деплоить на VPS. Подняли CI/CD на GitHub Actions + деплой через SSH. Теперь любой pull request в main автоматически:

  1. Прогоняет тесты на разных версиях Python
  2. Собирает Docker-образ
  3. Пушит образ в Docker Hub
  4. Перезапускает контейнеры на сервере

В итоге — меньше факапов, больше времени на фичи. А главное — не надо в 2 ночи вспоминать, как руками деплоить.

Заключение

CI/CD — это не про “модно”, а про “удобно и надёжно”. Даже если у вас маленький проект — автоматизация деплоя и тестов сэкономит кучу времени и нервов. Начните с самого простого pipeline, а дальше уже можно будет выкручивать под себя. Для вдохновения и примеров — гляньте официальные гайды:

Автоматизируйте всё, что можно, и пусть ваши деплои будут зелёными!

Хотите прочитать больше про Разное?
Отзывов нет.

Ваш отзыв

Пожалуйста, заполните поля снизу и добавьте отзыв!.
Имя *
E-mail *
Сайт
Сообщение *