Repository navigation
Releases
OwnCI v0.2.0
This release fixes commands and hints that sent you in circles, hardens how tokens and labels are handled, and adds progress output to setup.
Install
curl -fsSL https://sparshlabs.com/ownci/install.sh | shThe script checks the archive against SHA256SUMS and installs ownci into ~/.local/bin.
Set OWNCI_VERSION=v0.2.0 to pin this version. The archives carry GitHub build-provenance
attestations: gh attestation verify ownci_v0.2.0_linux_<arch>.tar.gz --repo ashfaqc137/ownci.
To upgrade, install the new binary, then run ownci stop and ownci start. The runner registration is kept.
Changed behaviour
startre-checks the repository's visibility when a GitHub token is available. It refuses to
run if the repository has become public since setup, unless setup was run with--allow-public-repo.status --remotewarns about it too.- Hosted-runner labels are refused by
setup --labels:ubuntu-*,windows-*andmacos-*.
Aruns-on: ubuntu-latestcan no longer reach your machine through a label you added. - An invalid
--repoor--nameexits with code 2 (a usage error) instead of 1.
setupalso rejects stray arguments. - The registration token is passed to the runner through its environment
(ACTIONS_RUNNER_INPUT_TOKEN), not its command line, where other users on the machine could read it.
GITHUB_TOKENandGH_TOKENare removed from the runner's environment.
Fixed
- Hints that failed: about ten error hints said
ownci setup --force, which always failed
with "--repo is required".setupnow uses the configured repository when--repois left out. setup --forcenow replaces an outdated runner. If the runner could not update itself
(version_deprecated), the advice to runsetup --forceused to loop forever. Now
setup --forcereplaces any runner older than the one OwnCI pins. If the download fails,
the registration is kept.startno longer kills unrelated processes. The cleanup of leftover runner processes
killed any process that had a runner file among its first two arguments, such as an
editor with.envopen. It now matches only runner binaries and runner scripts.- Ctrl-C during
start's preparation is a clean stop. stopwaits 75 s by default in container-runner mode.- GitHub's secondary rate limits are reported as rate limits.
Hardening
- The cleanup hook:
- records a failure when the work directory is not the one it expects;
- removes a symlinked
_tempor_PipelineMapping; - pulls its digest-pinned image if it is missing.
- Host mode:
- refuses a data directory containing
:or,; - setup lists the Docker socket among the isolation notes.
- refuses a data directory containing
Improved
-
setupshows progress. On a terminal:- a live line for the 217 MB runner download (percent, MB, speed);
- a spinner for extracting, registering, installing the isolation settings and pulling the image.
Piped output gets plain progress lines instead.
-
install.sh:
- prints how to add the install directory to
PATHfor good, not just for the current shell; - accepts
OWNCI_VERSION=latest.
- prints how to add the install directory to
-
Docs and website:
- The README,
docs/and the website now match the code. - New section: Let only maintainers decide where jobs run.
- Team labels are now
dev-<username>.
- The README,
OwnCI v0.1.1
A small fix release: ownci uninstall now cleans up after an install that was never set up.
Install
curl -fsSL https://sparshlabs.com/ownci/install.sh | shThe script checks the archive against SHA256SUMS and installs ownci into ~/.local/bin.
Set OWNCI_VERSION=v0.1.1 to pin this version. The archives carry GitHub build-provenance
attestations: gh attestation verify ownci_v0.1.1_linux_<arch>.tar.gz --repo ashfaqc137/ownci.
Fixed
ownci uninstall --purgewith no runner set up (installed, maybe randoctororstatus,
neversetup) printed "Nothing to uninstall" and kept the data directory. It now removes it,
with the same safety rules as before: only a directory with OwnCI's marker, only OwnCI's own
files, and anything else is kept and listed.- Leftover logs and state of a runner whose directory was deleted by hand no longer block the
purge. A runner that still holds its lock is left alone. status,logsandstopno longer create a missing data directory, soownci statusafter
a purge does not bring it back.- After a purge, the summary prints the command to remove the
owncibinary itself. OwnCI never
deletes its own binary.
To remove OwnCI completely: ownci uninstall --unregister --purge, then rm ~/.local/bin/ownci.
OwnCI v0.1.0
The first release of OwnCI: a small CLI that turns your Linux or WSL2 machine into a
GitHub Actions self-hosted runner for one repository, where every job runs inside a
Docker container. OwnCI does not implement CI itself. It downloads, verifies, registers,
supervises and cleans up the official actions/runner.
Install
curl -fsSL https://sparshlabs.com/ownci/install.sh | shThe script checks the archive against SHA256SUMS and installs ownci into ~/.local/bin.
Set OWNCI_VERSION=v0.1.0 to pin this version, or OWNCI_INSTALL_DIR to install elsewhere.
To install by hand, download ownci_v0.1.0_linux_<arch>.tar.gz and SHA256SUMS below, then:
sha256sum -c --ignore-missing SHA256SUMS
tar -xzf ownci_v0.1.0_linux_<arch>.tar.gz && install -m 0755 ownci ~/.local/bin/ownciThe archives carry GitHub build-provenance attestations:
gh attestation verify ownci_v0.1.0_linux_<arch>.tar.gz --repo ashfaqc137/ownci.
Then run ownci doctor and ownci setup --repo owner/name. The
README has the full guide.
What's in it
setup,start,stop,status,logs,doctor,uninstallandversion.- Host mode (the default): the runner runs on your machine. Jobs must declare
container:, and jobs without one are rejected. - Container-runner mode (
setup --mode container-runner): the runner itself runs in a
digest-pinnedghcr.io/actions/actions-runnercontainer, recreated for every job, so
unchanged workflows withoutcontainer:work too. - The pinned runner (2.338.0) is checksum-verified before extraction.
- After every job a hook wipes the workspace,
_actionsand_toolin a throwaway,
network-less container. - Public repositories are refused unless you pass
--allow-public-repo. - Your GitHub token is never stored, and tokens are redacted from the logs.
- Several repositories can run side by side, one data directory per repository. Per-developer
labels let one workflow file serve a whole team.
Platforms
| Platform | Status |
|---|---|
| WSL2 + Docker Desktop, amd64 | Tested end to end against real GitHub (acceptance record) |
| Native Linux (Docker Engine), amd64 | Shipped, expected to work, not tested yet |
| Linux / WSL2, arm64 | Shipped, expected to work, not tested yet |
| Windows | Use the Linux binary inside WSL2. Native Windows is not supported |
| macOS | Not supported yet |
Known limitations
- Trusted workflows only. The official runner mounts the Docker socket into job
containers, so a job can control your Docker daemon. The container is a guard against
accidents, not against hostile code. Read the README's
Security and trust model. - In container-runner mode, a job without
container:can read the runner's registration
credentials while it runs. - Container-runner mode relies on
run.sh --once, which the runner marks as deprecated. - Runner self-update inside the runner container has not been exercised yet, because no
newer runner release existed during testing. - After a supervisor is killed with
kill -9, the nextstartcan take about a minute to
reconnect while GitHub expires the old session.statusmay keep showing that conflict
as Last error after it recovers. - One job at a time per data directory. There is no systemd service or start on boot, and
OwnCI does not install Docker for you.