Repository navigation
Walkthrough Multiple Projects
This page walks one fleet that serves two projects. Project A and project B share a Mac and a VPS. A second VPS belongs to project A only. Every project keeps its own queue share, cache and statistics.
Names used below: mac1 has Xcode, vps-shared serves both projects, vps-a serves project A only. ~/src/project-a and ~/src/project-b are the two checkouts. Commands that need real machines are shown as text, each with the test that runs it. The command and flag tables are in the generated Reference.
A node runs jobs only for the projects it is authorized for. Authorize by checkout directory or by repository id; a directory is turned into the same repository id that evidence uses.
nself ci nodes projects add mac1 ~/src/project-a ~/src/project-b
nself ci nodes projects add vps-shared ~/src/project-a ~/src/project-b
nself ci nodes projects list vps-shared
To take a project off a node, remove it. --all removes every project from that node.
nself ci nodes projects remove vps-shared <repo-id>
Authorize the dedicated VPS for project A only. Project B's jobs never land there, even when it is idle.
nself ci nodes projects add vps-a ~/src/project-a
nself ci nodes projects list vps-a
A personal node is never chosen for a private repository it is not authorized for. Adding the project makes it eligible.
Labels describe a node; a project can require extra labels for all its jobs. Give vps-a a label, then require that label at project scope for project A. Project A's jobs then need it on top of their own requires.labels.
nself ci nodes label mac1 xcode
nself ci nodes label vps-a project=a
nself ci policy set --scope project sched.overrides.labels '["project=a"]'
Run the policy set line inside project A's checkout. After it, all of A's jobs go to vps-a. A job of A that also needs xcode waits: mac1 has Xcode but not project=a, and vps-a has the reverse. explain names the override as the reason.
nself ci explain
How overrides combine with job requirements is in Scheduling and Cost.
When the fleet is busy, the scheduler shares capacity between projects and never admits more than the fleet can hold. Interactive runs start before queued background work. runs queue shows each waiting run with its position, its band and the expected wait.
nself ci runs queue
The fairness rules and presets are in Scheduling and Cost.
Each cache entry lives in a namespace made of the project, the trust class of the source and whether the ref is protected. The same key in another project's namespace neither blocks nor reveals the entry. Artifacts are stored per run, and runs belong to one project. Nothing needs to be set up for this. See namespaces.
runs stats summarises runs, queue time and failures. --project limits it to one project; --since sets the window. A caller of a team coordinator sees only the projects it has a role on.
nself ci runs stats --since 168h --project <owner/repo> --json
The fields are described in CI health.
| Step | Test |
|---|---|
| Authorize, list and remove projects on a node; per-project VPS; label override | TestSeveralProjects |
| A personal node needs authorization for a private repo | TestPersonalNodePrivateRepoOptIn |
| Every alternative explained | TestScenario6ExplainListsEveryAlternative |
| Fair share under saturation | TestScenario10SaturationStaysWithinCapacityAndFair |
| Interactive before background | TestScenario10InteractiveStartsBeforeQueuedBackground |
| Queue position, band and wait | TestRunsQueueListsPositionBandAndWait |
| Cache namespaces do not leak | TestSameKeyStringInAnotherNamespaceNeitherBlocksNorRevealsTheTrustedEntry |
| Stats window and project filter | TestStatsReadWindowAndProject |
| Stats scoped to the caller's projects | TestStatsScopedCallerSeesOnlyAllowedProjects |
- Commands
- File Processing Commands
- GitHub Commands
- ID.me Commands
- Jobs Commands
- Notifications Commands
- Realtime Commands
- Shopify Commands
- Stripe Commands
View All: Home (or see the full alphabetical list below, synced with registry.json)
- Access-Controls
- Admin-Api
- AI-CLI
- AI-Studio
- Alerts
- Analytics
- API
- Audit
- Audit-Analytics
- Audit-Log
- Auth-Enterprise
- Backup
- BYOK
- CDC
- CDN
- CI
- Claw-CLI
- Cloudflare
- Compliance
- Content-Acquisition
- Content-Progress
- Content-Safety
- Costs
- CRDT
- Cron
- DDNS
- Devices
- DLQ
- Documents
- Dogfood
- Donorbox
- DR
- E2EE
- Encryption
- Entitlements
- Event-Bus
- Family-Ancestry
- Family-FamilySearch
- Family-GEDCOM
- Family-MyHeritage
- Family-WikiTree
- Feature-Flags
- Federation
- File-Processing
- Flags
- Forgejo
- Functions-V8
- Game-Metadata
- Gateway
- Gauth
- GDPR
- Geocoding
- GitHub
- GitHub-Runner
- HIPAA
- Home
- IDme
- Infra
- Invitations
- Job-Queue
- Jobs
- K8s
- Link-Preview
- Maintenance
- MDNS
- Media-Processing
- Meetings
- MLflow
- Model
- Monitor
- Monitoring
- Notifications
- Notify
- nSelf-Cloud
- nSelf-Eval-Gate
- nSelf-Geo
- nSelf-Image
- nSelf-PDF
- nSelf-Scan
- nSelf-Sync
- nSelf-Vault
- Object-Storage
- Observability
- Ollama
- Payments
- PayPal
- Pentest
- Pentest-Kit
- Plugin-ClawDE
- Plugin-Gauth
- Plugin-LLM-Gateway
- Plugin-PTY
- Plugin-Retrieval
- Podcast
- Post
- Push
- Queue
- Region
- Release
- Retro-Gaming
- Rom-Discovery
- Search
- Sentry-CLI
- Shared-Utils
- Shopify
- SIEM
- SMS
- Soak
- Sports
- Storage
- Stripe
- Subtitle-Manager
- Tenant
- Tenant-Controller
- TMDB
- Tokens
- Torrent-Manager
- Traefik
- VPN
- WAF
- Watchdog
- Web3
- Webhooks
- Workflows
- Getting started with nself ci
- CI architecture
- CI configuration and policy
- Evidence and machine output
- Nodes and Runners
- CI trust, security and privacy
- CI scheduling and cost
- Hosted providers
- Cache and artifacts
- Walkthrough: a home lab
- Walkthrough: several projects on one fleet
- Walkthrough: a team
- Walkthrough: agents
- Migrating to the new CI engine
- CI troubleshooting
- CI reference
- CI agent reference
- Auto placement and pools
- Watch and services
- macOS node ownership checks
Related