Files
odoo-elabore-ci/README.md
Stéphan Sainléger f86c403ab2 [IMP] push directly to branches instead of creating PRs
CI config changes are low-risk and don't affect business code.
Direct push eliminates the need to manually validate 50+ PRs.

Changes:
- Push commits directly to target branches (no AGit PR flow)
- Simplified commit message: '[CI] sync config from odoo-elabore-ci'
- Update README to reflect direct push behavior
2026-03-10 17:11:03 +01:00

6.9 KiB

odoo-elabore-ci

Centralized CI/CD configuration for Elabore's Odoo repositories.

Purpose

This repository manages linting and CI configuration centrally for all Odoo repositories (*-addons and *-tools) in the Elabore organization on Gitea.

Benefits:

  • Single, consistent configuration across all repos
  • Automatic updates via deployment workflow
  • Multi-version Odoo support (16.0, 18.0, etc.)
  • Based on OCA (Odoo Community Association) standards

Architecture

odoo-elabore-ci/
├── .gitea/workflows/
│   └── deploy-config.yml        # Manual deployment workflow (with dry-run)
└── config/
    ├── common/                   # Shared files (all versions)
    │   ├── .editorconfig
    │   └── .gitea/workflows/
    │       └── pre-commit.yml   # CI workflow deployed to each repo
    ├── 16.0/                     # Odoo 16.0 configuration
    │   ├── .eslintrc.yml
    │   ├── .prettierrc.yml
    │   ├── .pre-commit-config.yaml
    │   ├── .pylintrc
    │   ├── .pylintrc-mandatory
    │   └── .ruff.toml
    └── 18.0/                     # Odoo 18.0 configuration
        ├── eslint.config.cjs
        ├── prettier.config.cjs
        ├── .pre-commit-config.yaml
        ├── .pylintrc
        ├── .pylintrc-mandatory
        └── .ruff.toml

How It Works

Deployment Workflow (deploy-config.yml)

The deployment is manually triggered via Gitea Actions interface, giving you full control over what gets deployed and where.

Features:

  • Version filter: Deploy to all versions or a specific one (16.0, 18.0)
  • Repo filter: Deploy to all repos or specific ones (comma-separated)
  • Dry-run mode: Preview changes without pushing anything
  • Direct push: Commits are pushed directly to target branches (no PR)

Process:

  1. Detects available versions (folders in config/ other than common/)
  2. For each target repository:
    • For each selected Odoo version:
      • Attempts to clone the corresponding branch
      • Copies config/common/ then config/{version}/
      • In dry-run: shows what would change
      • In live mode: commits and pushes directly to the branch

CI Workflow (pre-commit.yml)

Deployed to each target repository, this workflow runs on every Pull Request:

  1. Sets up Python 3.11 environment
  2. Installs and runs pre-commit with all configured hooks
  3. Verifies no untracked files were generated

Linting Tools

Tool Purpose Target Files
Ruff Python linter + formatter .py
Pylint-Odoo Odoo-specific rules .py, __manifest__.py, XML
ESLint JavaScript linter .js
Prettier Multi-language formatter JS, CSS, XML, JSON, YAML, MD
pre-commit-hooks Generic checks Trailing whitespace, merge conflicts, etc.
OCA hooks Odoo community standards Manifests, README, translations

Usage Guide

Deploying Configuration

Deployment is done via the Gitea Actions interface:

  1. Go to Giteaodoo-elabore-ciActions
  2. Select "Deploy CI Config" workflow
  3. Click "Run workflow"
  4. Fill in the parameters:
Parameter Description Examples
Version Odoo version to deploy all, 16.0, 18.0
Repos Target repos (empty = all) crm-addons, hr-addons
Dry-run Preview without pushing true (recommended first)

Deployment Examples

I want to... Version Repos Dry-run
Preview all changes all (empty)
Deploy 16.0 to one repo 16.0 crm-addons
Deploy 18.0 to multiple repos 18.0 crm-addons, hr-addons
Deploy all versions everywhere all (empty)
1. Make changes in config/
2. git commit && git push origin main
   → Nothing happens (no auto-deploy)

3. Run workflow with DRY-RUN enabled
   → Review the logs to see what would change

4. If satisfied, run again WITHOUT dry-run
   → Changes are pushed directly to target branches

Modifying CI Configuration

  1. Edit files in config/:

    • config/common/: changes applied to all versions
    • config/{version}/: version-specific changes
  2. Commit and push to main:

    git add .
    git commit -m "[IMP] description of change"
    git push origin main
    
  3. Trigger deployment manually (see above)

Adding a New Odoo Version

  1. Create the configuration directory:

    mkdir config/{new_version}
    
  2. Copy and adapt files from the closest version or from an OCA repo:

    # Example for Odoo 19.0 based on 18.0
    cp config/18.0/* config/19.0/
    
  3. Adapt the copied files:

    File Required Changes
    .pylintrc valid-odoo-versions=19.0
    .pylintrc-mandatory valid-odoo-versions=19.0
    .ruff.toml target-version if Python version changes
    .pre-commit-config.yaml Hook versions if needed
  4. Commit and push:

    git add config/19.0/
    git commit -m "[ADD] support for Odoo 19.0 configuration"
    git push origin main
    
  5. Deploy via Gitea Actions:

    • The new version will appear in the "Version" dropdown
    • Use dry-run first to verify which repos have a 19.0 branch

Secrets Configuration

The workflow requires a Gitea token with the following permissions:

  • Read access to all organization repos
  • Write access (to create PRs)

Configure the ELABORE_BOT_TOKEN secret in the repository settings.

Version Differences

16.0 vs 18.0

Aspect 16.0 18.0
ESLint config .eslintrc.yml eslint.config.cjs (flat config)
Prettier config .prettierrc.yml prettier.config.cjs
Node.js 16.17.0 22.9.0
Prettier 2.7.1 3.3.3
ESLint 8.x 9.x
Additional hooks - whool-init, oca-gen-external-dependencies

Configuration Files

.pylintrc vs .pylintrc-mandatory

  • .pylintrc: All rules (optional + mandatory), non-blocking mode (--exit-zero). Useful for IDEs.
  • .pylintrc-mandatory: Critical rules only, blocking mode. Used by CI.

Elabore-Specific Rules

Files are customized for Elabore:

  • manifest-required-authors=Elabore
  • URLs pointing to https://git.elabore.coop/elabore/

Contributing

  1. Test changes locally with pre-commit run --all-files
  2. Follow commit conventions (tags [IMP], [FIX], [ADD], etc.)
  3. Auto-generated PRs should be reviewed before merging

Resources

License

AGPL-3.0