DEMO REPORT

CI Minutes Report

Executive summary

$250.98
Monthly CI spend (measured, not estimated)
$77.8
Recoverable each month
1255
min/mo
runnermin/mo$/mo%
MACOS3036$242.8896.8%
UBUNTU1012$8.13.2%

GitHub's own figure for this cycle: 5770 min used, 3000 included, 2770 billed.

less the 3000 included minutes (worth $24.00 at the Linux rate, however they are spent) → expect to be billed about $226.98. Savings below are priced at list rate, which is what a minute you cut is worth once the allowance is gone.

runner bill: $77.8 · engineer wait time (at $60/h, 30% blocking): $376.46

Billed for nothing

$18.60/mo

Superseded runs: 34 kept running after a newer push replaced them — 412 min burned on results nobody read, about $18.6/month.

$44.20/mo

nightly.yml has failed 21 times in a row and still runs every schedule. Nobody is reading the result — that is $44.20/month for nothing.

$2.10/mo

Artifacts: 11.3 GB live, $2.83/month. 8.4 GB of it is older than 14 days ($2.10/month) and would go away with a retention limit.

1.6 GB over the cache limit

You are 1.6 GB over the limit, so eviction is happening now. 7.2 GB has not been read in 14 days. Dropping it frees the limit without costing a single hit.

Where the money goes (by job, measured)

jobrunnermin/mo$/mo
build-iosMACOS1288$103.04
test-iosMACOS828$66.24
lintMACOS552$44.16
typecheckMACOS368$29.44
unit-apiUBUNTU1012$8.10

Highest-leverage moves

+$39.74/mo high

lint runs on MACOS (10x Linux) but does platform-neutral work — moving it to ubuntu-latest saves $39.74/mo.

+$26.5/mo high

typecheck runs on MACOS (10x Linux) but does platform-neutral work — moving it to ubuntu-latest saves $26.5/mo.

Identified moves total $66.24/month.

Proof — did the fixes actually work?

workflowbeforeafterdeltaruns
ci.yml14.2 min8.1 min -6.1 min 63 ✅
release.yml21.5 min17.9 min -3.6 min 11 ✅

What to do, in order

  1. Decide what nightly.yml is for — it has failed 21 times running and nobody fixed it — $44.2/mo your call
  2. Move lint to a cheaper runner — $39.74/mo cimeter can do it
  3. Move typecheck to a cheaper runner — $26.5/mo cimeter can do it
  4. Cancel runs a newer push has replaced (34 of them last window) — $18.6/mo cimeter can do it
  5. Put a retention limit on artifact uploads (8.4 GB is older than it needs to be) — $2.1/mo cimeter can do it — takes effect on new runs
  6. Clear 7.2 GB of caches nothing has read; you are 1.6 GB over the limit and being evicted one setting

Each figure assumes the ones above it have not been done yet. These interact — moving a job off macOS also makes its cancelled runs cheaper — so re-run this after each change rather than adding the column up.

Workflow overview

JobRuntimeSteps
job-build3.2 min4
job-lint2.4 min4
job-test6.4 min4

Findings (6)

confidence: medium +2.1 min/run

The project is built in 2 jobs

Multiple jobs run a build (~3.1 min each). Downstream jobs can reuse the artifact instead.

💡 Build once, upload with actions/upload-artifact, then download in downstream jobs.

confidence: medium +1.9 min/run

Dependencies installed in 3 jobs

Each job installs dependencies separately (~1.6 min each). A shared cache or a setup job removes the repetition.

💡 Share the dependency cache across jobs, or install once and pass node_modules/artifacts to downstream jobs.

confidence: medium +1.1 min/run

Dependency cache is not configured

Install step took 1.6 min but no cache restore was found. Enabling the package cache typically removes most of this time.

💡 Add `cache: npm` (or pnpm/yarn) to setup-node, or use actions/cache keyed by your lockfile.

confidence: medium +1.1 min/run

Dependency cache is not configured

Install step took 1.6 min but no cache restore was found. Enabling the package cache typically removes most of this time.

💡 Add `cache: npm` (or pnpm/yarn) to setup-node, or use actions/cache keyed by your lockfile.

confidence: medium +1.1 min/run

Dependency cache is not configured

Install step took 1.6 min but no cache restore was found. Enabling the package cache typically removes most of this time.

💡 Add `cache: npm` (or pnpm/yarn) to setup-node, or use actions/cache keyed by your lockfile.

confidence: low +0.5 min/run

checkout/setup repeated across 3 jobs

Repeated checkout + runtime setup adds fixed overhead to every job.

💡 Consider a composite action for shared setup, or merge very short jobs.

Methodology

This is a sample report. The repository, its runs and every figure above are an illustrative fixture built to show the shape of a real report — they were not read from GitHub. On a genuine run this paragraph states where each number came from, and it is measured, not guessed.

데모 리포트

CI 분 절감 리포트

요약

$250.98
월간 CI 지출 (추정 아님, 실측)
$77.8
매달 회수 가능한 금액
1255
min/mo
runnermin/mo$/mo%
MACOS3036$242.8896.8%
UBUNTU1012$8.13.2%

이번 주기에 대한 GitHub의 장부: 5770분 사용, 3000분 무료, 2770분 청구.

여기서 무료 포함분 3000분(어느 러너에서 쓰든 Linux 요율로 $24.00어치)을 빼면 실제 청구는 약 $226.98입니다. 아래 절감액은 정가 기준입니다 — 할당량을 넘긴 뒤 1분을 줄이면 그만큼 아낍니다.

러너 청구액: $77.8 · 엔지니어 대기 비용 (시간당 $60, 블로킹 30% 가정): $376.46

결과 없이 청구된 몫

$18.60/mo

