Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

vole
Clone

Read only, no credentials:

https://rodent.software/git/vole.git

Write over SSH with a registered key:

git clone ssh://git@0.0.0.0:2222/vole.git

A free and open-source forge that lives in your Git repo.

Stream run logs over the runner's SSH channel

5ece70a50ebda392626b92bdf29d28bc9b444954 · Keenan Nemetz · 10d ago · parent fdf2340f

Stream run logs over the runner's SSH channel

The runner wrote the log to a temp file and uploaded it as one LFS object
when the job ended, so a running job had no log to read and a log was stored
like a shared artifact even though it belongs to one attempt.

The runner sends 128 KiB chunks over the same runner channel that holds the
lease. The server appends them to data/logs/<repo>/<run>/<attempt>.log and
records the size while the run is still running. The finish record carries
the final size; the server checks the file length, syncs it, and stores the
result. A partial or failed stream leaves no log on the record.

Logs are no longer LFS objects: they are not shared, not content-addressed,
and the web serves the file directly, with range and step slices. GC no
longer treats them as LFS roots.

docs/configuration.md +3−2

@@ -68,7 +68,7 @@ vole admin account list
68 68 | `repo_max_metadata_entries` | `2000` | Documents on the metadata branch in one repository: issues, requests, comments, approvals, and release records |
69 69 | `repo_max_metadata_bytes` | `33554432` (32 MiB) | Total size of those files |
70 70 | `repo_max_bytes` | `5368709120` (5 GiB) | Git objects in one repository; a repository already over it refuses further pushes |
71 | `repo_max_lfs_bytes` | `10737418240` (10 GiB) | LFS objects, CI logs and run artifacts in one repository, checked on upload |
71 | `repo_max_lfs_bytes` | `10737418240` (10 GiB) | LFS objects and run artifacts in one repository, checked on upload |
72 72 | `contributor_writes_per_hour` | `300` | Browser writes an untrusted (`contribute`) account may make in an hour: issues, comments, requests, labels, state changes. Maintainers and admins are trusted and are not budgeted |
73 73 | `git_http` | `true` | Serve anonymous clone, fetch and LFS downloads over smart HTTP; off leaves SSH as the only transport |
74 74 | `git_http_max_concurrent` | `16` | Simultaneous anonymous reads on that transport; past it a clone is refused with `503` and `Retry-After` |
@@ -320,7 +320,8 @@ connection intact.
320 320 | `data/repos/` | Your Git repositories. |
321 321 | `data/index.db` | A rebuildable search index. |
322 322 | `data/runs.db` | The CI queue, finished-run records and steps, artifact pointers, and contributor-branch CI approvals. It is a source of truth: back it up. Deleting it loses CI history and pending work. |
323 | `data/lfs/` | Stored large files, CI logs, and build artifacts. |
323 | `data/lfs/` | Stored large files and build artifacts. |
324 | `data/logs/` | One file per CI attempt, streamed from the runner while the job runs. |
324 325 | `data/audit.log` | A record of privileged actions: one tab-separated line per action, `timestamp`, `action`, `actor`, `subject`, `detail`. Created and kept at mode `0600`. See [Audit log](operations.md#audit-log). |
325 326 | `data/ssh_host_ed25519_key` | The SSH host key. It is the instance's long-term secret; browser credentials are public keys and session tokens are hashed. |
326 327 | `data/acme/` | The ACME account key and issued TLS certificates, when automatic HTTPS is enabled. |