Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
3b1a2fa
feat: add deployer host installer
Aug 8, 2026
66ae3b6
fix: address deployer safety review findings
Aug 9, 2026
dc0fb58
fix: harden deployer retained-state validation
Aug 9, 2026
6ff8022
fix: retain deployed safety evidence
Aug 9, 2026
d9493a8
fix: close deployer runtime recovery gaps
Aug 9, 2026
dd72947
test: normalize deployer drain marker mode
Aug 9, 2026
295ffa8
fix: serialize runtime policy and recovery state
Aug 9, 2026
342c8dc
fix: fail closed across deployer recovery paths
Aug 9, 2026
665a18d
fix: preserve validated deployer boundaries
Aug 9, 2026
2fb0823
fix: pin deployer transaction inputs atomically
Aug 9, 2026
ba12459
fix: close deployer recovery and audit review gaps
Aug 9, 2026
0271082
fix: harden deployer runtime and rollback recovery review gaps
Aug 9, 2026
a93dfc8
fix: close deployer isolation and rollback recovery review gaps
Aug 9, 2026
5ad3be8
fix: harden deployer transactions, credentials, and audit identity
Aug 9, 2026
fc3f4aa
fix: track deployed pointer and validate state across recovery paths
Aug 9, 2026
e6cb243
fix: validate deployer identity, isolation, and boundaries end to end
Aug 9, 2026
0040d3e
fix: preserve deployer recovery invariants across lifecycle paths
Aug 9, 2026
a616cc2
fix: close deployer publication, rollback, and uninstall safety gaps
Aug 10, 2026
f78b40b
test: make drifted-unit uninstall check shellcheck-clean
Aug 10, 2026
ce502c0
fix: revalidate trust boundaries before every deployer adapter call
Aug 10, 2026
10da688
fix: fail closed across deployer recovery, signals, and read-only checks
Aug 10, 2026
46ace94
fix: harden deployer publication, recovery manifests, and convergence
Aug 10, 2026
295352b
fix: close deployer recovery, snapshot, inhibition, and checkout race…
Aug 11, 2026
7cda395
fix: drop redundant checkout ownership probe rejected on CI checkouts
Aug 11, 2026
d4ee34b
fix: harden checkout pinning, promotion, and convergence validation
Aug 11, 2026
d301861
test: expect credential-reference failure before cross-validation ord…
Aug 11, 2026
5a2dc30
test: rotate credential fixture identity in deployed-pair drift regre…
Aug 11, 2026
f0767f6
test: match candidate-first credential failure on upgrade path
Aug 11, 2026
6b3a573
test: exercise deployed-pair credential drift through the policy refe…
Aug 11, 2026
c5221a8
test: clear recovered rollback state after credential drift regression
Aug 11, 2026
de41be5
test: substituted live checkout now fails closed at the hash pin
Aug 11, 2026
af9ae9d
test: clear drain fixture before final convergence check
Aug 11, 2026
6ec12f5
test: drop invalid trailing convergence check after approval rotation
Aug 11, 2026
78057d3
fix: close checkout baseline, pointer, audit, uninstall, and recovery…
Aug 11, 2026
ae8ed96
fix: stop timers before removing the activation pointer on uninstall
Aug 11, 2026
9d0a1b0
fix: validate systemd boundary and finalize dependencies before recov…
Aug 11, 2026
04f0f24
test: drifted adapter is caught at candidate validation before recovery
Aug 12, 2026
203fd0b
test: tolerate absent retained pair in drifted-finalize regression
Aug 12, 2026
e93c3cf
test: tolerate absent retained pair in deployed-pair drift regressions
Aug 12, 2026
f8ac2cd
test: order deployed-pair drift regressions before finalize recovery
Aug 12, 2026
2c670d6
test: rebuild retained rollback pair after finalize recovery fixture
Aug 12, 2026
8e62d88
fix: replace-immune checkout pins, marker type checks, idempotent uni…
Aug 12, 2026
61de653
fix: propagate tree-read failures, tolerate absent timers, fsync cons…
Aug 12, 2026
ed6008b
fix: writability guard before backups, durable commit marker, stale-m…
Aug 12, 2026
3f7dbf9
fix: recovery boundary guards, durable journals, honest availability
Aug 12, 2026
7240c04
test: install-root symlink is caught by the existing symlink guard
Aug 12, 2026
be89b1e
test: availability regression uses a drifted retained policy digest
Aug 12, 2026
2bbe10d
fix: hook-free checkout validation, backup guards, durable state tran…
Aug 12, 2026
254b1a1
test: rebuild retained rollback pair before digest/credential drift f…
Aug 12, 2026
e75bd12
test: align rollback fixtures with publish-over-unusable-incumbent se…
Aug 12, 2026
1fa1efe
fix: durable rollback publication, boundary-ordered recovery, exact c…
Aug 12, 2026
be14f40
test: round-ten regressions for durability, boundaries, and checkout …
Aug 12, 2026
d71aa7b
fix: durable journal retirement, boundary sync before finalize, hones…
Aug 13, 2026
dd97590
test: marker-committed rollback reports change; regression coverage
Aug 13, 2026
8e19efe
fix: durable restore retirement, failed-deploy audit, capability bind…
Aug 13, 2026
8b195ac
test: capability cross-installation rejection, reload-failure uninsta…
Aug 13, 2026
53ed42f
fix: recovery without deployed dependencies, durable uninstall, key p…
Aug 13, 2026
81f557d
test: uninstall without configuration directory removes the deploymen…
Aug 13, 2026
d60747d
fix: fail-closed durability for journals, drain markers, consumption,…
Aug 13, 2026
64accb0
fix: rollback core durable before commit marker, audit inode restore,…
Aug 13, 2026
cefee9a
test: audit-inode restore, drifted-timer uninstall stop, deployed-bou…
Aug 13, 2026
6effd4c
fix: production gate, drift-unit role rejection, snapshot and availab…
Aug 13, 2026
60409d9
test: round-fifteen regressions; state-snapshot helper for recovery f…
Aug 13, 2026
a29f746
fix: reject ordinary-CI timers, timer-aware uninstall no-op, document…
Aug 13, 2026
53b9a97
test: ordinary-CI drift timer rejection fixture
Aug 13, 2026
268f1e6
fix: fail-closed mixed-role helper in runtime, policy snapshot remove…
Aug 13, 2026
5da0d9c
fix: timer enablement scope, Docker pull-in for scheduled services, r…
Aug 13, 2026
dfc46a0
test: repair replaces a damaged active release from the validated che…
Aug 13, 2026
e86b746
fix: marker after boundary durability, active-marker sync, timer prob…
Aug 13, 2026
80a6040
fix: inhibited adapter call, durable marker clearing, honest uninstal…
Aug 13, 2026
a809bef
fix: last-known-good validation before deploy, production rollback ga…
Aug 13, 2026
a0f9bd3
test: marker-deleting adapter cannot replay; regressions pass
Aug 13, 2026
bbbee85
fix: full retained-pair validation before deploy, audit prefix integr…
Aug 13, 2026
426be7c
test: rollback baseline gate, consumption-marker replay guard, audit-…
Aug 13, 2026
f899dc1
fix: directory-level marker restore, full release validation, availab…
Aug 13, 2026
0d621c8
test: directory-level consumption restore, regressions for round twen…
Aug 13, 2026
1ad2dfa
fix: pointer restore ordering, full release predicate, audit prefix r…
Aug 13, 2026
0336c34
fix: retire incumbent snapshot only after the durable success audit
Aug 13, 2026
3d5012f
fix: post-publication pointer truth, success-path marker preservation…
Aug 13, 2026
b811d62
fix: incumbent-based retirement, controller-side deployer guard, boun…
Aug 13, 2026
1f18809
test: controller installer rejects a deployer host
Aug 13, 2026
b27134f
fix: controller rollback guard, incumbent content restore, audit orde…
Aug 13, 2026
2d81a2f
fix: shared role-admission lock, maintenance Docker sanitization, per…
Aug 13, 2026
3dad253
fix: incumbent metadata restore, audit metadata repair, retained-pair…
Aug 13, 2026
989a96d
fix: restore recovery metadata after adapter drift
Aug 14, 2026
0069b8f
test: separate recovery metadata fixture paths
Aug 15, 2026
b75c73a
fix: preserve deployer rollback across adapter updates
Aug 16, 2026
3c3cc53
fix: retain completed deployment rollback marker
Aug 16, 2026
927187c
fix: accept canonical Debian os-release symlink
Aug 17, 2026
a07990f
test: exercise os-release symlink during install
Aug 17, 2026
421d3d9
fix: validate completed deployment marker
Nickfost Aug 30, 2026
bc689be
fix: protect deployer operation lock
Nickfost Aug 30, 2026
024614b
fix: pin candidate policy through validation
Nickfost Aug 30, 2026
87a2d2e
fix: protect deployer recovery boundaries
Nickfost Aug 30, 2026
dc1dd37
fix: restore runtime state after adapter cleanup
Nickfost Aug 30, 2026
f363698
test: expect audit integrity failure precedence
Nickfost Aug 30, 2026
a4fd48c
fix: keep adapter recovery state in memory
Nickfost Aug 30, 2026
08e8904
fix: make deployment exit recovery nonfatal
Nickfost Aug 30, 2026
c4d0bfb
fix: recover adapter-corrupted deployer state
Nickfost Aug 30, 2026
a4104f9
fix: harden deployer recovery boundaries
Nickfost Aug 30, 2026
48ddebe
fix: harden deployer adapter failure recovery
Nickfost Aug 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions deploy/deployer/ci-fleet-deployer-cleanup.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
[Unit]
Description=Run application-owned scoped deployer cleanup
After=docker.service
Comment thread
Nickfost marked this conversation as resolved.
Wants=docker.service

