microsoft/TypeScript - GitHub Actions cost & CI smells

From the depmedic OSS benchmark dataset. Source: public workflow YAML in microsoft/TypeScript/.github/workflows.

Workflows
18
Per-run $ (modeled)
$1.92
Monthly $ @ 30/day
$1,728
ci-doctor findings
79
Numbers are modeled: 8 minutes per priced job, 30 runs per day per workflow, 30-day month, GitHub-hosted runner rate sheet. microsoft/TypeScript's real run frequency is unknown to me. Smells, however, are real - they come from parsing the actual YAML.

Findings by rule

RuleHits
missing-timeout32
missing-cache25
pinned-action-sha5
fetch-depth-zero5
missing-concurrency4
artifact-no-retention3
always-run-on-pr3
matrix-overcommit1

Per-workflow breakdown

Workflow Jobs Per-run $ Findings
ci.yml 13 $0.70 30
insiders.yaml 2 $0.13 4
nightly.yaml 2 $0.13 4
accept-baselines-fix-lints.yaml 1 $0.06 2
close-issues.yml 1 $0.06 1
codeql.yml 1 $0.06 5
copilot-setup-steps.yml 1 $0.06 2
create-cherry-pick-pr.yml 1 $0.06 3
lkg.yml 1 $0.06 2
new-release-branch.yaml 1 $0.06 4
pr-modified-files.yml 1 $0.06 1
release-branch-artifact.yaml 1 $0.06 4
scorecard.yml 1 $0.06 2
set-version.yaml 1 $0.06 3
sync-branch.yaml 1 $0.06 4
sync-wiki.yml 1 $0.06 2
twoslash-repros.yaml 1 $0.06 4
update-package-lock.yaml 1 $0.06 2

Examples of what ci-doctor reports

ci.yml · WARN missing-cache
actions/setup-node has no cache option. Add 'with: cache: <ecosystem>' to skip dep re-downloads. Saves 30-90 seconds per run.
ci.yml · WARN missing-cache
actions/setup-node has no cache option. Add 'with: cache: <ecosystem>' to skip dep re-downloads. Saves 30-90 seconds per run.
ci.yml · WARN missing-cache
actions/setup-node has no cache option. Add 'with: cache: <ecosystem>' to skip dep re-downloads. Saves 30-90 seconds per run.
insiders.yaml · WARN missing-cache
actions/setup-node has no cache option. Add 'with: cache: <ecosystem>' to skip dep re-downloads. Saves 30-90 seconds per run.
insiders.yaml · WARN missing-cache
actions/setup-node has no cache option. Add 'with: cache: <ecosystem>' to skip dep re-downloads. Saves 30-90 seconds per run.
insiders.yaml · WARN missing-timeout
Job 'test' has no timeout-minutes. Default is 360 (6h). A hung job can drain your CI budget.

What you can do

If you maintain microsoft/TypeScript or a similar workflow shape, three patterns probably move the most dollars per minute of work:

  1. Add a concurrency: block with cancel-in-progress: true on every PR-triggered workflow.
  2. Set timeout-minutes on every job (default is 6 hours).
  3. Make sure every setup-* action sets cache: <ecosystem>.

Free CLIs that automate the audit and the pin step:

npx ci-doctor             # 14-rule audit
npx ci-doctor --fix       # auto-apply the four safe fixes
npx pin-actions           # pin every uses: ref to a SHA
npx gha-budget            # estimate per-run $ + monthly

Want the full pattern set?

The Cut Your CI Bill cookbook is 30 paste-ready GitHub Actions patterns plus 5 hardened workflow templates. $19, one-time, MIT-licensed templates.

Get the cookbook

About this dataset

Methodology and code: /blog/oss-ci-cost-benchmarks.html. Compare with all 20 repos: /benchmarks.html. This page is regenerated when the benchmark dataset is refreshed.