Stéphan Sainléger 61a9e10b17 [IMP] manual deployment workflow with dry-run and filters
Replace automatic deployment (on push) with manual workflow_dispatch:
- Version filter: deploy to all versions or specific one (16.0, 18.0)
- Repo filter: deploy to all repos or comma-separated list
- Dry-run mode: preview changes without creating PRs
- Detailed summary with emoji indicators and statistics

Benefits:
- Full control over deployment scope and timing
- Safe preview before creating 50+ PRs
- Targeted deployments for testing

Update README with new deployment guide and examples.
2026-03-10 16:59:45 +01:00
2025-09-15 15:52:44 +02:00

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 creating any PRs

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: creates a Pull Request if changes detected

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 creating PRs 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
   → PRs are created in target repos

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

Description
No description provided
Readme AGPL-3.0 188 KiB
Languages
JavaScript 100%