Node. A repository with OCX's hook installed, on the host that runs its
work, named by the repository's server-code. Its repository is made new or
cloned over HTTP: a copy, or a clone made from a file, keeps the original's
server-code, and two repositories that share one would both act on the same
runs. A node writes its reports as its node user, a Fossil user of its own, and
OCX's status lists the runners and limits it offers.
A node learns of an artifact only when the artifact reaches its repository.
On the repository's server, that is as soon as it arrives. A node on any other
host, such as a build host with its own clone, learns of a run only when it
syncs its clone; how often it syncs is its own choice. Its reports reach the
server the next time it syncs. Fossil tells the node of each
arrival through its after-receive hook, run from Fossil's backoffice. A write
made on the repository itself starts no backoffice, so OCX's tools run it after
writing. So a run written with OCX's run tool on the node is acted on at once. The hook is only a signal: the repository
is the truth. When a node starts, and whenever it may have missed a signal, it
reads its repository for runs that name it and have no ended, answers lost
for each whose program is not running, and starts any that never started.
Tools. OCX's tools write these artifacts, and perform runs by hand, for
people and programs, as a convenience, never a requirement: the artifacts are
the standard. Anyone may
write the same artifacts by other means, such as a verdict with
fossil tag add or a run as a forum post, and they count exactly the same.
The tools:
createwrites arun: in a new thread, in reply to a post (to), or on a ticket (ticket).runperforms a run by hand, on the node, from its definition: the same checkout, sandbox and limits the node would give it. From the command line it runs in your shell, its program's terminal yours until it ends, or until you leave a session. From the web page it starts detached, forattachto join. It has two uses:- starting a run whose
manualis true, which the node does not start itself: only a user holding admin or setup may, and the node reports it as usual,startedand thenended; - a trial,
run --trial: it performs any run's definition, or one not yet sent, and writes nothing to Fossil, nostartedand noended; it prints the outcome instead.
- starting a run whose
attachjoins a running session's terminal from a shell at the node, and leaves it running when you go; each attachment leaves a post in the run's thread.stopwrites astopfor a run.postwrites a plain post in reply to a post.auditwrites a verdict.pushcopies a run's check-ins from its clone to the node's repository, for a run whose limits ask forno_password.statuswrites nothing: it says who and where you are, and what this node offers.
The command line and the web page offer every tool but attach, which needs a
shell; programs reach the tools through MCP or the command line. Each tool
checks its input before anything happens, and naming a field it does not know
is refused. Every tool takes dry_run,
which checks everything and writes nothing, and every tool answers in one
shape: {"tool", "dry_run", "log", "result", "stopped"}. result is the hash
of what it wrote, and stopped says why it did not, naming the field at fault.
Versions. Every OCX message carries "ocx": 1. Version 1 may gain new keys
and stay version 1, and a key never changes its meaning or its name. An unknown
key in limits may be a limit the node cannot enforce, so the node answers the
run ended, refused. An unknown key anywhere else is ignored: the message is
acted on as if the key were not there. A node also refuses a
run whose runner it does not offer, and ignores a message whose kind it does
not know. A change that breaks these rules makes version 2, and a version 1
node ignores version 2 messages.