Настройка CI/CD для сайта через Bitbucket Pipelines
Bitbucket Pipelines встроен в Bitbucket Cloud — никакого отдельного CI-сервера. Конфигурация описывается в bitbucket-pipelines.yml в корне репозитория. Каждый шаг запускается в Docker-контейнере; доступно 50 бесплатных минут/месяц, платные планы снимают ограничения.
Базовая конфигурация
image: node:20-alpine
pipelines:
branches:
main:
- step:
name: Test
caches:
- node
script:
- npm ci
- npm test
- step:
name: Build
caches:
- node
script:
- npm ci
- npm run build
artifacts:
- dist/**
- step:
name: Deploy
deployment: production
script:
- apt-get update && apt-get install -y openssh-client rsync
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" | base64 -d > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- echo "$SSH_KNOWN_HOSTS" >> ~/.ssh/known_hosts
- rsync -avz --delete dist/ deploy@$DEPLOY_HOST:/var/www/mysite/
pull-requests:
'**':
- step:
name: Test PR
script:
- npm ci
- npm test
- npm run lint
Артефакты между шагами
- step:
name: Build
script:
- npm run build
artifacts:
- dist/** # glob-паттерн
- .env.production # конкретный файл
- step:
name: Deploy
script:
- ls dist/ # файлы из предыдущего шага доступны
Артефакты передаются между шагами одного pipeline автоматически. Время хранения — 14 дней.
Переменные окружения
Настраиваются в Repository Settings → Pipelines → Repository variables. Флаг Secured скрывает значение в логах.
Для нескольких репозиториев — Workspace variables (настраиваются на уровне воркспейса).
script:
- echo "$DATABASE_URL" # из Repository variables
- echo "$WORKSPACE_TOKEN" # из Workspace variables
Параллельные шаги
- parallel:
- step:
name: Unit Tests
script:
- npm test
- step:
name: E2E Tests
image: cypress/base:20
script:
- npm ci
- npm run test:e2e
- step:
name: Lint
script:
- npm run lint
Параллельные шаги выполняются одновременно, следующий шаг ждёт завершения всех.
Deployment environments
Bitbucket поддерживает именованные окружения с ручным одобрением:
- step:
name: Deploy to Staging
deployment: staging
script:
- ./deploy.sh staging
- step:
name: Deploy to Production
deployment: production
trigger: manual # кнопка в UI
script:
- ./deploy.sh production
В Deployments (левая панель Bitbucket) видна история деплоев по окружениям, кто задеплоил и когда.
Кастомные pipeline (ручной запуск)
pipelines:
custom:
rollback:
- variables:
- name: RELEASE_TAG
default: 'v1.0.0'
- step:
name: Rollback to tag
script:
- git fetch --tags
- git checkout $RELEASE_TAG
- npm ci && npm run build
- ./deploy.sh production
Запуск: Pipeline → Run pipeline → выбор rollback → ввод переменной. Удобно для экстренного отката.
Docker-сборка
image: atlassian/default-image:4
pipelines:
branches:
main:
- step:
name: Build and push Docker image
services:
- docker
script:
- docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
- docker build -t myrepo/mysite:$BITBUCKET_COMMIT .
- docker push myrepo/mysite:$BITBUCKET_COMMIT
- docker tag myrepo/mysite:$BITBUCKET_COMMIT myrepo/mysite:latest
- docker push myrepo/mysite:latest
Сервис docker подключает Docker daemon к шагу.
PHP/Composer проект
image: php:8.3-cli
definitions:
caches:
composer: vendor
pipelines:
branches:
main:
- step:
caches:
- composer
script:
- apt-get update && apt-get install -y unzip libpq-dev
- docker-php-ext-install pdo_pgsql
- curl -sS https://getcomposer.org/installer | php
- php composer.phar install --no-dev --optimize-autoloader
- php artisan config:cache
- php artisan migrate --force
Уведомления
Bitbucket отправляет email при падении. Для Slack/Telegram — через Webhook или Pipe:
- step:
script:
- npm run build
after-script:
- |
if [ $BITBUCKET_EXIT_CODE -ne 0 ]; then
curl -s -X POST $SLACK_WEBHOOK \
-H 'Content-type: application/json' \
-d '{"text":"Build failed: '"$BITBUCKET_REPO_FULL_NAME"'"}'
fi
Сроки настройки
Первый рабочий pipeline — 1 день: bitbucket-pipelines.yml, переменные, SSH-ключи. Параллельные шаги, кастомные pipeline, Docker — ещё 1–2 дня.







