Plugin — Gitea

Plugin — Gitea

El plugin de Gitea escucha eventos de issues y pull requests desde repositorios autohospedados. Valida la autenticidad de cada request mediante firma HMAC SHA-256 antes de procesar el payload.

Mecanismo: Webhook  ·  Autenticación: HMAC SHA-256  ·  Eventos soportados: issues, pull_request

Endpoint del webhook

POST
/plugins/gitea/webhook/{plugin_id}/
ParámetroUbicaciónDescripción
plugin_id Path ID del PluginConfig registrado para esta instancia Gitea.
X-Gitea-Event Header Tipo de evento enviado por Gitea: issues o pull_request.
X-Gitea-Signature Header Firma HMAC SHA-256 del body. Formato: sha256=<hex>.

Configuración paso a paso

  1. Registrar el PluginConfig en Joe
    from apps.common.models import PluginConfig
    
    config = PluginConfig(
        usuario=user,
        servicio="gitea",
        identificador="pogit.pedroospino.net",
        metadatos={"webhook_secret": "mi_secret_hmac_seguro"},
    )
    # Gitea no requiere un token OAuth para solo recibir webhooks,
    # pero puedes guardar un token de acceso personal si necesitas
    # que Joe también realice acciones en la API de Gitea:
    config.set_token("")   # Dejar vacío si solo se reciben webhooks
    config.save()
    # Anota el ID: config.pk → ej. 5
  2. Agregar el webhook en Gitea

    En tu repositorio de Gitea: Settings → Webhooks → Add Webhook → Gitea

    CampoValor
    Target URLhttps://joe.pedroospino.net/plugins/gitea/webhook/5/
    HTTP MethodPOST
    Content Typeapplication/json
    SecretEl mismo valor que webhook_secret en metadatos
    Trigger OnIssues, Pull Requests
    Active
  3. Probar el webhook

    Desde la misma página de configuración en Gitea, usa el botón "Test Delivery" para enviar un evento de prueba y verificar que Joe responde con HTTP 200.

Flujo de un issue entrante

Evento: issues — action opened

  1. Gitea envía el payload firmado al endpoint de Joe.
  2. Joe valida la firma: sha256=HMAC(secret, body).
  3. Se deserializa el payload como GiteaIssueEvent.
  4. Se crea una tarea con tipo=gitea_issue, estado=abierto, URL externa del issue.

Evento: issues — action closed / reopened

  1. Joe busca tareas existentes por metadatos_extra.issue_number + repo.
  2. Actualiza el campo estado: terminado si se cerró, abierto si se reabrió.

Evento: pull_request — action opened

  1. Se crea una tarea con tipo=gitea_pr, estado=abierto.
  2. Solo se procesa la acción opened. Otros estados de PR se ignoran en V1.

Campos en metadatos_extra de la tarea

Para issues (gitea_issue)

CampoDescripción
repoNombre completo del repo: owner/repo
issue_numberNúmero del issue en Gitea. Usado para sincronizar estado.
senderUsername del usuario que abrió el issue.
labelsLista de etiquetas del issue al momento de creación.
plugin_idID del PluginConfig que procesó el evento.

Para pull requests (gitea_pr)

CampoDescripción
repoNombre completo del repo: owner/repo
pr_numberNúmero del PR en Gitea.
senderUsername del autor del PR.
plugin_idID del PluginConfig que procesó el evento.

Validación de firma (modo dev)

Sin secret en dev: Si metadatos.webhook_secret está vacío, la validación de firma se omite automáticamente. Esto facilita el desarrollo local, pero nunca debe usarse en producción.

Campos del PluginConfig para Gitea

CampoValor esperado
servicio"gitea"
identificadorHostname de tu instancia: pogit.pedroospino.net
token_cifradoToken de acceso personal (opcional, solo si Joe necesita actuar en la API de Gitea)
metadatos.webhook_secretString secreto compartido con Gitea para firmar los webhooks.