| runner | min/mo | $/mo | % |
|---|---|---|---|
| MACOS | 3036 | $242.88 | 96.8% |
| UBUNTU | 1012 | $8.1 | 3.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
Superseded runs: 34 kept running after a newer push replaced them — 412 min burned on results nobody read, about $18.6/month.
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.
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.
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.
| job | runner | min/mo | $/mo |
|---|---|---|---|
| build-ios | MACOS | 1288 | $103.04 |
| test-ios | MACOS | 828 | $66.24 |
| lint | MACOS | 552 | $44.16 |
| typecheck | MACOS | 368 | $29.44 |
| unit-api | UBUNTU | 1012 | $8.10 |
lint runs on MACOS (10x Linux) but does platform-neutral work — moving it to ubuntu-latest saves $39.74/mo.
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.
| workflow | before | after | delta | runs |
|---|---|---|---|---|
| ci.yml | 14.2 min | 8.1 min | -6.1 min | 63 ✅ |
| release.yml | 21.5 min | 17.9 min | -3.6 min | 11 ✅ |
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.
| Job | Runtime | Steps |
|---|---|---|
| job-build | 3.2 min | 4 |
| job-lint | 2.4 min | 4 |
| job-test | 6.4 min | 4 |
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.
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.
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.
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.
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.
Repeated checkout + runtime setup adds fixed overhead to every job.
💡 Consider a composite action for shared setup, or merge very short jobs.
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.
| runner | min/mo | $/mo | % |
|---|---|---|---|
| MACOS | 3036 | $242.88 | 96.8% |
| UBUNTU | 1012 | $8.1 | 3.2% |
이번 주기에 대한 GitHub의 장부: 5770분 사용, 3000분 무료, 2770분 청구.
여기서 무료 포함분 3000분(어느 러너에서 쓰든 Linux 요율로 $24.00어치)을 빼면 실제 청구는 약 $226.98입니다. 아래 절감액은 정가 기준입니다 — 할당량을 넘긴 뒤 1분을 줄이면 그만큼 아낍니다.
러너 청구액: $77.8 · 엔지니어 대기 비용 (시간당 $60, 블로킹 30% 가정): $376.46
밀린 실행: 34회가 새 푸시에 대체되고도 끝까지 돌았습니다 — 아무도 보지 않는 결과에 412분, 월 약 $18.6입니다.
nightly.yml는 21회 연속 실패하면서도 예약마다 계속 돕니다. 결과를 읽는 사람이 없다는 뜻이고, 월 $44.20이 그대로 버려집니다.
아티팩트: 살아 있는 용량 11.3 GB, 월 $2.83. 이 중 8.4 GB는 14일보다 오래됐고(월 $2.10), 보관 기간만 정하면 사라집니다.
한도를 1.6 GB 넘겼습니다. 지금 축출이 일어나고 있습니다. 7.2 GB는 14일 동안 한 번도 안 읽혔습니다. 이걸 지우면 히트를 하나도 잃지 않고 한도가 비워집니다.
| job | runner | min/mo | $/mo |
|---|---|---|---|
| build-ios | MACOS | 1288 | $103.04 |
| test-ios | MACOS | 828 | $66.24 |
| lint | MACOS | 552 | $44.16 |
| typecheck | MACOS | 368 | $29.44 |
| unit-api | UBUNTU | 1012 | $8.10 |
lint runs on MACOS (10x Linux) but does platform-neutral work — moving it to ubuntu-latest saves $39.74/mo.
typecheck runs on MACOS (10x Linux) but does platform-neutral work — moving it to ubuntu-latest saves $26.5/mo.
확인된 조치 합계 월 $66.24.
| workflow | before | after | delta | runs |
|---|---|---|---|---|
| ci.yml | 14.2 min | 8.1 min | -6.1 min | 63 ✅ |
| release.yml | 21.5 min | 17.9 min | -3.6 min | 11 ✅ |
각 금액은 위 항목을 아직 안 했다고 보고 잰 값입니다. 서로 영향을 줍니다 — macOS 잡을 옮기면 그 잡의 취소된 실행도 같이 싸집니다. 그러니 열을 더하지 말고, 하나 고칠 때마다 다시 재세요.
| 잡 | 실행시간 | 단계 |
|---|---|---|
| job-build | 3.2 min | 4 |
| job-lint | 2.4 min | 4 |
| job-test | 6.4 min | 4 |
여러 잡이 각각 빌드를 수행합니다(각 ~3.1분). 다운스트림 잡은 아티팩트를 재사용할 수 있습니다.
💡 한 번 빌드 후 actions/upload-artifact로 올리고 다운스트림에서 download하세요.
잡마다 의존성을 따로 설치합니다(각 ~1.6분). 캐시 공유나 셋업 잡으로 반복을 제거할 수 있습니다.
💡 잡 간 의존성 캐시를 공유하거나, 한 번 설치 후 아티팩트로 전달하세요.
설치 단계가 1.6분 걸렸지만 캐시 복원 흔적이 없습니다. 패키지 캐시를 켜면 이 시간 대부분이 사라집니다.
💡 setup-node에 `cache: npm`(또는 pnpm/yarn)을 추가하거나, lockfile 기반 actions/cache를 사용하세요.
설치 단계가 1.6분 걸렸지만 캐시 복원 흔적이 없습니다. 패키지 캐시를 켜면 이 시간 대부분이 사라집니다.
💡 setup-node에 `cache: npm`(또는 pnpm/yarn)을 추가하거나, lockfile 기반 actions/cache를 사용하세요.
설치 단계가 1.6분 걸렸지만 캐시 복원 흔적이 없습니다. 패키지 캐시를 켜면 이 시간 대부분이 사라집니다.
💡 setup-node에 `cache: npm`(또는 pnpm/yarn)을 추가하거나, lockfile 기반 actions/cache를 사용하세요.
반복되는 checkout + 런타임 셋업은 모든 잡에 고정 오버헤드를 더합니다.
💡 공통 셋업을 composite action으로 묶거나, 아주 짧은 잡은 병합을 검토하세요.
이 리포트는 예시입니다. 저장소, 실행 기록, 위의 모든 숫자는 실제 리포트의 형식을 보여주기 위해 만든 가상 자료이며 GitHub 에서 읽어온 것이 아닙니다. 실제 실행에서는 이 문단이 각 숫자가 어디서 나왔는지 밝히고, 그 숫자는 추정이 아니라 실측입니다.