Installing zCICD
zCICD is itself an Odoo project, run with zodoo. Installing it means standing up that Odoo instance and pointing it at a Postgres server and a Docker host.
This page covers the zCICD application. For connecting a project repository to a running zCICD, see Repositories.
What it depends on
- zodoo — the Docker framework zCICD runs on and uses to drive instances
- Gimera — assembles the addon tree from
gimera.yml - Docker on every machine that will host instances
- PostgreSQL — a server for zCICD's own database, separate from the per-instance databases
The cicd wrapper
The repository ships a ./cicd script at its root. It is a thin wrapper around
the odoo CLI that pins zCICD's own settings and compose file:
odoo -xs ~/.cicd/settings -xd ~/.cicd/docker-compose.yml "$@"
It prefers ~/.local/sudobin/odoo, then ~/.local/bin/odoo, then whatever
odoo is on the PATH. Use ./cicd for every command against the zCICD instance
itself, so you never operate on the wrong project by accident.
Settings
zCICD reads its settings from ~/.cicd/settings. A recommended starting point:
HUB_URL=.....
DOCKER_IMAGE_TAG=cicd
PROJECT_NAME=cicd
DBNAME=cicdadmin
RUN_PROXY_PUBLISHED=0
ODOO_QUEUEJOBS_CHANNELS=testruns:5,others:10
RUN_ODOO_QUEUEJOBS=1
RUN_ODOO_CRONJOBS=1
RESTART_CONTAINERS=1
ODOO_MAX_CRON_THREADS=10
CICD_NETWORK_NAME=cicd_net
CICD_BINDING=0.0.0.0:80
CICD_DB_HOST=172.16.130.156
CICD_DB_USER=cicd
CICD_DB_PASSWORD=cicd_is_cool
CICD_DB_PORT=5454
CICD_POSTGRES_VERSION=14.0
Adjust the database host, port and credentials to your environment — the values above are examples, not defaults to keep.
Settings worth understanding
| Setting | Why it matters |
|---|---|
ODOO_QUEUEJOBS_CHANNELS | Splits test runs from other work, so a long test run cannot starve builds and restores. testruns:5,others:10 |
RUN_ODOO_QUEUEJOBS | Must be on — nearly all zCICD work is queue jobs |
RUN_ODOO_CRONJOBS | Must be on — fetching, cycle-down, cleanup and release heartbeats are cron |
ODOO_MAX_CRON_THREADS | zCICD schedules a lot; the default Odoo value is too low |
RESTART_CONTAINERS | Keeps zCICD up across reboots |
CICD_BINDING | Where the web UI listens |
RUN_PROXY_PUBLISHED | Leave off — instances are reached through the delegator, not a published proxy port |
Apple Silicon
On M-series Macs the Postgres image needs a wider pg_hba configuration:
./cicd pghba-conf-wide-open --no-scram
Large repository checkouts
Cloning large Odoo repositories over HTTP can fail mid-transfer with a sideband packet error. Raise git's buffer:
git config --global http.postBuffer 157286400
After it is running
Work through these in order:
- Configuration > Machines — add the Docker hosts. Set Type correctly;
Development-Machineis what enables automated cleanup and cycle-down, andProduction Systemis what protects a machine from it. - Configuration > Machines > Volumes — declare dumps, source and temp volumes on each machine.
- Configuration > Postgres Server — register the database servers instances will use. Set BTRFS/ZFS if the filesystem supports snapshots.
- Configuration > Registries — optional, but needed if production should pull prebuilt images rather than build from source.
- Configuration > Repositories — connect your first Git repository. See Repositories.
- Users — assign roles and add followers. See User Roles.
All of this is covered in Machines, Volumes and Registries.
Keeping it updated
Configuration > Update cicd updates the zCICD application itself. Configuration > Configuration Backup exports the configuration — worth running before an update or any significant infrastructure change.
Machines have an Upgrade framework flag controlling whether zCICD keeps zodoo up to date on them.
Verifying the install
- Configuration > CICD Container should show the Queuejobs and Cronjobs containers running.
- Logging > Live Logs should show activity.
- Adding a repository with Initialize new Branches enabled should produce branch records within one fetch cycle.
If branches appear but instances never build, that is nearly always a machine, volume or Docker problem rather than a repository one — see Troubleshooting and Logging.