# CI: artifacts `actions/upload-artifact` and `actions/download-artifact` v4 and later work. ermite stores the artifacts; the runner serves them to the jobs. ```sh ermite run artifacts ermite run download [--name N]… [--dir D] ``` The run page lists them with download links. ## Rules - A job sees only the artifacts of its own run. A re-run that uploads again replaces the earlier one. - Never served anonymously, even for a public repository: `repo:read` to list and download, `ci:write` to delete. - Contents use the shared [blob store](storage.md): `$ERMITE_DATA_DIR/blobs/objects/ci/` by default, or the configured S3 bucket/prefix. Metadata stays in kv. Removed when they expire, or with their run or repository. - Legacy artifacts under `$ERMITE_DATA_DIR/ci/artifacts` remain readable until expiry, with no copy or migration. Keep that tree until its last artifact expires. Changing backends does not move blob-backed artifacts; keep the backend stable while they are live. - An upload not finished when its job ends is dropped. ## Limits | Setting | Default | |---|---| | `ERMITE_CI_ARTIFACT_MAX` (one artifact) | `5GiB` | | `ERMITE_CI_ARTIFACT_QUOTA` (per repository) | `10GiB` | | `ERMITE_CI_ARTIFACT_RETENTION` (max `retention-days`) | `90d` | Also: 32 unfinished uploads per job, 1000 artifacts per run. `ERMITE_CI_ARTIFACTS=0` turns artifacts off. ## Not supported - Artifacts v3 (`@actions/artifact` v1). - The REST endpoints `/actions/runs/{id}/artifacts` and `/actions/artifacts/{id}/zip`: `download-artifact` with `run-id` and `github-token` gets a 404.