Налаштування 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
Різні завдання вимагають різних ресурсів. Тести можуть працювати на малих машинах, тоді як складання образу Docker вимагає більше:
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 рази швидше.
Умовні кроки та затвердження
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 та потоком затвердження — 2–3 дні.







