[ADD] ci: Forgejo Actions CI and Claude bots ported from ecocentral
Same system as ecocentral-18 (see its docs/CI-CD.md): - ci.yml: lint (pre-commit), test (tools/ci/run_tests.py, OCA-style two-phase install) and review (PR bot, after lint and test). - issue-bot.yml: the issue bot answers issues or opens a PR on bot/issue-N. - pr-bot.yml: review when WIP is removed or the i18n label is added. - .gitea/issue-bot.md: context for the bots; this repo is shared by several clients. The bot scripts are copies of ecocentral's. Only the defaults differ (repo, token and state files, i18n languages es,eu,ca,gl) along with the [I18N] commit message and the references to the runner's sources.txt. The jobs run on a second forgejo-runner registration (CriptoMart org) on ecocentral's runner machine, sharing its image, mounts and cache. The runner files (Dockerfile, update.sh, sources.txt) live in ecocentral. Specific to this repo: - ODOO_SRC_SKIP: the runner's /odoo-src/18.0 holds a clone of addons-cm, so test skips it and checks the PR checkout instead. - BOT_BASE_BRANCH "18.0": the repo's default branch is 16.0. - test PostgreSQL on port 54330: ecocentral's runs on 54329 and a test job from each repo can run at the same time. The lint job fails until the repo is cleaned up with pre-commit run --all-files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
fad510f69e
commit
d9d9e8be2d
13 changed files with 2154 additions and 0 deletions
36
.gitea/issue-bot.md
Normal file
36
.gitea/issue-bot.md
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
Este repo no es de un único cliente: son los addons de Odoo 18 Community que
|
||||
Criptomart comparte entre varias instancias (Elika Bilbo y otros grupos y
|
||||
cooperativas de consumo, y Ecocentral, que lo usa como dependencia). Hay
|
||||
addons de precios y productos, compra colectiva para grupos de consumo
|
||||
(`website_sale_aplicoop`), socias y cuotas, TPV (CashDro), logística y
|
||||
contabilidad.
|
||||
|
||||
- Un cambio aquí llega a todas las instancias que instalan ese addon. Cuida la
|
||||
compatibilidad: nada de suponer la configuración, los datos ni el idioma de
|
||||
un cliente concreto, y nada que rompa los datos que ya existen (sube la
|
||||
versión del manifest y añade un script de migración cuando haga falta). Si
|
||||
lo que se pide solo tiene sentido para un cliente, propón hacerlo
|
||||
configurable o en un addon aparte, y dilo.
|
||||
- La rama `18.0` es la de trabajo. `16.0` y `17.0` son de versiones anteriores
|
||||
de Odoo: si una incidencia se refiere a ellas, dilo en lugar de resolverla
|
||||
aquí. Si se refiere a un addon propio de un cliente (por ejemplo los `eco_*`
|
||||
de ecocentral), también.
|
||||
- Las fuentes de Odoo y OCA traen un clon de este mismo repo (`addons-cm`) de
|
||||
la última actualización semanal: el código que vale es el del árbol de
|
||||
trabajo, no ese clon.
|
||||
- Convenciones de código: `.github/copilot-instructions.md`. Lo principal: la
|
||||
lógica de negocio va en `product.product` (en `product.template`, campos
|
||||
`related`); nada de lógica en QWeb ni en JavaScript, se prepara en Python;
|
||||
sin `_()` en la definición de los campos; no se modifican los addons de OCA
|
||||
ni el core, se heredan desde un addon propio.
|
||||
- Idioma de los textos: el código, los comentarios y los textos que ve el
|
||||
usuario (campos, vistas, mensajes) se escriben en inglés, y sus traducciones
|
||||
van en `i18n/<idioma>.po`. Castellano (`es.po`) y euskera (`eu.po`) son
|
||||
obligatorios; hay addons con `ca.po` y `gl.po`. Los `.po` se editan con
|
||||
`polib`, nunca con `msgmerge`, que los corrompe.
|
||||
- Las personas que abren incidencias escriben en castellano o en euskera, y
|
||||
usan Odoo en castellano o en euskera: nombra los menús y campos como salen
|
||||
en pantalla en su idioma.
|
||||
- Commits con el estilo `[FIX] website_sale_aplicoop: show the full product
|
||||
name on the cards` (etiquetas `[ADD] [FIX] [IMP] [REF] [REM] [I18N] [DOC]`),
|
||||
en inglés; título y descripción del PR también en inglés.
|
||||
91
.gitea/workflows/ci.yml
Normal file
91
.gitea/workflows/ci.yml
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
name: CI
|
||||
# Las comillas de "18.0" hacen falta: sin ellas YAML lo lee como un número y
|
||||
# Forgejo descarta el workflow entero, sin avisar.
|
||||
on:
|
||||
push:
|
||||
branches: ["18.0"]
|
||||
pull_request:
|
||||
branches: ["18.0"]
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
# Misma imagen que el bot de incidencias: ya trae Python y pre-commit, y
|
||||
# el runner le monta la caché con los entornos de los hooks. Así el job no
|
||||
# depende de descargar Python de GitHub en cada ejecución.
|
||||
runs-on: issue-bot
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Run pre-commit
|
||||
run: pre-commit run --all-files --show-diff-on-failure
|
||||
|
||||
test:
|
||||
# Misma imagen que el bot de incidencias: trae las dependencias de Odoo y
|
||||
# Chromium, y el runner le monta OCB y los repos OCA en /odoo-src. Ver
|
||||
# tools/issue_bot/README.md.
|
||||
runs-on: issue-bot
|
||||
# El runner lanza los contenedores en la red del host (hace falta para
|
||||
# llegar a Forgejo en localhost), y ahí los servicios no tienen nombre: se
|
||||
# llega a PostgreSQL por 127.0.0.1. Escucha solo en esa dirección y en un
|
||||
# puerto propio para no quedar expuesto ni chocar con otro PostgreSQL de
|
||||
# la máquina. El de ecocentral usa el 54329, y su runner y el de este
|
||||
# repo son registros distintos en la misma máquina: un job test de cada
|
||||
# uno puede correr a la vez.
|
||||
services:
|
||||
db:
|
||||
image: postgres:16
|
||||
env:
|
||||
POSTGRES_USER: odoo
|
||||
POSTGRES_PASSWORD: odoo
|
||||
POSTGRES_DB: postgres
|
||||
PGPORT: "54330"
|
||||
cmd: ["postgres", "-c", "listen_addresses=127.0.0.1"]
|
||||
env:
|
||||
PGHOST: 127.0.0.1
|
||||
PGPORT: "54330"
|
||||
PGUSER: odoo
|
||||
PGPASSWORD: odoo
|
||||
PGDATABASE: test
|
||||
ODOO_SRC: /odoo-src/18.0
|
||||
# El runner es el de ecocentral, y su /odoo-src/18.0 trae un clon de
|
||||
# este repo (ecocentral depende de él): se prueba el checkout del PR,
|
||||
# no ese clon.
|
||||
ODOO_SRC_SKIP: addons-cm
|
||||
# Si los tests pasan, deja aquí el .pot de cada addon para el job review.
|
||||
# Está en la caché que el runner monta en todos los jobs.
|
||||
BOT_POT_DIR: /root/.cache/eco-pr-bot/pot
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Tests de los addons
|
||||
run: python3 tools/ci/run_tests.py
|
||||
|
||||
review:
|
||||
# Revisión del PR por IA (seguridad, idiomas y flujos de Odoo): solo en los
|
||||
# PR que no están marcados como WIP, y después de pasar lint y test. El
|
||||
# resto de filtros (etiqueta no-bot, commit ya revisado) los aplica
|
||||
# review.py. Ver tools/pr_bot/README.md.
|
||||
needs: [lint, test]
|
||||
if: github.event_name == 'pull_request' && !github.event.pull_request.draft
|
||||
runs-on: issue-bot
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
# review.py pone las credenciales de la cuenta del bot al hacer push.
|
||||
persist-credentials: false
|
||||
- name: Run bot
|
||||
env:
|
||||
BOT_FORGEJO_URL: ${{ github.server_url }}
|
||||
BOT_FORGEJO_REPO: ${{ github.repository }}
|
||||
# La rama por defecto del repo es 16.0: sin esto el bot tomaría
|
||||
# esa como base.
|
||||
BOT_BASE_BRANCH: "18.0"
|
||||
BOT_FORGEJO_TOKEN: ${{ secrets.BOT_FORGEJO_TOKEN }}
|
||||
# Basta con uno de los dos.
|
||||
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
||||
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
||||
BOT_REPO_DIR: ${{ github.workspace }}
|
||||
BOT_ODOO_SRC: /odoo-src/18.0:/odoo-src/18.0-oca
|
||||
BOT_POT_DIR: /root/.cache/eco-pr-bot/pot
|
||||
run: >-
|
||||
python3 tools/pr_bot/review.py run
|
||||
"${{ github.event.pull_request.number }}" --ci-passed
|
||||
40
.gitea/workflows/issue-bot.yml
Normal file
40
.gitea/workflows/issue-bot.yml
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
name: Bot de incidencias
|
||||
run-name: "#${{ github.event.issue.number }} ${{ github.event.issue.title }}"
|
||||
on:
|
||||
issues:
|
||||
types: [opened, reopened]
|
||||
issue_comment:
|
||||
types: [created]
|
||||
|
||||
jobs:
|
||||
bot:
|
||||
# Imagen propia con Claude Code y pre-commit ya instalados; el runner monta
|
||||
# las fuentes de Odoo en /odoo-src. Ver tools/issue_bot/README.md.
|
||||
runs-on: issue-bot
|
||||
# Lo que publica la cuenta del bot también dispara el evento: sus respuestas
|
||||
# y el eco de los correos de notificación. Se corta aquí; el resto de
|
||||
# filtros (PR, cerradas, etiqueta no-bot) los aplica bot.py.
|
||||
if: github.actor != 'claudia_eco'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
# bot.py pone las credenciales de la cuenta del bot al hacer push.
|
||||
persist-credentials: false
|
||||
- name: Run bot
|
||||
env:
|
||||
# Con prefijo BOT_: el runner define sus propias FORGEJO_* y
|
||||
# GITHUB_*, entre ellas un FORGEJO_TOKEN que no es de ningún usuario.
|
||||
BOT_FORGEJO_URL: ${{ github.server_url }}
|
||||
BOT_FORGEJO_REPO: ${{ github.repository }}
|
||||
# La rama por defecto del repo es 16.0: sin esto el bot tomaría
|
||||
# esa como base.
|
||||
BOT_BASE_BRANCH: "18.0"
|
||||
BOT_FORGEJO_TOKEN: ${{ secrets.BOT_FORGEJO_TOKEN }}
|
||||
# Basta con uno de los dos.
|
||||
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
||||
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
||||
BOT_REPO_DIR: ${{ github.workspace }}
|
||||
# Dependencias del proyecto y, aparte, el resto de OCA.
|
||||
BOT_ODOO_SRC: /odoo-src/18.0:/odoo-src/18.0-oca
|
||||
run: python3 tools/issue_bot/bot.py run "${{ github.event.issue.number }}"
|
||||
36
.gitea/workflows/pr-bot.yml
Normal file
36
.gitea/workflows/pr-bot.yml
Normal file
|
|
@ -0,0 +1,36 @@
|
|||
name: Bot de revisión
|
||||
run-name: "#${{ github.event.pull_request.number }} ${{ github.event.pull_request.title }}"
|
||||
# La revisión normal es el job review de ci.yml, que corre detrás de lint y
|
||||
# test. Este workflow cubre los dos cambios que no relanzan el CI: quitar la
|
||||
# marca WIP (es editar el título) y poner la etiqueta i18n. review.py comprueba
|
||||
# que el CI ya había pasado para ese commit y que no está revisado.
|
||||
on:
|
||||
pull_request:
|
||||
types: [edited, labeled]
|
||||
branches: ["18.0"]
|
||||
|
||||
jobs:
|
||||
bot:
|
||||
runs-on: issue-bot
|
||||
if: "!github.event.pull_request.draft"
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
# review.py pone las credenciales de la cuenta del bot al hacer push.
|
||||
persist-credentials: false
|
||||
- name: Run bot
|
||||
env:
|
||||
BOT_FORGEJO_URL: ${{ github.server_url }}
|
||||
BOT_FORGEJO_REPO: ${{ github.repository }}
|
||||
# La rama por defecto del repo es 16.0: sin esto el bot tomaría
|
||||
# esa como base.
|
||||
BOT_BASE_BRANCH: "18.0"
|
||||
BOT_FORGEJO_TOKEN: ${{ secrets.BOT_FORGEJO_TOKEN }}
|
||||
# Basta con uno de los dos.
|
||||
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
||||
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
||||
BOT_REPO_DIR: ${{ github.workspace }}
|
||||
BOT_ODOO_SRC: /odoo-src/18.0:/odoo-src/18.0-oca
|
||||
BOT_POT_DIR: /root/.cache/eco-pr-bot/pot
|
||||
run: python3 tools/pr_bot/review.py run "${{ github.event.pull_request.number }}"
|
||||
Loading…
Add table
Add a link
Reference in a new issue