Automatizacion y Build
Git Hooks
``
Documentación y Recursos
- Git - Git Hooks
- GitHub - edunavajas/git-commit-enhancer: Automatic git Hook that captures the original commit and send it to Gemini Api to enhance it
Conceptos Clave
- Git Hooks: Scripts que se ejecutan automáticamente en respuesta a ciertos eventos en el repositorio de Git, como commits, merges o push.
- Tipos de Hooks:
- Client-side Hooks: Se ejecutan en el cliente donde ocurre la acción (por ejemplo,
pre-commit,prepare-commit-msg,commit-msg,post-commit). - Server-side Hooks: Se ejecutan en el servidor de Git, útiles para controlar pushes o actualizaciones (por ejemplo,
pre-receive,update,post-receive).
- Client-side Hooks: Se ejecutan en el cliente donde ocurre la acción (por ejemplo,
- Usos Comunes:
- Validar mensajes de commit.
- Ejecutar tests automáticamente antes de un commit o push.
- Formatear código antes de guardar cambios.
- Integrar herramientas de CI/CD y análisis de calidad de código.
- Automatizar tareas repetitivas de desarrollo.
Ejemplos de Hooks
pre-commit
#!/bin/sh
# Evita commits si hay errores de lint
npm run lint
if [ $? -ne 0 ]; then
echo "Lint errors found. Commit aborted."
exit 1
fi
`
commit-msg
#!/bin/sh
# Valida que el mensaje de commit siga el patrón de convenciones
commit_regex='^feat|fix|docs|style|refactor|test|chore: .+$'
if ! grep -qE "$commit_regex" "$1"; then
echo "Error: commit message does not follow convention"
exit 1
fi
post-commit
#!/bin/sh
# Enviar notificación después del commit
echo "Commit realizado con éxito: $(git log -1 --pretty=%B)"
Herramientas y Mejoras
- git-commit-enhancer: Hook automático que captura el commit original y lo mejora usando Gemini API.
- Integración con linters, formateadores y pruebas unitarias para garantizar calidad antes del push.
- Scripts personalizados según el flujo de trabajo del equipo o proyecto.
Buenas Prácticas
- Versionar hooks dentro del repositorio (
.githooks) y usarcore.hooksPathpara que todos los desarrolladores los tengan consistentes. - Mantener hooks ligeros para no afectar el flujo de trabajo.
- Documentar cada hook y su propósito.
- Priorizar hooks client-side para validaciones preventivas y server-side para reglas críticas.
Git Hooks - Avanzado
Tipos Avanzados de Hooks
- Client-side Hooks (ya mencionados) se pueden detallar:
pre-rebase: Se ejecuta antes de un rebase, útil para prevenir conflictos y mantener commits limpios.pre-push: Valida cambios antes de enviar al remoto, ejecutando tests o análisis de seguridad.prepare-commit-msg: Modifica o preconfigura mensajes de commit automáticamente.
- Server-side Hooks (ya mencionados) con casos de uso:
pre-receive: Previene push si no cumple políticas del repositorio (ej: tests fallidos, rama protegida).update: Similar a pre-receive, pero específico para cada rama.post-receive: Puede disparar integraciones CI/CD, despliegues automáticos o notificaciones.
Integraciones y Automatización
- CI/CD Hooks: Integración con herramientas como GitHub Actions, GitLab CI, Jenkins.
- Automatización de commits:
- Añadir información automática sobre el autor, fecha o ticket asociado.
- Formatear mensajes según convenciones internas del equipo.
- Seguridad y calidad de código:
- Validación de vulnerabilidades antes del push.
- Enforcear reglas de branch o protección de ramas.
Ejemplos Avanzados de Hooks
pre-push
#!/bin/sh
# Ejecutar tests antes de hacer push
npm test
if [ $? -ne 0 ]; then
echo "Tests fallidos. Push cancelado."
exit 1
fi
`
pre-rebase
#!/bin/sh
# Evitar rebase si hay cambios locales no comprometidos
if ! git diff-index --quiet HEAD --; then
echo "Cambios locales detectados. Guarda o commitea antes de rebase."
exit 1
fi
post-receive
#!/bin/sh
# Desplegar automáticamente al servidor de staging
while read oldrev newrev refname
do
if [ "$refname" = "refs/heads/main" ]; then
echo "Desplegando cambios en main a staging..."
./deploy_staging.sh
fi
done
Herramientas Complementarias
- git-commit-enhancer: Mejora automática de mensajes de commit usando IA.
- Husky: Facilita la gestión de hooks en proyectos Node.js.
- Lint-staged: Ejecuta linters solo sobre archivos staged para mejorar velocidad y eficiencia.
- Integración con análisis estático de código como ESLint, Prettier, Pylint, Checkstyle.
Buenas Prácticas Avanzadas
- Mantener todos los hooks versionados y en un directorio centralizado (
.githooks). - Usar hooks client-side para prevención y server-side para reglas críticas.
- Documentar cada hook y su objetivo.
- Combinar hooks con pipelines CI/CD para mayor seguridad y consistencia.
- Revisar periódicamente los hooks para adaptarlos a nuevas necesidades del equipo o proyecto.
Git Hooks - Ejemplos Prácticos y Casos de Uso
Conceptos Clave
- Git Hooks: Scripts automáticos que se ejecutan ante eventos en Git (commits, push, merge, rebase, etc.).
- Tipos de Hooks:
- Client-side: Se ejecutan en el equipo del desarrollador (
pre-commit,commit-msg,pre-push,pre-rebase,prepare-commit-msg,post-commit). - Server-side: Se ejecutan en el servidor remoto (
pre-receive,update,post-receive).
- Client-side: Se ejecutan en el equipo del desarrollador (
- Usos comunes:
- Validar mensajes de commit.
- Ejecutar tests o linters antes de commits/push.
- Formatear código automáticamente.
- Integrar automatizaciones CI/CD.
- Controlar seguridad y políticas de ramas.
Ejemplos Prácticos de Hooks
pre-commit
#!/bin/sh
# Evitar commits con errores de lint
npm run lint
if [ $? -ne 0 ]; then
echo "Lint errors detected. Commit aborted."
exit 1
fi
`
Caso de uso real: En proyectos de frontend, asegura que todos los archivos JS/TS cumplen reglas de ESLint antes de commitear.
commit-msg
#!/bin/sh
# Forzar mensajes de commit que sigan convenciones de equipo
regex="^(feat|fix|docs|style|refactor|test|chore): .+$"
if ! grep -qE "$regex" "$1"; then
echo "Invalid commit message format."
exit 1
fi
Caso de uso real: Equipos que usan convenciones de Git Commit para generar changelogs automáticos.
pre-push
#!/bin/sh
# Ejecutar pruebas antes de permitir push
npm test
if [ $? -ne 0 ]; then
echo "Tests failed. Push aborted."
exit 1
fi
Caso de uso real: Evitar que código roto llegue a la rama principal en proyectos colaborativos.
pre-rebase
#!/bin/sh
# Prevenir rebase con cambios locales no guardados
if ! git diff-index --quiet HEAD --; then
echo "Local changes detected. Commit or stash before rebasing."
exit 1
fi
Caso de uso real: Proteger ramas importantes de conflictos o pérdida de cambios durante rebase.
post-commit
#!/bin/sh
# Notificar en Slack después de cada commit
message=$(git log -1 --pretty=%B)
curl -X POST -H 'Content-type: application/json' --data "{\"text\":\"Nuevo commit: $message\"}" $SLACK_WEBHOOK_URL
Caso de uso real: Mantener al equipo informado de commits importantes en proyectos distribuidos.
post-receive
#!/bin/sh
# Desplegar automáticamente en staging tras push a main
while read oldrev newrev refname
do
if [ "$refname" = "refs/heads/main" ]; then
./deploy_staging.sh
echo "Deployment to staging completed."
fi
done
Caso de uso real: Automatización de despliegues de staging en proyectos de backend o microservicios.
Herramientas Complementarias
- git-commit-enhancer: Mejora automática de mensajes de commit usando IA.
- Husky: Facilita la gestión de hooks en proyectos Node.js.
- Lint-staged: Ejecuta linters solo sobre archivos staged para eficiencia.
- Integración con pipelines CI/CD, Prettier, ESLint, Pylint, Checkstyle.
Buenas Prácticas
- Versionar todos los hooks (
.githooks) y configurarcore.hooksPath. - Usar client-side hooks para validaciones preventivas y server-side para reglas críticas.
- Mantener hooks ligeros para no afectar productividad.
- Documentar el propósito y funcionamiento de cada hook.
- Revisar y actualizar periódicamente los hooks según necesidades del proyecto.
- Combinar hooks con herramientas de CI/CD para automatización completa y seguridad.
Casos de Uso Reales Resumidos
- Prevenir commits con código que no cumple estándares.
- Garantizar mensajes de commit consistentes para changelogs automáticos.
- Ejecutar tests antes de push para proteger ramas principales.
- Despliegue automático de staging/producción tras push.
- Notificaciones en Slack, Teams o correo sobre commits y merges importantes.
- Validación de políticas de ramas y control de accesos mediante hooks server-side.
¿Te gusta este contenido? Suscríbete vía RSS