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

221 lines
6.9 KiB
Markdown

# 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