conventional commits y algunas herramientas de apoyo
¿ qué es conventional commits ?
CommitLint es una herramienta que ayuda a adoptar una convención para escribir commits de forma estandarizada. esta convención se llama Conventional Commits y esta relacionada con un estándar a la hora de versionar artefactos llamada Semantic Versioning.
La especificación de Conventional Commits es una convención sobre cómo escribir los mensajes de commits (específicamente el título del commit). Además nos provee de un conjunto sencillo de reglas para crear un CHANGELOG de commits explícito; lo que hace más fácil escribir herramientas encima del historial. Esta convención encaja con SemVer, al describir en los mensajes de los commits las funcionalidades, parches y cambios de ruptura hechos.
El mensaje del commit debe ser estructurado de la siguiente manera:
1 | <tipo>(ámbito opcional): <descripción> |
Por ejemplo:
1 | fix(api): se corrige validacion de email |
Los tipos
que más se utilizan en Conventional Commits son los siguientes:
- feat: Se agrega una nueva característica
- fix: Se corrige algún problema
- chore: Se modifican archivos que rodean el código fuente (configuraciones, cambios de versión)
- refactor: Refactorización del código
- docs: se agrega o modifica documentación
- test: Se agrega o modifican tests
Los tipos relevantes a la hora de generar valor en el CHANGELOG son los feat y los fix, en base a esos tipos se construye de forma automática la bitácora de cambios relevantes (útil al usar standard-version, leer mas adelante)
Instalar commitlint
1 | yarn add -D @commitlint/{cli,config-conventional} |
Si estas usando commonsjs
debes cambiar el export default
por module.exports
. debes revisar el atributo type dentro del archivo package.json
.
Ejecuta el siguiente comando para crear el archivo commitlint.config.js
1 | $ echo "export default { extends: ['@commitlint/config-conventional'] };" > commitlint.config.js |
O agregar este archivo en la raíz del proyecto:
1 | export default { |
Demás esta decir que puedes extender la configuración y acomodarla a tus necesidades, sólo considerar que las herramientas que se basan en estas convenciones también deberás adaptarlas y en otros casos es posible que no te sirvan.
husky
Husky es una herramienta que permite gestionar de forma simple git-hooks y que nos permite que cada vez que hagamos un commit, por ejemplo, corra los test unitarios o que nos revise si el commit message cumple con la convención de conventional commits (que es nuestro caso).
1 | yarn add -D husky |
El ultimo comando (el echo), genera un archivo cuyo contenido es la ejecución de commitlint y será ubicado en el directorio de los hooks de husky.
Nota: Cuando ejecutas el comando yarn husky init
este te genera un directorio llamando .husky
y dentro quedará un archivo llamado pre-commit
con el siguiente contenido:
1 | yarn test |
Esto quiere decir que antes de que se realice el commit, husky ejecurata el comando yarn test
y si este comando sale sin problemas, se efectuará el commit, en caso contrario los archivos no serán agregados al historial.
standard version
Otra herramienta que nos puede ayudar a mejorar la forma en que realizamos los releases, es una utilidad llamada standard-version (es algo vieja pero funciona perfectamente). Según su propia descripción:
Una utilidad para el versionamiento usando semver y generación de CHANGELOG potenciados por conventional commits.
1 | yarn add -D standard-version |
Una vez agregada la librería se debe agregar un comando en la sección de scripts en el package.json (sólo para mayor comodidad).
1 | "scripts": { |
Con eso ya puedes usar los comandos release y pre-release, el primero para concretar el release y el segundo es para ver como quedará de forma verbosa pero sin afectar el repositorio. Por ejemplo:
1 | $ yarn pre-release |
Nótese que el comando de pre-release nos indica exactamente lo que hará el comando release, donde hay que resaltar la linea bumping version in package.json from 1.0.0 to 1.1.0
que indica, en función de commits messages, califican para cambio de minor (feat agregados) o patch (fix agregados). Por ejemplo… si entre versiones solo tienes commits messages con fix cuando hagas el release, lo hara modificando el dígito del patch, por otro lado, si agregas un nuevo feature (feat) te modificará el minor en la versión.
Si requieres hacer un versionamiento manual debes ejecutar el siguiente comando:
1 | yarn release --releas-as 1.1.1 |
Con eso fuerzas a que la versión sea la que indicas como argumento.
GitFlow
Si usas git-flow como modelo de ramas, te sugiero configurar standard-version para que no realice el tag una vez que hagas el release, de esta forma le delegas dicha función a git-flow. Les dejo el archivo de configuración que se llama .versionrc
y debe estar ubicado en la raíz del proyecto:
1 | { |
Con esta configuración, puedes lanzar los comandos de release en la rama hotfix o release y luego finalizas las rama con git-flow.
Palabras al cierre
Espero les sirva este pequeño post sobre herramientas de desarrollo que utilizo en el día a día y sus configuraciones.
Les dejo los links de las referencias: