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. | | |