mrkeyoor.com_
Sat 05 Sept 15:49 UTC
Automationevaluationupdated 05 Sept 2026

upload-artifact review

GitHub's upload-artifact action moves files from a workflow run into GitHub's artifact storage, where later jobs or signed-in users can retrieve them. It handles files, directories, wildcard paths, retention, compression, overwrite behavior, and a direct single-file mode without asking you to run a storage service.

Verdict

Our upload-artifact run installed 699 packages, built in 14 seconds, and passed all 31 tests, but npm audit still reported 14 known vulnerabilities. Use v7 for routine file handoff inside GitHub-hosted Actions when short-lived, immutable artifacts match the workflow. Pick a release action for public distribution, and stay on the documented v3.2.2 path if GHES is a hard requirement.

We ran it

Lab card: what happened when we ran upload-artifactScreenshot of upload-artifact (github.com/actions/upload-artifact)
Install✓ · 29s699 packages · 316 MB
Build✓ · 14s
Tests✓ · 17s31 passed · 0 failed of 31 (jest)
Known vulns143 critical · 9 high · 1 moderate · 1 low (npm audit)
Repo54 files~1,653 lines of source · 0.5 MB · 7 CI workflows · tests dir

Answers from our run

Does upload-artifact build from source?

Dependencies installed in 29 seconds (699 packages), and the build succeeded in 14 seconds. We cloned commit 043fb46 into a clean Debian container with 3 CPUs and no project-specific setup.

Do upload-artifact's tests pass?

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

Does upload-artifact have known vulnerabilities in its dependencies?

npm audit flagged 14 known advisories in the dependency tree, including 3 critical at the time of our run.

Who should not use upload-artifact?

GitHub Enterprise Server users who want the current action: the README says v4 and later are unsupported on GHES and directs them to v3.2.2 variants.

What are the alternatives to upload-artifact?

Upload Pages Artifact, Action GH Release, Cache. Our upload-artifact run installed 699 packages, built in 14 seconds, and passed all 31 tests, but npm audit still reported 14 known vulnerabilities.

Setup5/5One workflow step; local development needs Node 24 and 699 packages
Docs5/5Inputs, examples, limits, GHES, and permission loss are explicit
Community3/5Active issue traffic, but outside contributions are paused
Maturity4/5All 31 tests passed; npm audit still found 14 advisories

Who it’s for

GitHub Actions users who need to pass build output, logs, or test reports between jobs.
Release teams that want short-lived workflow artifacts with configurable retention.
Matrix-build authors who can give every job a unique artifact name.
Maintainers who want an artifact ID, signed-in download URL, and SHA-256 digest as step outputs.

Who it’s NOT for

GitHub Enterprise Server users who want the current action: the README says v4 and later are unsupported on GHES and directs them to v3.2.2 variants.
Workflows that append from several jobs into one named artifact: v4 and later make artifacts immutable, so duplicate names fail unless the workflow is redesigned.
Teams that must preserve Unix modes through a normal zipped upload: the README says directories become 755 and files become 644, with tar plus direct upload as the workaround.
Publishers who need anonymous, permanent downloads: artifact URLs require a signed-in user and stop working after expiry or deletion of the artifact, run, or repository.
Outside developers looking for a normal contribution path: GitHub says the repository is not accepting contributions, although bug reports remain open.

Setup reality

Our sandbox installed 699 npm packages in 29 seconds and used 316 MB. The build passed in 14 seconds, then all 31 Jest tests passed in 17 seconds. Npm audit reported 14 known vulnerabilities: 3 critical, 9 high, 1 moderate, and 1 low.

Using the action in a workflow mainly requires a path and a version pin. Local development is heavier: the measured commit declares Node 24 or newer, while the repository has 7 CI workflow files and no Dockerfile. GitHub supplies the artifact service inside Actions.

Platform rules cause most of the work. v4 and later do not support GHES, artifact names are immutable, hidden files are excluded by default, and zipped uploads replace permission modes. Direct upload accepts one file and ignores the configured artifact name.

v7 uploads workflow files and returns three useful identifiers

Upload-artifact v7 takes a file, directory, wildcard, or list of paths and stores the result with the workflow run. A successful step returns an artifact ID, a signed-in download URL, and a SHA-256 digest. Most teams will use the default zipped form. The newer archive: false option sends one file directly, which helps when an archive would only wrap an archive, although that mode ignores the configured artifact name and uses the filename.

The action has more policy controls than its short YAML example suggests. Retention accepts 1 through 90 days unless repository settings allow otherwise, compression ranges from 0 through 9, and one job can create up to 500 artifacts. Our 54-file checkout was only about 1,653 source lines, yet installation pulled 699 packages and occupied 316 MB. The workflow surface is small; the development dependency tree is much larger.

What happened when we ran it

