mrkeyoor.com_
Tue 01 Sept 17:41 UTC
Automationevaluationupdated 27 Aug 2026

checkout review

Actions Checkout is the official GitHub Action that places repository files in a workflow's workspace so later steps can build, test, or publish them. It handles authentication, shallow history, sparse checkout, submodules, Git LFS, and repositories other than the one that triggered the run.

+164 / 4dstars / 7d
Verdict

Our actions/checkout run passed all 128 tests in 10 seconds, but npm audit still found 4 vulnerabilities, including 2 high-severity findings. Use v7 for normal GitHub Actions jobs, especially privileged pull-request workflows, and pin the exact commit when supply-chain policy demands it. Budget extra care for old self-hosted runners, secondary private repositories, and any job that needs more than the default single commit.

We ran it

Lab card: what happened when we ran checkoutScreenshot of checkout (github.com/features/actions)
Install✓ · 13s530 packages · 167 MB
Build✓ · 12s
Tests✓ · 10s128 passed · 0 failed of 128 (jest)
Known vulns40 critical · 2 high · 1 moderate · 1 low (npm audit)
Repo98 files~7,586 lines of source · 0.6 MB · 7 CI workflows

Answers from our run

Does checkout build from source?

Dependencies installed in 13 seconds (530 packages), and the build succeeded in 12 seconds. We cloned commit f548e57 into a clean Debian container with 3 CPUs and no project-specific setup.

Do checkout's tests pass?

Yes: 128 of 128 passed when we ran the project's own test command (jest). Some failures need services or credentials a bare container does not have.

Does checkout have known vulnerabilities in its dependencies?

npm audit flagged 4 known advisories in the dependency tree at the time of our run.

Who should not use checkout?

Workflows pinned to old self-hosted runners: v7 uses Node 24 and requires Actions Runner v2.327.1 or newer.

What are the alternatives to checkout?

Git, GitHub CLI, Sparse Checkout. Our actions/checkout run passed all 128 tests in 10 seconds, but npm audit still found 4 vulnerabilities, including 2 high-severity findings.

Setup5/5One workflow line for common jobs; 128 tests passed locally
Docs5/5Inputs, permissions, auth, and common checkout patterns are explicit
Community4/58,666 stars and active reports, though contributions are paused
Maturity5/5Official action at v7.0.1 with current runner security changes

Discussed on

  1. hnAirbnb will now tell you about any annoying checkout chores before you book58 points
  2. hnHey HN, checkout my little Free/Opensource StackOverFlow site5 points
  3. hnGoogle checkout just shutdown us down5 points
  4. hnCan't use 'tar -xzf' extract archive file3 points
  5. hnGitHub Actions Stopped Working3 points

Who it’s for

GitHub Actions users who need the triggering commit available to later workflow steps.
Teams checking out private secondary repositories with a narrowly scoped token.
Workflows that need sparse paths, submodules, LFS files, or full Git history.
Security-conscious maintainers who want v7's default refusal to fetch untrusted fork code in privileged event contexts.

Who it’s NOT for

Workflows pinned to old self-hosted runners: v7 uses Node 24 and requires Actions Runner v2.327.1 or newer.
Jobs that need tags or history but cannot review checkout inputs: the default fetch depth is 1 and tags are off.
Teams that require a dependency audit with no high findings: our npm audit reported 2 high, 1 moderate, and 1 low vulnerability.
Contributors hoping to land ordinary features: the README says GitHub is not accepting contributions and will focus on security fixes and major breakage.
Self-hosted v6 users with symlinked work directories who cannot upgrade or patch: issue 2393 reports persisted credentials failing because Git resolves the real path.

Setup reality

Our sandbox installed 530 npm packages in 13 seconds and used 167 MB. The build passed in 12 seconds, then all 128 Jest tests passed in 10 seconds. Npm audit reported 4 known vulnerabilities: 2 high, 1 moderate, 1 low, and 0 critical.

Using the action on GitHub needs no separate install. Private secondary repositories may need a personal access token because the built-in token is scoped to the current repository. SSH checkouts need a key and known-host settings.

Version 7 runs on Node 24 and needs Actions Runner v2.327.1 or newer. Only 1 commit is fetched by default, persisted credentials default to on, and Git older than 2.18 triggers a REST download fallback with different capabilities.

Version 7 blocks unsafe fork checkout by default

Actions Checkout solves the first mundane requirement in most GitHub workflows: put the right repository state under GITHUB_WORKSPACE. Version 7 adds an important refusal. A workflow triggered by pull_request_target or workflow_run will not fetch fork pull-request code unless allow-unsafe-pr-checkout is explicitly set. Those events can carry the base repository's token, secrets, cache scope, and runner access, so the safer default prevents a common route from untrusted code to trusted credentials.

For ordinary push and pull_request jobs, the interface stays familiar. uses: actions/checkout@v7 fetches the triggering ref and persists the workflow token so later Git commands can authenticate. That convenience deserves a conscious decision: set persist-credentials: false when later steps should have no push-capable credential. For another private repository, the built-in token usually lacks access, and the README tells users to provide a least-privilege personal access token instead.

