Настройка CI/CD для сайта через CircleCI
CircleCI — облачный CI/CD с акцентом на скорость. Использует концепцию orbs (переиспользуемые пакеты конфигурации) и resource classes для тонкой настройки ресурсов под каждый джоб. Конфигурация — .circleci/config.yml.
Базовая конфигурация
version: 2.1
orbs:
node: circleci/[email protected]
jobs:
test:
docker:
- image: cimg/node:20.11
steps:
- checkout
- node/install-packages:
pkg-manager: npm
- run:
name: Run tests
command: npm test
build:
docker:
- image: cimg/node:20.11
steps:
- checkout
- node/install-packages:
pkg-manager: npm
- run: npm run build
- persist_to_workspace:
root: .
paths:
- dist/
deploy:
docker:
- image: cimg/base:2024.01
steps:
- attach_workspace:
at: .
- add_ssh_keys:
fingerprints:
- "SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
- run:
name: Deploy via rsync
command: |
rsync -avz --delete dist/ deploy@$DEPLOY_HOST:/var/www/mysite/
workflows:
build-test-deploy:
jobs:
- test
- build:
requires:
- test
- deploy:
requires:
- build
filters:
branches:
only: main
Workspaces
persist_to_workspace / attach_workspace — механизм передачи файлов между джобами одного воркфлоу. Артефакты сборки (папка dist/) создаются в build и подхватываются в deploy. Работает быстрее, чем кэш — данные хранятся в оперативном хранилище CircleCI на время воркфлоу.
Orbs
Orbs — переиспользуемые блоки конфигурации, опубликованные в реестре. Экономят десятки строк YAML:
orbs:
aws-s3: circleci/[email protected]
slack: circleci/[email protected]
jobs:
deploy_s3:
docker:
- image: cimg/python:3.12
steps:
- attach_workspace:
at: .
- aws-s3/sync:
from: dist/
to: s3://my-bucket/
arguments: --delete
- slack/notify:
event: pass
template: basic_success_1
Популярные orbs: circleci/aws-s3, circleci/kubernetes, circleci/docker, circleci/slack, circleci/heroku.
Resource Classes
Разные джобы требуют разных ресурсов. Тесты — можно на малой машине, сборка образа — нужно побольше:
jobs:
lint:
resource_class: small # 1 CPU, 2GB RAM — дешевле
docker:
- image: cimg/node:20.11
build_docker:
resource_class: large # 4 CPU, 8GB RAM
machine:
image: ubuntu-2204:current
Классы: small, medium (по умолчанию), medium+, large, xlarge, 2xlarge. Стоимость в кредитах пропорциональна.
Параллельное выполнение тестов
CircleCI умеет автоматически разбивать тест-сьюты на N параллельных контейнеров:
test:
parallelism: 4
docker:
- image: cimg/node:20.11
steps:
- checkout
- node/install-packages
- run:
name: Split and run tests
command: |
TESTFILES=$(circleci tests glob "**/*.test.ts" | circleci tests split --split-by=timings)
npx jest $TESTFILES
- store_test_results:
path: test-results/
circleci tests split --split-by=timings — разбивает файлы по историческим данным о времени выполнения, балансируя нагрузку между контейнерами. При 4 контейнерах тесты проходят примерно в 4 раза быстрее.
Условные шаги и approval
workflows:
deploy:
jobs:
- build
- hold:
type: approval # ждёт ручного нажатия в UI
requires:
- build
- deploy_production:
requires:
- hold
filters:
branches:
only: main
type: approval — джоб-пауза, требует подтверждения в CircleCI UI. Удобно для деплоя на прод.
SSH-доступ к упавшему билду
При сбое можно переподключиться к контейнеру:
circleci ssh --job JOB_ID
Или включить в конфиге:
- run:
when: on_fail
command: sleep 600 # держит контейнер 10 минут для SSH-отладки
Хранение артефактов и тест-результатов
- store_artifacts:
path: dist/
destination: build-output
- store_test_results:
path: test-results/
Артефакты доступны в UI на вкладке Artifacts. Тест-результаты в формате JUnit XML отображаются на вкладке Tests с разбивкой по сьютам.
Сроки настройки
Первый рабочий пайплайн — 1 день: создание .circleci/config.yml, добавление SSH-ключей и переменных окружения в проект, отладка. Полная конфигурация с параллельными тестами, orbs, approval flow — 2–3 дня.