밀린 실행: 34회가 새 푸시에 대체되고도 끝까지 돌았습니다 — 아무도 보지 않는 결과에 412분, 월 약 $18.6입니다.

$44.20/mo

nightly.yml는 21회 연속 실패하면서도 예약마다 계속 돕니다. 결과를 읽는 사람이 없다는 뜻이고, 월 $44.20이 그대로 버려집니다.

$2.10/mo

아티팩트: 살아 있는 용량 11.3 GB, 월 $2.83. 이 중 8.4 GB는 14일보다 오래됐고(월 $2.10), 보관 기간만 정하면 사라집니다.

캐시 한도 1.6 GB 초과

한도를 1.6 GB 넘겼습니다. 지금 축출이 일어나고 있습니다. 7.2 GB는 14일 동안 한 번도 안 읽혔습니다. 이걸 지우면 히트를 하나도 잃지 않고 한도가 비워집니다.

돈이 어디로 가는가 (잡 단위 실측)

jobrunnermin/mo$/mo
build-iosMACOS1288$103.04
test-iosMACOS828$66.24
lintMACOS552$44.16
typecheckMACOS368$29.44
unit-apiUBUNTU1012$8.10

효과가 가장 큰 조치

+$39.74/mo high

lint runs on MACOS (10x Linux) but does platform-neutral work — moving it to ubuntu-latest saves $39.74/mo.

+$26.5/mo high

typecheck runs on MACOS (10x Linux) but does platform-neutral work — moving it to ubuntu-latest saves $26.5/mo.

확인된 조치 합계 월 $66.24.

효과 증명 — 수정이 실제로 통했는가?

workflowbeforeafterdeltaruns
ci.yml14.2 min8.1 min -6.1 min 63 ✅
release.yml21.5 min17.9 min -3.6 min 11 ✅

무엇부터 할 것인가

  1. nightly.yml가 무엇을 위한 것인지 정하세요 — 21회 연속 실패했는데 아무도 안 고쳤습니다 — $44.2/mo 판단 필요
  2. lint을 더 싼 러너로 옮기세요 — $39.74/mo cimeter가 함
  3. typecheck을 더 싼 러너로 옮기세요 — $26.5/mo cimeter가 함
  4. 새 푸시에 밀린 실행을 취소하세요 (지난 창에서 34회) — $18.6/mo cimeter가 함
  5. 아티팩트 업로드에 보관 기간을 두세요 (8.4 GB가 필요 이상으로 오래됐습니다) — $2.1/mo cimeter가 함 — 다음 실행부터 적용
  6. 아무도 안 읽는 캐시 7.2 GB를 지우세요; 한도를 1.6 GB 넘겨 축출되는 중입니다 설정 한 줄

각 금액은 위 항목을 아직 안 했다고 보고 잰 값입니다. 서로 영향을 줍니다 — macOS 잡을 옮기면 그 잡의 취소된 실행도 같이 싸집니다. 그러니 열을 더하지 말고, 하나 고칠 때마다 다시 재세요.

워크플로 개요

잡실행시간단계
job-build3.2 min4
job-lint2.4 min4
job-test6.4 min4

발견 사항 (6)

신뢰도: medium +2.1 분/실행

2개 잡에서 빌드를 반복합니다

여러 잡이 각각 빌드를 수행합니다(각 ~3.1분). 다운스트림 잡은 아티팩트를 재사용할 수 있습니다.

💡 한 번 빌드 후 actions/upload-artifact로 올리고 다운스트림에서 download하세요.

신뢰도: medium +1.9 분/실행

3개 잡에서 의존성을 각각 설치합니다

잡마다 의존성을 따로 설치합니다(각 ~1.6분). 캐시 공유나 셋업 잡으로 반복을 제거할 수 있습니다.

💡 잡 간 의존성 캐시를 공유하거나, 한 번 설치 후 아티팩트로 전달하세요.

신뢰도: medium +1.1 분/실행

의존성 캐시가 설정되어 있지 않습니다

설치 단계가 1.6분 걸렸지만 캐시 복원 흔적이 없습니다. 패키지 캐시를 켜면 이 시간 대부분이 사라집니다.

💡 setup-node에 `cache: npm`(또는 pnpm/yarn)을 추가하거나, lockfile 기반 actions/cache를 사용하세요.

신뢰도: medium +1.1 분/실행

의존성 캐시가 설정되어 있지 않습니다

설치 단계가 1.6분 걸렸지만 캐시 복원 흔적이 없습니다. 패키지 캐시를 켜면 이 시간 대부분이 사라집니다.

💡 setup-node에 `cache: npm`(또는 pnpm/yarn)을 추가하거나, lockfile 기반 actions/cache를 사용하세요.

신뢰도: medium +1.1 분/실행

의존성 캐시가 설정되어 있지 않습니다

설치 단계가 1.6분 걸렸지만 캐시 복원 흔적이 없습니다. 패키지 캐시를 켜면 이 시간 대부분이 사라집니다.

💡 setup-node에 `cache: npm`(또는 pnpm/yarn)을 추가하거나, lockfile 기반 actions/cache를 사용하세요.

신뢰도: low +0.5 분/실행

3개 잡에서 checkout/셋업이 반복됩니다

반복되는 checkout + 런타임 셋업은 모든 잡에 고정 오버헤드를 더합니다.

💡 공통 셋업을 composite action으로 묶거나, 아주 짧은 잡은 병합을 검토하세요.

산정 방식

이 리포트는 예시입니다. 저장소, 실행 기록, 위의 모든 숫자는 실제 리포트의 형식을 보여주기 위해 만든 가상 자료이며 GitHub 에서 읽어온 것이 아닙니다. 실제 실행에서는 이 문단이 각 숫자가 어디서 나왔는지 밝히고, 그 숫자는 추정이 아니라 실측입니다.