Создание CI/CD пайплайна с Bitbucket + VPS: автоматизация деплоя по‑человечески

ГлавнаяСоздание CI/CD пайплайна с Bitbucket + VPS: автоматизация деплоя по‑человечески

Содержание

Когда я впервые столкнулась с задачей автоматизации доставки кода на VPS, выбор пал на Bitbucket Pipelines. Он простой, встроен в репозиторий и не требует отдельной установки Jenkins, GitLab CI или других тяжеловесных решений. На выходе получился удобный и устойчивый CI/CD пайплайн, который я с тех пор многократно масштабировала под разные проекты.

Что нам нужно:

  • Bitbucket-репозиторий с включёнными Pipelines
  • VPS с доступом по SSH
  • Docker или Nginx (по желанию)
  • Скрипт деплоя или rsync, если проект не в контейнерах

Что такое pipeline?

Pipeline — это последовательность шагов, которые выполняются при каждом коммите, пуше или pull-запросе. В контексте CI/CD (Continuous Integration/Continuous Delivery) пайплайн автоматизирует сборку, тестирование и деплой проекта.

В Bitbucket пайплайны описываются в YAML-файле .bitbucket-pipelines.yml, который лежит в корне проекта. Всё, что нужно — задать шаги: сборка, тесты, деплой, уведомления и т. д.


Мой конфиг .bitbucket-pipelines.yml

Вот пример того, как я настраиваю CI/CD pipeline для обычного Python + Flask проекта:

image: python:3.11

pipelines:
  branches:
    main:
      - step:
          name: Deploy to VPS
          caches:
            - pip
          script:
            - pip install -r requirements.txt
            - scp -o StrictHostKeyChecking=no -r ./ myuser@your.vps.ip:/home/myuser/project
            - ssh myuser@your.vps.ip 'cd /home/myuser/project && systemctl restart flask-app'

Здесь:

  • устанавливаем зависимости,
  • копируем проект на VPS по SSH,
  • и перезапускаем systemd-сервис приложения.

Переменные окружения и SSH-доступ

Bitbucket позволяет безопасно хранить SSH-ключи и токены через интерфейс Repository Settings → Pipelines → Repository variables. Чтобы соединение scp и ssh в пайплайне работало, я:

  1. Создаю SSH-ключ командой:
ssh-keygen -t rsa -b 4096 -C "ci@bitbucket"
  1. Публичный ключ (.pub) добавляю на VPS в ~/.ssh/authorized_keys.
  2. Приватный ключ (id_rsa) добавляю в Bitbucket как DEPLOY_KEY.
  3. В скрипте прописываю:
script:
  - echo "$DEPLOY_KEY" > id_rsa
  - chmod 600 id_rsa
  - ssh -i id_rsa ...

Теперь деплой полностью автоматизирован, а доступ — защищён.


Деплой через Docker

Если проект упакован в Docker, пайплайн становится чище. Я обычно пушу образ в Docker Hub, а VPS тянет его сам:

pipelines:
  default:
    - step:
        name: Build and Push Docker Image
        script:
          - docker build -t mydockerhubuser/myproject:latest .
          - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
          - docker push mydockerhubuser/myproject:latest

А на сервере:

docker pull mydockerhubuser/myproject:latest
docker compose up -d

Нюансы и удобства

Bitbucket Pipelines умеет:

  • делать разные пайплайны по веткам (main, dev, release);
  • триггерить пайплайны вручную;
  • интегрироваться с Slack / Telegram через webhook;
  • логировать каждый шаг для отладки.

Также удобно, что можно задать startLimitBurst, restart=on-failure, RestartSec=5s в systemd, чтобы сервис перезапускался сам при падении (см. статью про auto-healing с systemd).

Отлично! Вот Часть 3/3 статьи по теме «Создание CI/CD пайплайна с Bitbucket + VPS» — логично завершённая, с финальными разделами и SEO-блоком.


Мониторинг CI/CD и логика откатов

Когда пайплайн готов, важно наблюдать за ним: вдруг один из шагов будет падать после обновлений зависимостей, изменения API, банального timeout.

Я использую Telegram-бота, который присылает мне сообщения об успехе или провале:

- curl -X POST https://api.telegram.org/bot$TG_TOKEN/sendMessage \
  -d chat_id=$TG_CHAT_ID \
  -d text=" Деплой успешно завершён на $BITBUCKET_BRANCH"

Добавляю это в after-script, чтобы знать, даже если всё упало.

Также на сервере у меня настроено:

  • fail2ban — блокирует IP при подозрительной активности;
  • Uptime Kuma — следит за тем, что сайт доступен;
  • systemd с Restart=on-failure, чтобы приложение не падало навсегда.

Когда стоит выбрать не Bitbucket Pipelines

Bitbucket отлично справляется с CI/CD, но у него есть ограничения:

  • бесплатный тариф ограничен 50 минутами в месяц (хватает для простых проектов);
  • иногда сложно настроить развёртывание на несколько серверов или сложные пайплайны.

В таких случаях можно:

  • перейти на GitHub Actions (больше интеграций и шаблонов);
  • использовать GitLab CI — там всё в одном: git + CI/CD + registry.

Я использовала Bitbucket Pipelines, когда:

  • проект был на Flask или Laravel, с одним VPS;
  • нужен был простой и понятный конфиг;
  • хотелось не тратить лишнее время на Jenkins и т.д.

Что я думаю…

Создание CI/CD пайплайна через Bitbucket и VPS — это не так страшно, как кажется. Нужно один раз всё собрать, протестировать — и дальше разработка идёт в удовольствие: никаких «заходи на сервер, перезагрузи руками», никаких «ой, забыла скопировать .env».

На проекте у меня это выглядит так:

  • пушу код → пайплайн собирает и деплоит → Telegram уведомляет → сайт обновлён.

Экономия времени? Колоссальная.
Ошибок? Почти нет.
Покой? Почти дзен 😌