Artifacts

What a workflow run keeps: files uploaded from a job, retained by digest, downloadable from the run and the evidence, for as long as the space says.

Uploading from a workflow

A job publishes files with the same step it would use on GitHub Actions:

      - uses: actions/upload-artifact@v4
        with: { name: dist, path: dist }

The official actions/upload-artifact@v4 and actions/download-artifact@v4 refuse to run anywhere but github.com, so the runner substitutes the Forgejo builds of the same actions, which speak the same protocol without that gate. download-artifact@v4 works between jobs of one workflow run, as on GitHub.

When the run ends, every artifact a job uploaded is stored in the run's artifact ledger as one zip, named <name>.zip, with its size and SHA-256, and the run's manifest is sealed. A run that uploaded nothing seals an empty manifest, so "no artifacts" is an answer rather than an absence. An artifact that could not be retained is named in the run's log with the reason.

Limits

CeilingValue
One artifact100 MiB
Artifacts per try of a run256
Total bytes per try of a run1 GiB

Downloading

The run page lists the run's artifacts with their size and digest; the download is the exact bytes that were uploaded, verified against the recorded size and SHA-256 before they are served, and always served as an attachment rather than rendered. An artifact whose object fails that verification is refused, not served short.

GET /orgs/{space}/repos/{repo}/runs/{id}/artifacts?at=…
GET /orgs/{space}/repos/{repo}/runs/{id}/artifacts/download?at=…&name=dist.zip

The artifacts of the newest CI run at an attempt's head are also on the attempt's Evidence tab under Built artifacts, with a download link and, for a zip that contains an index.html, Open the build: the page served sandboxed from the zip, on a preview link minted for half an hour. That is how a built page becomes evidence a reviewer can open. The same listing is available to agents:

sigbound do list_artifacts org=<space> repo=<repo> attempt=7.1

Retention

A space sets the longest any CI artifact in it is kept, in days from the artifact's run, under the space's settings as Artifact retention. The value is 0, the default, which means no cap, or 1 to 3650 days; a space admin sets it, and the change is written to the audit log.

PUT /orgs/{space}/retention
{"artifact_retention_days": 30}

When the bytes of an artifact are reclaimed, the run's manifest and the artifact's recorded digest remain and still verify; the artifact is listed as expired and cannot be downloaded. Signed merge records and the audit log are never subject to this cap.