Control de Versiones con Git Avanzado 🌳
¿Por qué Git es fundamental en DevOps?
Git no es solo una herramienta de control de versiones; es el corazón del flujo DevOps. Todo pipeline, toda automatización, toda colaboración pasa por Git.
🎯 Objetivos del Capítulo
- Dominar flujos de trabajo Git avanzados
- Implementar estrategias de branching eficientes
- Configurar hooks para automatización
- Gestionar releases y versionado semántico
📋 Estrategias de Branching
Git Flow vs GitHub Flow vs GitLab Flow
Git Flow (para proyectos complejos)
# Inicializar Git Flow
git flow init
# Crear feature
git flow feature start nueva-funcionalidad
git flow feature finish nueva-funcionalidad
# Crear release
git flow release start v1.2.0
git flow release finish v1.2.0
# Hotfix crítico
git flow hotfix start critical-fix
git flow hotfix finish critical-fix
GitHub Flow (para desarrollo continuo)
# 1. Crear branch desde main
git checkout -b feature/user-authentication
# 2. Desarrollar y hacer commits
git add .
git commit -m "feat: add JWT authentication"
# 3. Push y crear Pull Request
git push origin feature/user-authentication
# 4. Review, test, merge
🚀 Git Hooks para DevOps
Pre-commit Hook (Calidad de código)
#!/bin/sh
# .git/hooks/pre-commit
echo "🔍 Ejecutando verificaciones pre-commit..."
# Verificar sintaxis
npm run lint
if [ $? -ne 0 ]; then
echo "❌ Lint failed. Commit abortado."
exit 1
fi
# Ejecutar tests
npm test
if [ $? -ne 0 ]; then
echo "❌ Tests failed. Commit abortado."
exit 1
fi
# Verificar secrets
gitleaks detect --verbose
if [ $? -ne 0 ]; then
echo "❌ Secrets detectados. Commit abortado."
exit 1
fi
echo "✅ Todas las verificaciones pasaron"
Pre-push Hook (Seguridad)
#!/bin/sh
# .git/hooks/pre-push
echo "🔒 Verificando seguridad antes del push..."
# Escanear vulnerabilidades
npm audit
if [ $? -ne 0 ]; then
echo "⚠️ Vulnerabilidades encontradas"
read -p "¿Continuar? (y/N): " confirm
if [ "$confirm" != "y" ]; then
exit 1
fi
fi
📦 Versionado Semántico
Conventional Commits
# Formato: tipo(scope): descripción
feat(auth): add JWT authentication
fix(api): resolve memory leak in user service
docs(readme): update installation instructions
style(css): improve button hover effects
refactor(utils): simplify data validation
test(unit): add tests for user controller
chore(deps): update dependencies
# Breaking changes
feat!: change API authentication method
Automatización con commitizen
# Instalar commitizen
npm install -g commitizen
npm install -g cz-conventional-changelog
# Configurar
echo '{ "path": "cz-conventional-changelog" }' > ~/.czrc
# Usar
git cz
🏷️ Gestión de Tags y Releases
Creación automática de tags
# Tag manual
git tag -a v1.2.0 -m "Release version 1.2.0"
git push origin v1.2.0
# Tag automatizado con npm
npm version patch # 1.2.0 -> 1.2.1
npm version minor # 1.2.1 -> 1.3.0
npm version major # 1.3.0 -> 2.0.0
Release automation con GitHub Actions
# .github/workflows/release.yml
name: Release
on:
push:
tags:
- 'v*'
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Create Release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.ref }}
release_name: Release ${{ github.ref }}
draft: false
prerelease: false
🔄 Flujos de Trabajo Avanzados
Rebase vs Merge
# Merge (preserva historial)
git checkout main
git merge feature/nueva-funcionalidad
# Rebase (historial lineal)
git checkout feature/nueva-funcionalidad
git rebase main
git checkout main
git merge feature/nueva-funcionalidad --ff-only
Interactive Rebase para limpiar historial
# Reescribir últimos 3 commits
git rebase -i HEAD~3
# En el editor:
# pick abc1234 Add user model
# squash def5678 Fix typo in user model
# squash ghi9012 Update user model tests
Cherry-pick para hotfixes
# Aplicar commit específico a otra rama
git checkout main
git cherry-pick abc1234
🛡️ Seguridad en Git
Configuración segura
# Firmar commits con GPG
git config --global user.signingkey YOUR_GPG_KEY
git config --global commit.gpgsign true
# Verificar commits firmados
git log --show-signature
# Push con verificación
git config --global push.default simple
git config --global push.followTags true
.gitignore esencial para DevOps
# Secrets y configuraciones
.env
.env.local
*.key
*.pem
secrets/
config/production.json
# Dependencies
node_modules/
vendor/
.venv/
# Build outputs
dist/
build/
target/
*.log
# IDE
.vscode/
.idea/
*.swp
# OS
.DS_Store
Thumbs.db
# DevOps tools
.terraform/
.vagrant/
ansible-vault-pass
kubeconfig
🔧 Herramientas y Extensiones
Aliases útiles para DevOps
# ~/.gitconfig
[alias]
# Status y logs
st = status
lg = log --oneline --graph --decorate --all
# Branching
co = checkout
br = branch
# DevOps specific
last = log -1 HEAD
unstage = reset HEAD --
pushf = push --force-with-lease
# Cleanup
cleanup = "!git branch --merged | grep -v '\\*\\|master\\|main\\|develop' | xargs -n 1 git branch -d"
Git LFS para archivos grandes
# Instalar Git LFS
git lfs install
# Trackear tipos de archivos
git lfs track "*.zip"
git lfs track "*.tar.gz"
git lfs track "docker-images/*"
# Verificar tracking
git lfs ls-files
📊 Monitoreo y Métricas
Estadísticas del repositorio
# Commits por autor
git shortlog -sn
# Actividad por fecha
git log --format="%ai" | cut -d' ' -f1 | sort | uniq -c
# Archivos más modificados
git log --name-only --pretty=format: | sort | uniq -c | sort -rg
🎯 Ejercicios Prácticos
Ejercicio 1: Configurar Git Flow
- Inicializa Git Flow en un proyecto
- Crea una feature branch
- Simula un hotfix
- Gestiona un release
Ejercicio 2: Implementar Hooks
- Configura pre-commit hook con linting
- Añade verificación de secrets
- Implementa pre-push hook con tests
Ejercicio 3: Workflow de Release
- Configura conventional commits
- Automatiza versionado semántico
- Crea GitHub Action para releases
✅ Checklist de Buenas Prácticas
- Commits descriptivos con conventional commits
- Branches con naming convention clara
- Pre-commit hooks configurados
- Secrets nunca en el repositorio
- Tags para todas las releases
- .gitignore completo y actualizado
- Firma de commits activada
- Documentación actualizada en cada release
🔗 Recursos Adicionales
💡 Recuerda: Git es la base de todo pipeline DevOps. Dominarlo es esencial para la automatización y colaboración eficiente.