Распараллеливание тестов, оптимизация времени выполнения пайплайна.
Параллельное выполнение job и тестов — мощный способ ускорения CI/CD. Правильная параллелизация сокращает время пайплайна в 3–10 раз.
Последовательный пайплайн:
lint (2 мин) → test (10 мин) → build (5 мин) → deploy (3 мин)
Итого: 20 минут
Параллельный пайплайн:
lint (2 мин) ─┐
test (10 мин) ─┤ 2 мин (параллельно)
build (5 мин) ─┘
↓
deploy (3 мин)
Итого: 8 минут
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20, 22]
os: [ubuntu-latest, windows-latest]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm testЧто происходит:
jobs:
test:
runs-on: ubuntu-latest
strategy:
max-parallel: 2 # Максимум 2 job одновременно
matrix:
node-version: [18, 20, 22, 24]Зачем ограничивать:
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false # Не отменять остальные job при ошибке
matrix:
node-version: [18, 20, 22]fail-fast: true (по умолчанию):
fail-fast: false:
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20, 22]
exclude:
- node-version: 18
include:
- node-version: 24
experimental: trueexclude — убирает комбинации из matrix. include — добавляет дополнительные комбинации.
Шаги внутри job выполняются последовательно:
jobs:
test:
runs-on: ubuntu-latest
steps:
- run: pytest tests/unit/ # 5 минут
- run: pytest tests/integration/ # 5 минут
# Итого: 10 минут последовательноpytest с pytest-xdist:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: pip install pytest pytest-xdist
- run: pytest -n auto # auto = количество CPU
# Или явно: pytest -n 4jest с maxWorkers:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm test -- --maxWorkers=4Go с параллельными пакетами:
jobs:
test:
runs-on: ubuntu-latest
steps:
- run: go test -p 4 ./... # 4 пакета параллельноSharding — разделение тестов на группы (шарды), каждая выполняется на отдельном job.
Все тесты (1000 тестов, 30 минут)
↓
Шард 1: тесты 1–333 ─┐
Шард 2: тесты 334–666 ┤ 10 минут параллельно
Шард 3: тесты 667–1000 ┘
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
shard: [1, 2, 3, 4]
steps:
- uses: actions/checkout@v4
- run: npm install
- name: Run tests shard ${{ matrix.shard }}
run: |
# Разделение тестов по shard
npm test -- --shard=${{ matrix.shard }}/4jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
shard: [1, 2, 3, 4]
steps:
- uses: actions/checkout@v4
- name: Get test files
id: tests
run: |
ALL_TESTS=$(find tests -name '*.py' | sort)
TOTAL_SHARDS=4
SHARD=${{ matrix.shard }}
# Разделение на шарды
echo "$ALL_TESTS" | \
awk -v shard=$SHARD -v total=$TOTAL_SHARDS \
'NR % total == shard - 1' > tests_to_run.txt
echo "files=$(cat tests_to_run.txt | tr '\n' ' ')" >> $GITHUB_OUTPUT
- name: Run tests
run: pytest ${{ steps.tests.outputs.files }}pytest-shard:
steps:
- run: pip install pytest-shard
- run: pytest --shard-id=${{ matrix.shard }} --shard-count=4jest-circleci:
steps:
- run: npm install jest-circleci
- run: npx jest --shard=${{ matrix.shard }}/${{ strategy.job-total }}jobs:
lint:
runs-on: ubuntu-latest
steps:
- run: npm run lint
test:
runs-on: ubuntu-latest
needs: lint # Ждёт завершения lint
steps:
- run: npm test
build:
runs-on: ubuntu-latest
needs: [lint, test] # Ждёт оба job
steps:
- run: npm run build
deploy:
runs-on: ubuntu-latest
needs: build
steps:
- run: ./deploy.shjobs:
lint:
runs-on: ubuntu-latest
steps:
- run: npm run lint
test-unit:
runs-on: ubuntu-latest
needs: lint
steps:
- run: npm run test:unit
test-integration:
runs-on: ubuntu-latest
needs: lint
steps:
- run: npm run test:integration
test-e2e:
runs-on: ubuntu-latest
needs: lint
steps:
- run: npm run test:e2e
build:
runs-on: ubuntu-latest
needs: [test-unit, test-integration, test-e2e]
steps:
- run: npm run buildВыполнение:
lint (2 мин)
↓
test-unit ─┐
test-integration ─┤ 5 мин (параллельно)
test-e2e ──┘
↓
build (3 мин)
Итого: 10 минут
# .gitlab-ci.yml
test:
stage: test
image: node:20
parallel:
matrix:
- NODE_VERSION: ['18', '20', '22']
OS: ['ubuntu-latest', 'windows-latest']
script:
- echo "Testing with Node $NODE_VERSION on $OS"
- npm testtest-node-18:
stage: test
image: node:18
script:
- npm test
test-node-20:
stage: test
image: node:20
script:
- npm test
test-node-22:
stage: test
image: node:22
script:
- npm testlint:
stage: test
script:
- npm run lint
test-unit:
stage: test
needs: [] # Выполняется сразу, игнорируя стадии
script:
- npm run test:unit
test-integration:
stage: test
needs: []
script:
- npm run test:integration
build:
stage: build
needs: [lint, test-unit, test-integration]
script:
- npm run buildПреимущество DAG:
deploy:
stage: deploy
resource_group: production # Только один deploy одновременно
script:
- ./deploy.sh
deploy-staging:
stage: deploy
resource_group: staging # Отдельный ресурс для staging
script:
- ./deploy-staging.shGitHub Actions:
actions/github-script для сбора метрикGitLab CI:
# До оптимизации
steps:
- uses: actions/checkout@v4 # 10 сек
- uses: actions/setup-node@v4 # 15 сек
- run: npm install # 2 мин без кэша
# После оптимизации
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 1 # Быстрее checkout
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm' # Кэш зависимостей
- run: npm ci # 20 сек с кэшемjobs:
test-unit:
runs-on: ubuntu-latest
steps:
- run: npm run test:unit # 2 минуты
test-integration:
runs-on: ubuntu-latest
steps:
- run: npm run test:integration # 5 минут
test-e2e:
runs-on: ubuntu-latest
steps:
- run: npm run test:e2e # 10 минут
# Параллельное выполнение: 10 минут вместо 17# До оптимизации
steps:
- run: docker build -t myapp . # 10 минут
# После оптимизации
steps:
- uses: docker/setup-buildx-action@v3
- run: docker buildx build \
--cache-from type=gha \
--cache-to type=gha,mode=max \
-t myapp . # 3 минуты с кэшем| План | Параллельные job | Minutes / месяц |
|---|---|---|
| Free | 20 | 2000 |
| Pro | 40 | 3000 |
| Team | 60 | 50000 |
| Enterprise | 180 | 500000 |
| План | Параллельные job | CI/CD minutes |
|---|---|---|
| Free | 10 | 400 / месяц |
| Premium | 10 | 10000 / месяц |
| Ultimate | 50 | 50000 / месяц |
Параллелизация — ключевой инструмент оптимизации CI/CD:
Правильная параллелизация сокращает время пайплайна в 3–10 раз.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.