I maintain ci-doctor. The most common question I get is "isn't this what actionlint does?"
Short answer: no, and you should run both. Here's why.
tl;dr
Run both. We do, on every depmedic repo. actionlint for correctness, ci-doctor for cost and reliability. They take roughly 6 ms each on a typical repo.
Where actionlint wins
-
Shell script linting via shellcheck. Catches
[[ $foo == "bar" ]]instead of[[ "$foo" == "bar" ]], missing quotes, unsafe glob expansion, the whole shellcheck rule library insiderun:blocks. -
Expression / context typing. Knows
github.event.repository.privateis a boolean and complains if you compare it to a string. -
Action input validation. Reads each action's
action.ymland verifies you're passing the right inputs. -
Matrix matrix matrix. Rich validation for
strategy.matrix.include/excludepatterns. - Pure Go binary, very fast, very mature, written by rhysd who knows GitHub Actions cold.
Where ci-doctor wins
-
Cost rules actionlint does not have.
missing-concurrency,missing-cache,expensive-runner,cron-storm,wide-paths. These show up in the bill, not in the build log. -
Reliability rules actionlint does not have.
missing-timeout-minutes,flaky-retries,legacy-actions-version,service-no-healthcheck. -
Auto-fix mode.
npx ci-doctor --fixrewrites four safe categories in place. -
$-denominated cost via
gha-budget. Pairs cleanly. -
SARIF + sticky PR comment via
ci-doctor-action. - Same engine ports to GitLab, Bitbucket, Azure Pipelines, CircleCI with CI-native rules. One mental model across stacks.
Run them side by side
name: ci-audit
on: pull_request
permissions:
contents: read
security-events: write
jobs:
actionlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: reviewdog/action-actionlint@v1
ci-doctor:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: depmedicdev-byte/ci-doctor-action@v1
12 seconds total. Reports go to different categories (actionlint inline review comments, ci-doctor sticky comment + Code Scanning). They don't conflict.
Honest comparison styled
Full table at /compare/ci-doctor-vs-actionlint.html. Other comparisons in the family:
- vs zizmor (security-focused analyzer)
- vs super-linter
- vs mega-linter
- vs octoscan
Why I bother writing these
Because every "X vs Y" comparison written by one of the maintainers is suspicious by default, and I'd rather you have the honest version than discover the trade-offs after committing one to your CI pipeline. If anything here is wrong or outdated, open an issue and I'll fix it.
We do not pay for placement and we do not accept paid placement.
Top comments (0)