# 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 **Gitea** → `odoo-elabore-ci` → **Actions** 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)* | ❌ | #### Recommended Workflow ``` 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`**: ```bash 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**: ```bash mkdir config/{new_version} ``` 2. **Copy and adapt files** from the closest version or from an OCA repo: ```bash # 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**: ```bash 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 - [OCA Maintainer Tools](https://github.com/OCA/maintainer-tools) - [OCA Pre-commit Hooks](https://github.com/OCA/odoo-pre-commit-hooks) - [Pylint-Odoo](https://github.com/OCA/pylint-odoo) - [Ruff](https://docs.astral.sh/ruff/) - [Pre-commit](https://pre-commit.com/) ## License AGPL-3.0