Управление расходами на minutes, self-hosted runners, квоты.
CI/CD может стать статьёй расходов при масштабировании. Правильная оптимизация снижает затраты в 5–10 раз без потери качества.
GitHub Actions списывает минуты с квоты с учётом множителя платформы:
| Runner | Множитель | Стоимость минуты* |
|---|---|---|
ubuntu-latest | 1× | $0.008 |
windows-latest | 2× | $0.016 |
macos-latest | 10× | $0.08 |
*Для приватных репозиториев сверх бесплатной квоты
Пример:
jobs:
test-ubuntu:
runs-on: ubuntu-latest # 10 мин = 10 списанных минут
steps:
- run: npm test
test-macos:
runs-on: macos-latest # 10 мин = 100 списанных минут!
steps:
- run: npm test| План | Minutes / месяц | Параллельные job |
|---|---|---|
| Free (приватные) | 2000 | 20 |
| Free (публичные) | Бесплатно | 20 |
| Pro | 3000 | 40 |
| Team | 50000 | 60 |
| Enterprise | 500000 | 180 |
Важно: Публичные (open source) репозитории получают безлимитные бесплатные минуты.
cancel-in-progress отменяет предыдущие запуски при новом коммите:
name: CI
on:
pull_request:
branches: [main]
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref }}
cancel-in-progress: true
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm testЭкономия:
# Дорого — macOS для каждого коммита
jobs:
test:
runs-on: macos-latest # 10× стоимость
steps:
- run: npm test
# Дешево — macOS только для релизов
jobs:
test:
runs-on: ubuntu-latest # 1× стоимость
steps:
- run: npm test
test-macos:
runs-on: macos-latest
if: github.event_name == 'release' # Только для релизов
steps:
- run: npm testЭкономия: 90% на кроссплатформенных тестах.
Когда выгодно:
1000 минут/месяц приватных сборок
Настройка:
# На сервере
cd /opt/actions-runner
./config.sh --url https://github.com/org/repo --token TOKEN
./run.sh# В workflow
jobs:
test:
runs-on: self-hosted # Не списывает минуты!
steps:
- run: npm testРасчёт окупаемости:
| Сценарий | GitHub-hosted / месяц | Self-hosted / месяц |
|---|---|---|
| 500 мин Ubuntu | $4 | $5–10 (VM) |
| 2000 мин Ubuntu | $16 | $5–10 (VM) |
| 100 мин macOS | $80 | $5–10 (Mac mini) |
| 500 мин Windows | $8 | $5–10 (VM) |
Кэширование зависимостей:
# До оптимизации — 5 минут на npm install
steps:
- run: npm install # 5 минут
# После — 30 секунд
steps:
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
- run: npm ci # 30 секунд с кэшемЭкономия: 4.5 минуты × количество сборок.
Уменьшение fetch-depth:
# Полный clone — медленно
steps:
- uses: actions/checkout@v4
# shallow clone — быстро
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 1 # Только последний коммитЭкономия: 5–10 секунд на сборку.
# Запускается на каждый пуш — дорого
on:
push:
pull_request:
# Запускается только на PR и main — дешевле
on:
push:
branches:
- main
pull_request:
branches:
- main
paths:
- 'src/**'
- 'tests/**'
- 'package*.json'paths фильтры:
Workflow от форков могут потреблять ваши минуты.
Настройка:
Альтернатива — ограничение в workflow:
on:
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
# Пропуск для форков
if: github.event.pull_request.head.repo.full_name == github.repository
steps:
- run: npm testjobs:
full-test:
runs-on: ubuntu-latest
# Запуск только для main и релизов
if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/')
steps:
- run: npm run test:all
quick-test:
runs-on: ubuntu-latest
# Быстрые тесты для всех PR
if: github.event_name == 'pull_request'
steps:
- run: npm run test:quick| План | CI/CD minutes / месяц | Параллельные job |
|---|---|---|
| Free | 400 | 10 |
| Premium | 10000 | 10 |
| Ultimate | 50000 | 50 |
Важно: Минуты считаются для всех проектов группы.
Shared runners (предоставлены GitLab):
Group runners (ваши собственные):
Настройка group runner:
# Регистрация runner
gitlab-runner register \
--url https://gitlab.com/ \
--registration-token TOKEN \
--executor docker \
--docker-image docker:latest \
--tag-list my-runner# Использование в .gitlab-ci.yml
test:
tags:
- my-runner # Запуск на своём runner
script:
- npm test# Shared runner — списывает минуты
test:
script:
- npm test
# Group runner — не списывает минуты GitLab
test:
tags:
- group-runner
script:
- npm test# Запуск для всех изменений
test:
script:
- npm test
# Запуск только при изменении кода
test:
rules:
- changes:
- src/**
- tests/**
- package*.json
script:
- npm testAuto-cancel redundant pipelines (настройка проекта):
Вручную через API:
# Отмена старых пайплайнов для ветки
curl --request POST \
--header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
"https://gitlab.com/api/v4/projects/$PROJECT_ID/pipelines"# Без кэша — долго
test:
script:
- npm install
- npm test
# С кэшем — быстро
test:
cache:
key: $CI_COMMIT_REF_SLUG
paths:
- node_modules/
script:
- npm ci
- npm testUsage dashboard:
Workflow runs:
API для метрик:
curl -H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/owner/repo/actions/usageUsage dashboard:
Pipeline analytics:
Сценарий:
Расчёт:
Сборок в месяц: (50 + 10) × 22 = 1320
Минут на Ubuntu: 1320 × 5 = 6600 минут
Стоимость: 6600 × $0.008 = $52.80/месяц
С оптимизацией:
Экономия: $23.23/месяц (44%)
С self-hosted:
cancel-in-progress для PRfetch-depth: 1pathsОптимизация затрат на CI/CD требует комплексного подхода:
Правильная оптимизация снижает затраты в 5–10 раз без потери качества CI/CD.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.