[Service]
Type=oneshot
User=root
ExecStart=/opt/ci-fleet-deployer/current/scripts/deployer-runtime.sh cleanup
Environment=CI_FLEET_DEPLOYER_CONFIG=/var/lib/ci-fleet-deployer/active-policy.conf
TimeoutStartSec=15min
UMask=0077
NoNewPrivileges=yes
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=strict
ReadOnlyPaths=/etc/ci-fleet-deployer /opt/ci-fleet-deployer
ReadWritePaths=/var/lib/ci-fleet-deployer /var/log/ci-fleet-deployer /run/docker.sock
RestrictSUIDSGID=yes
11 changes: 11 additions & 0 deletions deploy/deployer/ci-fleet-deployer-cleanup.timer
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[Unit]
Description=Run scoped ci-fleet deployer cleanup daily

[Timer]
OnCalendar=daily
RandomizedDelaySec=15min
Persistent=true
Unit=ci-fleet-deployer-cleanup.service

[Install]
WantedBy=timers.target
17 changes: 17 additions & 0 deletions deploy/deployer/ci-fleet-deployer-drain.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[Unit]
Description=Drain the ci-fleet deployer before maintenance

[Service]
Type=oneshot
User=root
ExecStart=/opt/ci-fleet-deployer/current/scripts/deployer-runtime.sh drain
Environment=CI_FLEET_DEPLOYER_CONFIG=/var/lib/ci-fleet-deployer/active-policy.conf
TimeoutStartSec=2min
UMask=0077
NoNewPrivileges=yes
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=strict
ReadOnlyPaths=/etc/ci-fleet-deployer /opt/ci-fleet-deployer
ReadWritePaths=/var/lib/ci-fleet-deployer /var/log/ci-fleet-deployer
RestrictSUIDSGID=yes
19 changes: 19 additions & 0 deletions deploy/deployer/ci-fleet-deployer-health.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
[Unit]
Description=Check ci-fleet deployer health
After=docker.service
Wants=docker.service

