Skip to main content

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

SettingWhy it matters
ODOO_QUEUEJOBS_CHANNELSSplits test runs from other work, so a long test run cannot starve builds and restores. testruns:5,others:10
RUN_ODOO_QUEUEJOBSMust be on — nearly all zCICD work is queue jobs
RUN_ODOO_CRONJOBSMust be on — fetching, cycle-down, cleanup and release heartbeats are cron
ODOO_MAX_CRON_THREADSzCICD schedules a lot; the default Odoo value is too low
RESTART_CONTAINERSKeeps zCICD up across reboots
CICD_BINDINGWhere the web UI listens
RUN_PROXY_PUBLISHEDLeave 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:

  1. Configuration > Machines — add the Docker hosts. Set Type correctly; Development-Machine is what enables automated cleanup and cycle-down, and Production System is what protects a machine from it.
  2. Configuration > Machines > Volumes — declare dumps, source and temp volumes on each machine.
  3. Configuration > Postgres Server — register the database servers instances will use. Set BTRFS/ZFS if the filesystem supports snapshots.
  4. Configuration > Registries — optional, but needed if production should pull prebuilt images rather than build from source.
  5. Configuration > Repositories — connect your first Git repository. See Repositories.
  6. 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.