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:
Теперь никто не сможет замержить 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:
Теперь никто не сможет замержить 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 если что-то непонятно
Этот урок содержит теоретическую информацию. Изучи материал, затем отметь урок как пройденный.