pi-dispatch v1.1.0
run.replicas now works on every forge, and egress from a job container is denied by default.
Replica runs on GitLab, Forgejo and Azure DevOps (#187)
"replicas": 2 on a label, comment or pull_request trigger races two independent sandboxes on one delivery, each on its own pi/issue-<n>-r<i> branch, each opening its own review request. It was GitHub only; it now works everywhere, with each forge's own nouns and CLI in the prompt (a merge request on GitLab, a work item on Azure).
Two limits worth knowing. It is webhook only on the three new forges, because the poller is GitHub only, so nothing fans out on a poll. And on GitLab, Forgejo and Azure the replicas hold the same operator supplied token rather than one scoped token each: only the GitHub App path mints per job. PI_CONCURRENCY still bounds how many run at once. See docs/replicas.md.
Egress is denied by default (#202) — BREAKING
A deployment that upgrades and does nothing has every job refused pre spend, at no budget or token cost, until it runs:
docker compose -f deploy/docker-compose.yml --profile egress up -d
The refusal names the proxy and that command, and PI_EGRESS=0 reverses it in one line. Jobs run on a per job --internal network whose only other member is an allowlist proxy.
Also in this release
- Bring your own secrets manager (#209, #216):
service render|install --env-setup <path>names a script the unit sources at every boot, anddoctornow checks it is still there, is not group or world writable, and is ignored by any git work tree it sits in. - The GitHub App key can be a value, not only a path (#208):
GITHUB_APP_PRIVATE_KEYaccepts the PEM inline. Setting both it and the path is a refusal rather than a precedence rule, and the key is never forwarded into a job container. *.pemis gitignored, and doctor warns when a key sits in a repo (#211).- A triggers file that does not parse is now a doctor failure (#187), naming the reason and the path. It used to be swallowed, which also disarmed the webhook secret, credential, image and flow checks, so doctor came back greener than a healthy deployment.
- The receiver no longer restart loops on a config it cannot read (#187): a determinate refusal exits 2 and the unit stops, matching the worker.
- Documentation corrections on what a job container's credentials actually bound (#197, #198, #199, #200, #206).
Upgrading
npm i -g @edgehero/pi-dispatch @edgehero/pi-dispatch-receiver
pi install @edgehero/pi-dispatch-admin
Upgrade the admin extension together with the worker and receiver, not after. The console bundles the trigger validator at build time, so a 1.0.0 console refuses every trigger edit while a non GitHub replicas entry sits in the file, including the edit that would remove it.
If you deploy the receiver as a service, re-run pi-dispatch service install --force to pick up the restart guards.