Our sandbox installed upload-artifact in 29 seconds, adding 699 npm packages and consuming 316 MB on disk. The TypeScript build passed in 14 seconds. Jest then finished in 17 seconds with 31 passed and 0 failed out of 31. We ran commit 043fb46 in an unprivileged Debian container with 3 CPUs, 8 GB of RAM, Node 22 as the base image, and no secrets.

Npm audit found 14 known vulnerabilities in that installed tree: 3 critical, 9 high, 1 moderate, and 1 low. The measurement block does not identify which runtime paths reach those packages, so we cannot turn the severity totals into an exploit claim. The repository also had 7 CI workflow files, a tests directory, and no Dockerfile. Our run proves that its provided build and test commands worked in this container; it does not measure upload speed or GitHub service reliability.

GitHub-hosted Actions gets v7, while GHES remains on v3.2.2

The current README draws a hard platform line. Upload-artifact v4 and later do not support GitHub Enterprise Server. GHES users are directed to v3.2.2 for Node 24 or v3.2.2-node20 for Node 20, while the examples for GitHub-hosted Actions use v7. This is a purchasing constraint, not a small setup wrinkle: a company running GHES cannot copy the current examples and expect the current action generation to work.

On GitHub-hosted Actions, the basic configuration is pleasantly short: pin the action, provide path, and optionally set a name. The same 29-second lab install that pulled 699 packages matters to contributors, but normal workflow consumers run GitHub's bundled action rather than installing the repository themselves. There is no Dockerfile to operate and no separate storage server to provision. The artifact still lives under GitHub's workflow run, so availability follows the run, repository, and retention settings.

Immutable artifact names prevent merging across matrix jobs

Since v4, an artifact cannot be changed after creation. Two jobs using the same name do not merge their files, and the later upload fails. Matrix workflows need a distinct suffix such as the operating system and matrix version. The overwrite input deletes an existing artifact before creating another one, which produces a new artifact ID. Any downstream step that stored the previous ID must be designed for that replacement.

File fidelity needs its own decision. With zipped upload, directories are restored as mode 755 and files as 644, so executable bits are not preserved. The README recommends creating a tar file and sending that single file with archive: false when modes and case sensitivity matter. That workaround should be tested in the actual consumer job. Our 31 passing tests confirm the repository suite at commit 043fb46, not every permission-sensitive archive produced on every runner.

Hidden files stay excluded unless the workflow opts in

Hidden files and files inside dot-directories are skipped by default. Setting include-hidden-files: true includes them, and path exclusions can then remove secrets such as an environment file. Open issue 614 argues that an explicitly named dotfile should upload without enabling all hidden files; it was updated on August 27, 2026. Until that behavior changes, a workflow should inspect the resolved file set instead of assuming an explicit dotfile path overrides the safety default.

The repository is maintained differently from a typical community project. GitHub recorded 262 combined issues and pull requests, a last push on April 14, 2026, and release v7.0.1 on April 10. Issue activity continued into September 2026, but the README says outside contributions are currently paused. Bug reports remain welcome; high-priority problems are routed to GitHub Community Discussions or support, while security updates and major breakage remain in scope. The 7 CI workflows show active project checks, not an open contribution promise.

Signed-in, expiring downloads make this a CI handoff tool

The artifact URL only works for signed-in users, and it remains valid only while the artifact, workflow run, and repository exist and the retention window has not ended. That is a sound fit for test reports, compiled binaries passed to another job, and logs attached to an internal run. It is a poor match for a public download page. A GitHub Release action puts distributable files in a place intended for users rather than tying them to a workflow's 1-to-90-day artifact policy.

The final choice is unusually clear. Our run built in 14 seconds and passed all 31 tests, so the checked-out action code cleared its basic engineering checks. The 14 audit advisories deserve review before local development or redistribution, and the platform caveats should be designed into the workflow from day one. Use upload-artifact v7 for temporary output inside GitHub-hosted Actions. Use Cache for reusable inputs, Upload Pages Artifact for Pages, or a release action for durable public files.

Alternatives

ProjectWhat it isPick it when
Upload Pages ArtifactGitHub's purpose-built packaging action for a Pages deployment artifact.pick this instead when the output is specifically a GitHub Pages site and should match the Pages deployment contract.
Action GH ReleaseA GitHub Action that creates releases and attaches files as release assets.pick this instead when files are public release downloads rather than temporary workflow output.
CacheGitHub's action for restoring reusable dependency and build caches across runs.pick this instead when the files exist to speed later jobs or runs, not as output for people to download.

What people are saying

  1. [github-trending] actions/upload-artifact

Sources

  1. actions/upload-artifact repository
  2. upload-artifact README
  3. upload-artifact v7.0.1 release
  4. Hidden files behavior issue 614

More automation reviews

agent-teams-ai · OfficeCLI · conductor · hey-cli · crossplane · espanso · the whole board →