Создание 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 уведомляет → сайт обновлён.

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


За стабильность — с бонусом

Долгосрочные клиенты получают больше: +1 месяц в подарок по промокоду

Месяц в подарок
COPIED
NEWCOMM COPIED