10. GitHub Avanzado y GitHub CLI
1. GitHub CLI (gh)
La CLI oficial de GitHub permite gestionar repos, PRs, Issues y más directamente desde la terminal.
1.1. Instalación y autenticación
# macOS
brew install gh
# Linux (Debian/Ubuntu)
sudo apt install gh
# Windows
winget install GitHub.cli
# Autenticarse
gh auth login
# Elige GitHub.com → HTTPS → Login with a web browser
1.2. Gestión de repositorios
# Crear repositorio
gh repo create mi-proyecto --public --description "Mi proyecto" --clone
# Crear repo desde directorio actual y subirlo
gh repo create --public --source=. --push
# Ver información del repo actual
gh repo view
# Ver en el navegador
gh repo view --web
# Clonar
gh repo clone AmadorProf/ApuntesGithub
# Listar repos propios
gh repo list
# Listar repos de una organización
gh repo list mi-organizacion
1.3. Pull Requests
# Crear PR (abre editor interactivo)
gh pr create
# Crear PR con título y descripción
gh pr create --title "feat: nuevo login" --body "Implementa autenticación JWT"
# Crear PR dirigido a rama específica
gh pr create --base develop --title "feat: login"
# Listar PRs abiertos
gh pr list
# Ver PR específico
gh pr view 42
# Hacer checkout a la rama de un PR
gh pr checkout 42
# Aprobar un PR
gh pr review 42 --approve
# Mergear PR
gh pr merge 42 --squash
# Cerrar PR
gh pr close 42
1.4. Issues
# Crear issue
gh issue create --title "Bug en login" --body "El login falla con email vacío" --label bug
# Listar issues
gh issue list
gh issue list --label "bug" --state open
# Ver issue
gh issue view 15
# Cerrar issue
gh issue close 15
# Reabrir issue
gh issue reopen 15
# Comentar en issue
gh issue comment 15 --body "Investigando el problema..."
1.5. Workflows y Actions
# Listar workflows
gh workflow list
# Ver ejecuciones recientes
gh run list
# Ver detalles de una ejecución
gh run view 123456
# Ver logs de una ejecución
gh run view 123456 --log
# Disparar workflow manualmente
gh workflow run ci.yml
# Disparar con inputs
gh workflow run deploy.yml --field environment=production
2. Protección de ramas (Branch Protection)
Las reglas de protección evitan pushes directos a ramas importantes y fuerzan revisiones de código.
2.1. Configurar desde la web
Settings → Branches → Add branch protection rule
Opciones más importantes:
| Opción | Efecto |
|---|---|
| Require a pull request | Nadie puede hacer push directo; todo va por PR |
| Required approvals | Número mínimo de aprobaciones antes de merge |
| Require status checks | Los checks de CI deben pasar antes del merge |
| Require branches to be up to date | La rama debe estar actualizada con main |
| Restrict who can push | Solo usuarios/equipos específicos |
| Require signed commits | Todos los commits deben estar firmados con GPG |
2.2. Configurar con GitHub CLI
gh api repos/OWNER/REPO/branches/main/protection \
--method PUT \
--field required_status_checks='{"strict":true,"contexts":["CI"]}' \
--field enforce_admins=true \
--field required_pull_request_reviews='{"required_approving_review_count":1}' \
--field restrictions=null
3. CODEOWNERS
El archivo CODEOWNERS define qué usuarios o equipos deben revisar cambios en partes específicas del código.
3.1. Ubicación
Puede estar en la raíz, en .github/ o en docs/.
3.2. Sintaxis
# .github/CODEOWNERS
# Dueño por defecto (todo lo que no esté en otra regla)
* @amadorprof
# El equipo de frontend revisa todos los cambios en src/
src/ @mi-org/frontend-team
# Un usuario específico revisa la configuración de CI
.github/workflows/ @devops-lead
# Múltiples propietarios
*.sql @amadorprof @db-team
# Archivos específicos
package.json @mi-org/arquitectura
Cuando un PR toca archivos con CODEOWNERS, GitHub solicita automáticamente revisión a los propietarios.
4. GitHub Projects
GitHub Projects es un tablero Kanban/table integrado para gestionar el trabajo.
# Ver proyectos del repositorio
gh project list
# Crear proyecto
gh project create --owner "@me" --title "Sprint 1"
# Añadir issue a un proyecto
gh project item-add 1 --owner "@me" --url "https://github.com/owner/repo/issues/42"
5. Dependabot
Dependabot analiza las dependencias del proyecto y abre PRs automáticos cuando hay actualizaciones o vulnerabilidades.
5.1. Configurar Dependabot
Crear .github/dependabot.yml:
version: 2
updates:
# Actualizar dependencias npm
- package-ecosystem: npm
directory: /
schedule:
interval: weekly
open-pull-requests-limit: 10
# Actualizar GitHub Actions
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
5.2. Alerts de seguridad
GitHub analiza automáticamente las dependencias en busca de CVEs conocidos. Cuando encuentra una vulnerabilidad:
- Envía alerta por email
- Aparece en Security → Dependabot alerts
- Con Dependabot habilitado, abre un PR con el fix automáticamente
6. GitHub Packages
Permite publicar paquetes npm, Docker images, Maven, etc. directamente en GitHub.
# Publicar paquete npm en GitHub Packages
# En package.json:
# "name": "@amadorprof/mi-paquete"
# "publishConfig": {"registry": "https://npm.pkg.github.com"}
npm publish
# Instalar paquete desde GitHub Packages
npm install @amadorprof/mi-paquete --registry https://npm.pkg.github.com
# Docker image
docker tag mi-imagen ghcr.io/amadorprof/mi-imagen:latest
docker push ghcr.io/amadorprof/mi-imagen:latest
Ejercicios
10.1 — Instala GitHub CLI y autentícate. Luego usa gh repo create para crear un repositorio público directamente desde la terminal, clonarlo y hacer un primer commit.
10.2 — Con gh pr create, abre un Pull Request en cualquiera de tus repositorios. Añade título, descripción y una etiqueta. Luego ciérralo con gh pr close.
10.3 — Configura una branch protection rule en main de un repositorio tuyo que: requiera al menos 1 aprobación en PR, exija que los status checks (CI) pasen, y prohíba el push directo (incluso para admins). Verifica intentando hacer push directo.
10.4 — Crea un archivo .github/CODEOWNERS en un repositorio tuyo donde tú seas el propietario de todos los archivos *.md y de la carpeta src/. Abre un PR que modifique un .md y verifica que GitHub te pide revisión automáticamente.
Soluciones
10.1
# Instalar (macOS)
brew install gh
# Autenticar
gh auth login
# → GitHub.com → HTTPS → Login with a web browser
# Crear repositorio y clonarlo
gh repo create mi-nuevo-repo --public --description "Repo creado con gh CLI" --clone
cd mi-nuevo-repo
# Primer commit
echo "# Mi Nuevo Repo" > README.md
git add README.md
git commit -m "docs: initial README"
git push
10.2
# Crear rama con cambio
git checkout -b feature/prueba-gh-cli
echo "cambio" >> README.md
git add . && git commit -m "feat: test gh cli pr"
git push -u origin feature/prueba-gh-cli
# Abrir PR
gh pr create \
--title "feat: prueba gh CLI" \
--body "PR creado desde la terminal con gh CLI" \
--label "documentation"
# Listar PRs para ver el número
gh pr list
# Cerrar PR (sin merge)
gh pr close 1
10.3
En GitHub web:
- Settings → Branches → Add branch protection rule
- Branch name pattern:
main - Activar: ✅ Require a pull request before merging → Required approvals: 1
- Activar: ✅ Require status checks to pass → añadir el check de CI
- Activar: ✅ Do not allow bypassing the above settings (incluye admins)
- Save changes
Verificación:
git checkout main
echo "test" >> README.md
git add . && git commit -m "test direct push"
git push
# remote: error: GH006: Protected branch update failed for refs/heads/main.
# remote: error: At least 1 approving review is required...
10.4
# .github/CODEOWNERS
# Todos los markdown
*.md @amadorprof
# Carpeta src
src/ @amadorprof
mkdir -p .github
cat > .github/CODEOWNERS << 'EOF'
*.md @amadorprof
src/ @amadorprof
EOF
git add .github/CODEOWNERS
git commit -m "chore: add CODEOWNERS"
git push
Al abrir un PR que modifique un .md, en la sección Reviewers del PR aparecerá @amadorprof solicitado automáticamente.