[Service]
Type=oneshot
User=root
ExecStart=/opt/ci-fleet-deployer/current/scripts/deployer-runtime.sh health
Environment=CI_FLEET_DEPLOYER_CONFIG=/var/lib/ci-fleet-deployer/active-policy.conf
TimeoutStartSec=2min
UMask=0077
NoNewPrivileges=yes
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=strict
ReadOnlyPaths=/etc/ci-fleet-deployer /opt/ci-fleet-deployer
ReadWritePaths=/var/lib/ci-fleet-deployer /var/log/ci-fleet-deployer /run/docker.sock
RestrictSUIDSGID=yes
12 changes: 12 additions & 0 deletions deploy/deployer/ci-fleet-deployer-health.timer
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[Unit]
Description=Check ci-fleet deployer health every five minutes

[Timer]
OnActiveSec=2min
OnUnitActiveSec=5min
RandomizedDelaySec=30s
Persistent=true
Unit=ci-fleet-deployer-health.service

[Install]
WantedBy=timers.target
25 changes: 25 additions & 0 deletions deploy/deployer/ci-fleet-deployer.service
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
[Unit]
Description=Run one approved ci-fleet deployment
After=docker.service network-online.target
Wants=docker.service network-online.target

Comment thread
Nickfost marked this conversation as resolved.
[Service]
Type=oneshot
User=root
Group=root
ExecStart=/opt/ci-fleet-deployer/current/scripts/deployer-runtime.sh deploy
Comment thread
Nickfost marked this conversation as resolved.
Environment=CI_FLEET_DEPLOYER_CONFIG=/var/lib/ci-fleet-deployer/active-policy.conf
Environment=CI_FLEET_DEPLOYER_REQUEST=/var/lib/ci-fleet-deployer/request.conf
TimeoutStartSec=45min
# A hung adapter must not hold the lock or inhibitor beyond the documented
# 45-minute deployment bound; stop quickly after TERM and let KILL follow.
TimeoutStopSec=30s
UMask=0077
NoNewPrivileges=yes
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=strict
ReadOnlyPaths=/etc/ci-fleet-deployer /opt/ci-fleet-deployer
ReadWritePaths=/var/lib/ci-fleet-deployer /var/log/ci-fleet-deployer /run/docker.sock
RestrictSUIDSGID=yes
LockPersonality=yes
329 changes: 329 additions & 0 deletions docs/DEPLOYER-HOST.md

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ New operator? Follow the [Quickstart](QUICKSTART.md): what ci-fleet does, instal
| Make a project compliant | [Project CI standard](PROJECT-STANDARD.md) and [compliance checklist](COMPLIANCE-CHECKLIST.md) |
| Split tests across parallel workers | [Project CI standard](PROJECT-STANDARD.md) and the [parallel workflow example](../examples/workflows/parallel-ci.yml.example) |
| Configure automatic updates and cleanup | [Host maintenance](HOST-MAINTENANCE.md) |
| Install or operate a dedicated deployment host | [Deployer host installation](DEPLOYER-HOST.md) |
| Monitor hosts and detect missed reports | [Fleet health monitoring](HEALTH-MONITORING.md) and [authenticated status reporting](STATUS-REPORTING.md) |
| Handle GitHub App, workflow, or deployment secrets | [Secrets model](SECRETS.md) and [security policy](../SECURITY.md) |
| Review accepted implementation scope | [Design decisions](DESIGN-DECISIONS.md) |
Expand All @@ -42,6 +43,7 @@ New operator? Follow the [Quickstart](QUICKSTART.md): what ci-fleet does, instal
| Test shard | One bounded slice of a larger test suite, designed to run independently and usually finish within five minutes. |
| Private delivery configuration | Repository allowlists, logical controllers, capacity budgets, environment policy, and required secret names kept in a private but secret-free repository. |
| Desired state | A reviewed schema-v3 declaration of runner pools and logical controllers stored in a private, secret-free Git repository. |
| Deployer host | A dedicated non-runner Linux host that applies exact-head approved immutable artifacts through application-owned deployment logic. |

## Design and boundaries

Expand Down Expand Up @@ -72,6 +74,7 @@ These pages are normative for compatible projects and hosts:
- [Run the live pilot](LIVE-PILOT.md)
- [Add a host](ADDING-A-HOST.md)
- [Install, adopt, check, upgrade, roll back, or remove a controller](DESIRED-STATE.md)
- [Install, check, repair, upgrade, drain, roll back, or remove a deployer](DEPLOYER-HOST.md)
- [Add a project](ADDING-A-PROJECT.md)
- [Deploy the current experimental prototype](DEPLOYMENT-PROTOTYPE.md)
- [Maintain, drain, clean, update, and reboot hosts](HOST-MAINTENANCE.md)
Expand Down
Loading
Loading