CI/CD — это набор практик, которые автоматизируют процесс доставки кода от разработчика до пользователя.
CI CD (Delivery) CD (Deployment)
Push → Build → Test → Ready to deploy → Auto deploy
↑ ручная кнопка ↑ автоматическиБез CI/CD:
С CI/CD:
GitHub Actions — встроенная CI/CD платформа GitHub. Бесплатна для открытых репозиториев и имеет щедрый лимит для приватных.
my-project/
├── .github/
│ └── workflows/
│ ├── ci.yml # основной CI pipeline
│ ├── deploy.yml # деплой
│ └── lint.yml # линтер
├── src/
└── package.jsonФайлы workflow — это YAML-файлы в папке .github/workflows/.
YAML — язык разметки для конфигураций. Используется в GitHub Actions, Docker Compose, Kubernetes.
# Строки
name: My Workflow
message: "Hello, World!"
# Списки
steps:
- first
- second
- third
# Объекты (вложенность через отступы — 2 пробела!)
job:
name: Build
runs-on: ubuntu-latest
# Многострочные строки
description: |
Это многострочный текст.
Каждая строка сохраняется.Важно: YAML чувствителен к отступам. Всегда используйте пробелы, не табы!
# Название workflow (видно во вкладке Actions)
name: CI
# Триггеры — когда запускать
on:
push:
branches: [main]
pull_request:
branches: [main]
# Задачи
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test| Элемент | Описание |
|---------|----------|
| name | Название workflow |
| on | Когда запускать (триггеры) |
| jobs | Набор задач для выполнения |
| runs-on | На какой ОС запускать |
| steps | Последовательность шагов в задаче |
| uses | Подключить готовое action |
| run | Выполнить shell-команду |
on:
push:
branches: [main, develop]
paths:
- 'src/**'
- 'package.json'on:
pull_request:
branches: [main]
types: [opened, synchronize, reopened]on:
schedule:
- cron: '0 9 * * 1' # Каждый понедельник в 9:00 UTCon:
workflow_dispatch:
inputs:
environment:
description: 'Deploy environment'
required: true
default: 'staging'on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:По умолчанию jobs выполняются параллельно:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm run lint
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm test
build:
runs-on: ubuntu-latest
needs: [lint, test] # ждёт завершения lint и test
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm run buildКлючевое слово needs задаёт зависимости между jobs. В примере выше build запустится только после успешного завершения lint и test.
steps:
# Шаг 1: клонировать репозиторий
- uses: actions/checkout@v4
# Шаг 2: установить Node.js
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
# Шаг 3: установить зависимости
- name: Install dependencies
run: npm ci
# Шаг 4: запустить тесты
- name: Run tests
run: npm testname: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20]
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test -- --coverage
- name: Upload coverage
if: matrix.node-version == 20
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/strategy.matrix позволяет запускать одну и ту же задачу с разными параметрами — например, на разных версиях Node.js.
name: Lint
on:
pull_request:
branches: [main]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- name: ESLint
run: npm run lint
- name: TypeScript check
run: npx tsc --noEmit
- name: Prettier check
run: npx prettier --check "src/**/*.{ts,tsx}"name: Full CI
on:
pull_request:
branches: [main]
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run lint
- run: npx tsc --noEmit
- run: npm test -- --coverage
- run: npm run build# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: npm
directory: /
schedule:
interval: weekly
open-pull-requests-limit: 10| Action | Описание |
|--------|----------|
| actions/checkout@v4 | Клонировать репозиторий |
| actions/setup-node@v4 | Установить Node.js |
| actions/cache@v4 | Кэширование зависимостей |
| actions/upload-artifact@v4 | Сохранить артефакты сборки |
| github/codeql-action | Анализ безопасности кода |
GitHub позволяет сделать CI обязательным для мержа PR:
1. Settings → Branches → Branch protection rules
2. Require status checks to pass before merging
3. Выбрать нужные workflow (например, "test", "lint")
Теперь никто не сможет замержить PR, если CI красный. Это главная защита от багов в production.
Минимальный CI workflow для Node.js проекта
name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run lint
- run: npm test
- run: npm run buildМатрица версий Node.js в CI
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm testCI/CD — это набор практик, которые автоматизируют процесс доставки кода от разработчика до пользователя.
CI CD (Delivery) CD (Deployment)
Push → Build → Test → Ready to deploy → Auto deploy
↑ ручная кнопка ↑ автоматическиБез CI/CD:
С CI/CD:
GitHub Actions — встроенная CI/CD платформа GitHub. Бесплатна для открытых репозиториев и имеет щедрый лимит для приватных.
my-project/
├── .github/
│ └── workflows/
│ ├── ci.yml # основной CI pipeline
│ ├── deploy.yml # деплой
│ └── lint.yml # линтер
├── src/
└── package.jsonФайлы workflow — это YAML-файлы в папке .github/workflows/.
YAML — язык разметки для конфигураций. Используется в GitHub Actions, Docker Compose, Kubernetes.
# Строки
name: My Workflow
message: "Hello, World!"
# Списки
steps:
- first
- second
- third
# Объекты (вложенность через отступы — 2 пробела!)
job:
name: Build
runs-on: ubuntu-latest
# Многострочные строки
description: |
Это многострочный текст.
Каждая строка сохраняется.Важно: YAML чувствителен к отступам. Всегда используйте пробелы, не табы!
# Название workflow (видно во вкладке Actions)
name: CI
# Триггеры — когда запускать
on:
push:
branches: [main]
pull_request:
branches: [main]
# Задачи
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test| Элемент | Описание |
|---------|----------|
| name | Название workflow |
| on | Когда запускать (триггеры) |
| jobs | Набор задач для выполнения |
| runs-on | На какой ОС запускать |
| steps | Последовательность шагов в задаче |
| uses | Подключить готовое action |
| run | Выполнить shell-команду |
on:
push:
branches: [main, develop]
paths:
- 'src/**'
- 'package.json'on:
pull_request:
branches: [main]
types: [opened, synchronize, reopened]on:
schedule:
- cron: '0 9 * * 1' # Каждый понедельник в 9:00 UTCon:
workflow_dispatch:
inputs:
environment:
description: 'Deploy environment'
required: true
default: 'staging'on:
push:
branches: [main]
pull_request:
branches: [main]
workflow_dispatch:По умолчанию jobs выполняются параллельно:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm run lint
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm test
build:
runs-on: ubuntu-latest
needs: [lint, test] # ждёт завершения lint и test
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm run buildКлючевое слово needs задаёт зависимости между jobs. В примере выше build запустится только после успешного завершения lint и test.
steps:
# Шаг 1: клонировать репозиторий
- uses: actions/checkout@v4
# Шаг 2: установить Node.js
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
# Шаг 3: установить зависимости
- name: Install dependencies
run: npm ci
# Шаг 4: запустить тесты
- name: Run tests
run: npm testname: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20]
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test -- --coverage
- name: Upload coverage
if: matrix.node-version == 20
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/strategy.matrix позволяет запускать одну и ту же задачу с разными параметрами — например, на разных версиях Node.js.
name: Lint
on:
pull_request:
branches: [main]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- name: ESLint
run: npm run lint
- name: TypeScript check
run: npx tsc --noEmit
- name: Prettier check
run: npx prettier --check "src/**/*.{ts,tsx}"name: Full CI
on:
pull_request:
branches: [main]
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run lint
- run: npx tsc --noEmit
- run: npm test -- --coverage
- run: npm run build# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: npm
directory: /
schedule:
interval: weekly
open-pull-requests-limit: 10| Action | Описание |
|--------|----------|
| actions/checkout@v4 | Клонировать репозиторий |
| actions/setup-node@v4 | Установить Node.js |
| actions/cache@v4 | Кэширование зависимостей |
| actions/upload-artifact@v4 | Сохранить артефакты сборки |
| github/codeql-action | Анализ безопасности кода |
GitHub позволяет сделать CI обязательным для мержа PR:
1. Settings → Branches → Branch protection rules
2. Require status checks to pass before merging
3. Выбрать нужные workflow (например, "test", "lint")
Теперь никто не сможет замержить PR, если CI красный. Это главная защита от багов в production.
Минимальный CI workflow для Node.js проекта
name: CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm run lint
- run: npm test
- run: npm run buildМатрица версий Node.js в CI
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm testИзучи материал выше и задай вопросы AI если что-то непонятно
Этот урок содержит теоретическую информацию. Изучи материал, затем отметь урок как пройденный.