Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Оптимизация затрат
cost_optimization

Оптимизация затрат

Управление расходами на minutes, self-hosted runners, квоты.

Оптимизация затрат на CI/CD

CI/CD может стать статьёй расходов при масштабировании. Правильная оптимизация снижает затраты в 5–10 раз без потери качества.

#Модель ценообразования GitHub Actions

#Минуты и множители

GitHub Actions списывает минуты с квоты с учётом множителя платформы:

RunnerМножительСтоимость минуты*
ubuntu-latest1×$0.008
windows-latest2×$0.016
macos-latest10×$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 (приватные)200020
Free (публичные)Бесплатно20
Pro300040
Team5000060
Enterprise500000180

Важно: Публичные (open source) репозитории получают безлимитные бесплатные минуты.

#Стратегии экономии в GitHub Actions

#1. Отмена устаревших сборок

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

Экономия:

  • При частых коммитах в PR отменяются устаревшие сборки
  • Экономия 30–70% минут для активных PR

#2. Избегайте macOS для частых сборок

# Дорого — 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% на кроссплатформенных тестах.

#3. Self-hosted runners

Когда выгодно:

  • 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)

#4. Оптимизация workflow

Кэширование зависимостей:

# До оптимизации — 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 секунд на сборку.

#5. Ограничение триггеров

# Запускается на каждый пуш — дорого on: push: pull_request: # Запускается только на PR и main — дешевле on: push: branches: - main pull_request: branches: - main paths: - 'src/**' - 'tests/**' - 'package*.json'

paths фильтры:

  • Не запускать CI при изменении документации
  • Экономия 20–40% сборок

#6. Контроль форков

Workflow от форков могут потреблять ваши минуты.

Настройка:

  1. Settings → Actions
  2. Require approval for all outside collaborators

Альтернатива — ограничение в 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 test

#7. Кондиционирование job

jobs: 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

#Модель ценообразования GitLab CI

#Минуты и лимиты

ПланCI/CD minutes / месяцПараллельные job
Free40010
Premium1000010
Ultimate5000050

Важно: Минуты считаются для всех проектов группы.

#GitLab Runners

Shared runners (предоставлены GitLab):

  • Списывают минуты из квоты
  • Доступны всем проектам
  • Очереди при высокой нагрузке

Group runners (ваши собственные):

  • Не списывают минуты GitLab
  • Полный контроль над конфигурацией
  • Требуют своей инфраструктуры

Настройка 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

#Стратегии экономии в GitLab CI

#1. Использование своих runners

# Shared runner — списывает минуты test: script: - npm test # Group runner — не списывает минуты GitLab test: tags: - group-runner script: - npm test

#2. Правила выполнения (rules)

# Запуск для всех изменений test: script: - npm test # Запуск только при изменении кода test: rules: - changes: - src/** - tests/** - package*.json script: - npm test

#3. Отмена устаревших пайплайнов

Auto-cancel redundant pipelines (настройка проекта):

  • Settings → CI/CD → General pipelines
  • Auto-cancel redundant pipelines

Вручную через API:

# Отмена старых пайплайнов для ветки curl --request POST \ --header "PRIVATE-TOKEN: $GITLAB_TOKEN" \ "https://gitlab.com/api/v4/projects/$PROJECT_ID/pipelines"

#4. Оптимизация кэша

# Без кэша — долго test: script: - npm install - npm test # С кэшем — быстро test: cache: key: $CI_COMMIT_REF_SLUG paths: - node_modules/ script: - npm ci - npm test

#Мониторинг использования

#GitHub Actions

Usage dashboard:

  • Settings → Actions → Billing
  • Просмотр расхода минут по репозиториям
  • Уведомления о приближении к лимиту

Workflow runs:

  • Actions → выбор workflow
  • Анализ времени выполнения job

API для метрик:

curl -H "Authorization: token $GITHUB_TOKEN" \ https://api.github.com/repos/owner/repo/actions/usage

#GitLab CI

Usage dashboard:

  • Settings → Billing → CI/CD minutes
  • Просмотр расхода по проектам

Pipeline analytics:

  • CI/CD → Pipelines → анализ времени стадий

#Калькулятор стоимости

#Пример расчёта для проекта

Сценарий:

  • 50 PR в день
  • 10 сборок в день на main
  • Средняя длительность сборки: 5 минут
  • 22 рабочих дня в месяц

Расчёт:

Сборок в месяц: (50 + 10) × 22 = 1320
Минут на Ubuntu: 1320 × 5 = 6600 минут
Стоимость: 6600 × $0.008 = $52.80/месяц

С оптимизацией:

  • Кэширование: −40% времени (4 минуты вместо 5)
  • cancel-in-progress: −30% сборок (924 сборки)
  • Итого: 924 × 4 × $0.008 = $29.57/месяц

Экономия: $23.23/месяц (44%)

С self-hosted:

  • Стоимость VM: $10/месяц
  • Экономия: $42.80/месяц

#Чеклист оптимизации затрат

  • Включить cancel-in-progress для PR
  • Использовать Ubuntu вместо macOS для частых сборок
  • Настроить кэширование зависимостей
  • Использовать fetch-depth: 1
  • Ограничить триггеры через paths
  • Включить approval для форков
  • Рассмотреть self-hosted runners при >1000 мин/месяц
  • Мониторить usage через billing dashboard
  • Использовать conditional jobs для полных тестов
  • Оптимизировать долгие job (параллелизация)

Далее: Уведомления и алерты