Development Conventions
Camunda usa Conventional Commits, Google Java Format, JDK 21 (algunos módulos legacy en JDK 8 para compatibilidad de clientes), workflow basado en rebase + force-push, backporting automatizado vía labels. La heurística de severity más útil: "¿Hubo data loss o corrupción?" → CRITICAL inmediato. El módulo
identityserá renombrado aadmin.
Severity Heuristic — la más valiosa¶
Para un workflow engine, Camunda define severity con preguntas concretas:
- ¿Hubo data loss o corruption? → CRITICAL
- ¿Hay configuration workaround?
- ¿El cluster recuperó automáticamente o requirió intervención manual?
- ¿Processing unavailable?
- ¿Exporting unavailable?
Esto revela las prioridades de negocio:
Para el MVP: replicar esto en runbook operacional.
| Nivel | Definición |
|---|---|
| Critical | Data loss, RCE, sin workaround |
| High | Notable impact, sin workaround, regular crashes |
| Mid | Notable impact, workaround conocido |
| Low | Log noise, sin impacto al usuario |
| Unknown | Tratar como High |
Build commands¶
# Quick dev build (skips Optimize)
./mvnw clean install -Dquickly
# Full build sin tests
./mvnw clean install -DskipChecks -DskipTests
# Sin frontends
./mvnw clean install -DskipChecks -DskipTests -PskipFrontendBuild
# Full con tests
./mvnw clean install
# Quick tests
./mvnw verify -Dquickly -DskipTests=false
Output artifact: dist/target/camunda-zeebe-X.Y.Z-SNAPSHOT.tar.gz
Java version split¶
| Módulos | JDK version |
|---|---|
| Mayoría | JDK 21 + language level 21 |
| Cliente y protocolo | JDK 8 language level |
Módulos en JDK 8:
- camunda-client-java
- camunda-process-test-java
- zeebe-bpmn-model
- zeebe-build-tools
- zeebe-gateway-protocol(-impl)
- zeebe-protocol(-jackson)
Razón: clientes Java legacy aún usan JDK 8 en producción. Los módulos exportados deben ser compatibles.
Implicación MVP: si haces SDK para clientes, considerar compatibility con versiones más viejas del lenguaje target.
Code conventions¶
- Google Java Format (auto-aplicado por Maven)
- Zeebe Code Style (manual, en wiki interno)
- Conventional Commits para mensajes
- Squash commits relacionados antes de review
PR Workflow¶
1. Branch name: issueId-description
git checkout -b 123-adding-bpel-support
2. Commit con conventional format
git commit -am 'feat: add BPEL execution support'
3. Push y create PR
git push -u origin 123-adding-bpel-support
4. Review (emoji code)
5. Squash commits si hay cleanup commits
6. Force push (lease)
git push --force-with-lease
7. Merge queue: "Merge when ready" button
- Bot merge con latest main
- Run CI
- Auto-merge si pasa
Review Emoji Code¶
Convención inspirada en Microsoft:
| Emoji | Cuándo usar |
|---|---|
👍 / :+1: |
Like — feedback positivo |
❓ / :question: |
Question — necesita clarificación |
❌ / :x: |
Blocker — debe cambiar |
🔧 / :wrench: |
Suggestion — opcional |
💭 / :thought_balloon: |
Thinking out loud |
Distingue claramente required vs optional changes en code review. Adoptable inmediatamente.
Backporting¶
Vía labels en el PR:
- backport stable/8.5 → port a branch stable/8.5
- Multiple labels → port a multiple branches
- Trigger automático on merge, o /backport comment para PR ya merged
Implementado vía zeebe-io/backport-action.
Implicación MVP: solo relevante cuando se mantienen multiple stable branches. Para MVP early stage, una sola main branch.
IntelliJ setup¶
Run config para development local:
Module: camunda-zeebe
Main class: io.camunda.application.StandaloneCamunda
Active profiles: admin,tasklist,operate,broker,consolidated-auth,dev,insecure
Env vars críticas (todos los componentes):
- ZEEBE_BROKER_EXPORTERS_CAMUNDAEXPORTER_* — configuración de exporter
- CAMUNDA_SECURITY_INITIALIZATION_USERS_* — usuario default demo/demo
- CAMUNDA_SECURITY_INITIALIZATION_DEFAULTROLES_ADMIN_USERS_0_=demo
URLs locales: - Tasklist: http://localhost:8080/tasklist - Operate: http://localhost:8080/operate - Admin: http://localhost:8080/admin
Notas misceláneas¶
Apple Silicon Macs¶
Build puede fallar con errors de protoc. Solución: Rosetta debe estar instalado.
IntelliJ memory¶
Para archivos grandes (GatewayOuterClass), aumentar:
Identity → Admin rename¶
"identity - component within self-managed Camunda 8 responsible for authentication and authorization. Will soon be renamed to
adminto better reflect its purpose."
Cambio de nombre venidero — solo afecta naming.
Implicaciones para el MVP¶
Adoptar inmediatamente¶
- Severity heuristic — runbook con preguntas concretas
- Conventional Commits — facilita changelog generation
- Review emoji code — clarity en code review
- Force-push with-lease — previene sobrescribir trabajo
- Squash commits pre-merge — historia limpia
Considerar más tarde¶
- Backporting action — solo cuando hay multiple stable branches
- JDK split — para clientes legacy si MVP los soporta
- Severity-based prioritization — cuando hay equipo
NO adoptar¶
- CLA proceso — para MVP open-source, license puro
- IntelliJ-specific tooling — debe funcionar en cualquier editor
Una lección key¶
La pregunta "¿Hubo data loss?" como primera question en triage es profundamente correcta para workflow engines. Replicarla:
def triage_severity(bug_report):
if data_loss_or_corruption(bug_report):
return Severity.CRITICAL
if no_workaround(bug_report) and impacts_availability(bug_report):
return Severity.HIGH
if has_workaround(bug_report) and impacts_users(bug_report):
return Severity.MID
return Severity.LOW
Workflow engines son confiados con state-of-business. Data corruption es catastrophic en formas que availability no lo es.