The default checkout contains only 1 commit

A plain checkout fetches one commit and does not fetch tags. This is fast and sufficient for compilers or unit tests that only need the current tree. It is wrong for version calculation, changelog generation, merge-base analysis, or a script that compares earlier tags. Set fetch-depth: 0 for all branches and tags, or choose a small positive depth when the job has a known lookback. The default is a product decision, not a transparent copy of a normal long-lived clone.

The action also handles sparse checkout, partial-clone filters, submodules, and Git LFS. Multiple repositories can sit beside each other or be nested under the main checkout. If Git 2.18 or newer is missing, checkout falls back to GitHub's REST API for files. That fallback cannot preserve every Git operation. Teams running old or stripped-down images should test the exact inputs they use rather than assuming the downloaded tree behaves like a repository cloned by Git.

What happened when we ran it

Our sandbox installed 530 npm packages in 13 seconds and used 167 MB on disk. The build completed in 12 seconds. Jest then passed all 128 tests in 10 seconds with 0 failures. The repository scan counted 98 files, about 7,586 lines of source, and 7 CI workflow files. It found no Dockerfile and no top-level tests directory, though the configured test command clearly discovered and ran the suite.

Npm audit reported 4 known vulnerabilities: 0 critical, 2 high, 1 moderate, and 1 low. The test result shows the checked-out code behaved as its suite expected; it does not cancel dependency advisories. For a component that executes inside CI and handles credentials, those findings deserve review before an organization blesses a pinned revision. Our measurements apply to commit f548e57 in the stated Node 22 sandbox, while the hosted action itself declares its bundled Node runtime through action metadata.

Node 24 sets a floor for self-hosted runners

Checkout v7 moved to Node 24 and requires Actions Runner v2.327.1 or later. Hosted GitHub runners absorb that compatibility work. Self-hosted fleets do not, so the upgrade belongs in the rollout checklist before changing the workflow reference. The README also notes that v6's separate credential file needs Runner v2.329.0 or later when authenticated Git commands run from a Docker container action. Major tags may look interchangeable in YAML while requiring different runner plumbing.

Issue 2393 gives one concrete self-hosted edge case for v6. A macOS runner used a symlinked _work directory, but Git evaluated the persisted credential include against the resolved path. The paths did not match, so authenticated fetch failed. The report does not establish the same fault in v7. It does show why runner filesystem layout, Git path resolution, and credential storage matter when a job moves away from GitHub's standard images.

GitHub accepts bug reports but not ordinary contributions

GitHub recorded the last repository push on August 10, 2026. Release v7.0.1 was published July 20 with pull-request safety changes, branch whitespace handling, escaped unset values, and dependency updates. The repository had 8,666 stars and 686 open issues and pull requests when fetched. That combined count is noisy for a widely used official action, but current issue updates show that users are still reporting runner and network behavior.

The maintenance model is unusually explicit. The README says the team is not taking contributions, while security updates and fixes for major breaking changes will continue. Questions and high-priority reports are directed to GitHub Community or Support. That is acceptable for a vendor-owned building block, though it removes the normal open-source expectation that a good external patch can merge. Choose it for supported GitHub integration, not for a community-governed checkout engine.

Pinning the commit is the stricter supply-chain choice

A major reference such as actions/checkout@v7 is readable and receives compatible updates, but the tag can point to newer code later. An exact commit SHA makes the executed source reviewable and repeatable. Teams can use an update bot to propose SHA changes while keeping the major version in a comment for humans. Issue 2316 asks the project to use GitHub's immutable release feature, which shows that release-reference integrity remains an active concern.

Actions Checkout is still the sensible default because it understands GitHub's token, events, workspace, and cleanup lifecycle. The 128 passing tests make its checked-out commit easy to trust functionally, while the 4 audit findings prevent a blank security endorsement. Use v7, request only contents: read unless the job must write, fetch the history the job truly needs, and treat credentials as an input you own rather than invisible workflow plumbing.

Alternatives

ProjectWhat it isPick it when
GitThe underlying version-control client, usable directly from a workflow shell step.pick this instead when you need exact clone, fetch, credential, and cleanup behavior and will maintain the script yourself.
GitHub CLI gh↗GitHub's command-line client can clone repositories and perform authenticated API work.pick this instead when checkout is one part of a larger GitHub API script and the runner already has `gh` authentication.
Sparse CheckoutA narrower action dedicated to sparse-checking paths from a repository.pick this instead when sparse path selection is the whole job and you prefer a smaller purpose-built interface.

What people are saying

  1. [github-trending] actions/checkout

Sources

  1. Actions Checkout repository and README
  2. Actions Checkout v7.0.1 release
  3. Issue 2393: symlinked runner credential path
  4. Issue 2316: immutable releases request

More automation reviews

rclone · lego · OpenCLI · web-access · Karabiner-Elements · WiiUDownloader · the whole board →