🌍 Idiomas: 🇪🇸 Español | 🇬🇧 English | 🇫🇷 Français
¡Hola developer 👋🏻! Este repositorio implementa un flujo en Azure Pipelines 🚀 que integra GitHub Copilot CLI 🤖 para revisar automáticamente Pull Requests e identificar problemas potenciales en el código. El código fue utilizado para mi vídeo: 🚀 Lleva Azure DevOps al siguiente nivel con GitHub Copilot CLI 🤖
- ✅ Automatizar la revisión de código mediante IA (GitHub Copilot)
- ✅ Integrar GitHub Copilot CLI con Azure DevOps
- ✅ Analizar Pull Requests automáticamente en cada cambio
- ✅ Identificar problemas potenciales de seguridad, rendimiento y calidad
- ✅ Publicar comentarios de revisión automáticos en las PRs
El pipeline se activa automáticamente cuando se crea o actualiza una Pull Request y realiza el siguiente flujo:
- 📋 Obtiene las diferencias del PR - Descarga los cambios usando Azure DevOps API
- 📁 Descarga archivos modificados - Organiza los archivos por rama (origen y destino)
- 🤖 Ejecuta GitHub Copilot CLI - Analiza el código con IA para identificar problemas
- 💬 Publica comentarios - Crea comentarios automáticos en la PR con los hallazgos
- 📦 Genera artefactos - Guarda el análisis completo para referencia
- Azure DevOps - Gestión de Pull Requests y pipelines
- GitHub Copilot CLI - Análisis automático de código con IA
- Bash Scripts - Automatización y orquestación
- Node.js 22.x - Runtime para Copilot CLI
- Azure Pipelines YAML - Definición del flujo de trabajo
├── azure-pipelines.yml # Definición del pipeline
├── templates/
│ └── run-script.yml # Template reutilizable para ejecutar scripts
├── scripts/ # Scripts de automatización
│ ├── get-pr-diff.sh # Obtiene diferencias del PR
│ ├── download-pr-files.sh # Descarga archivos modificados
│ ├── analyze-with-copilot.sh # Analiza con GitHub Copilot
│ ├── post-pr-comment.sh # Publica comentarios en la PR
│ ├── get-and-download-pr-files.sh # Wrapper: diff + descarga
│ ├── complete-pr-analysis.sh # Flujo completo: diff + descarga + análisis
│ └── example-usage.sh # Ejemplos de uso
└── README.md # Este archivo
AZURE_DEVOPS_EXT_PAT- Personal Access Token de Azure DevOps con permisos de Code (Read/Write)MODEL- Modelo de lenguaje a utilizar (ej. claude-sonnet-4)COPILOT_VERSION- Versión de Copilot CLI a instalar (ej. latest o versión específica)
El pipeline ejecuta los siguientes pasos de forma automática cuando se crea o actualiza una PR:
Comando: 📋 Show PR Information
Imprime información de debug en los logs:
- Repository URI (URL del repositorio)
- PR # (número de la PR)
- Source Branch (rama con los cambios)
- Target Branch (rama destino del merge)
- Source Commit (commit actual)
- Build Repository y Commit
- Directorios de trabajo (Analysis Dir, Diff File)
Comando: ⚙️ Setup Node.js 22.x
- Instala Node.js versión 22.x en el agente de build
- Necesario porque Copilot CLI es una herramienta Node
Comando: 🔍 Detect NPM Global Path
NPM_PREFIX=$(npm config get prefix)- Obtiene la ruta donde npm instala paquetes globales (ej:
/usr/local/lib/node_modules) - Guarda esa ruta en la variable
NPM_GLOBAL_PATHpara usar en el cache
Comando: 📦 Cache Global NPM Packages
- Clave de cache:
npm-global | OS | copilot | COPILOT_VERSION - Ruta cacheada: La ruta global de NPM del paso anterior
- Beneficio: Builds posteriores usan el cache sin re-descargar @github/copilot (ahorra 30-60 segundos)
Comando: 📦 Install Copilot CLI
if ! command -v copilot &> /dev/null; then
npm install -g @github/copilot@$(COPILOT_VERSION)
else
echo "✅ @github/copilot already installed (from cache)"
fi- Verifica si copilot ya está instalado (desde cache)
- Si no está, lo instala:
npm install -g @github/copilot@latest - Si está en cache, salta la descarga
Comando: 🔍 Get PR Differences
Ejecuta: scripts/get-pr-diff.sh con:
./scripts/get-pr-diff.sh \
"$(System.PullRequest.SourceRepositoryUri)" \
"$(System.PullRequest.SourceBranch)" \
"$(System.PullRequest.TargetBranch)" \
"$(AZURE_DEVOPS_EXT_PAT)" \
"$(DIFF_FILE)"Qué hace:
- Llama a Azure DevOps REST API
- Obtiene todas las diferencias entre ramas (archivos añadidos, modificados, eliminados)
- Guarda resultado en JSON:
$(Build.ArtifactStagingDirectory)/pr-diff.json
Comando: 📁 Download Modified Files
Ejecuta: scripts/download-pr-files.sh con:
./scripts/download-pr-files.sh \
"$(DIFF_FILE)" \
"$(System.PullRequest.SourceRepositoryUri)" \
"$(System.PullRequest.SourceBranch)" \
"$(System.PullRequest.TargetBranch)" \
"$(AZURE_DEVOPS_EXT_PAT)" \
"$(ANALYSIS_DIR)"Qué hace:
- Lee el archivo JSON del diff (paso anterior)
- Descarga archivos en 2 directorios organizados:
$(ANALYSIS_DIR)/source/- Archivos de la rama fuente (con cambios)$(ANALYSIS_DIR)/target/- Archivos de la rama destino (sin cambios)
- Mantiene la estructura de carpetas original
Comando: 🤖 Analyze with GitHub Copilot CLI
Ejecuta: scripts/analyze-with-copilot.sh con:
./scripts/analyze-with-copilot.sh "$(ANALYSIS_DIR)/source"Qué hace:
- Ejecuta copilot CLI con modelo
claude-sonnet-4(configurable) - Analiza los archivos descargados buscando problemas:
- 🔒 Seguridad - Vulnerabilidades, acceso no autorizados, validación
- ⚡ Rendimiento - Bucles ineficientes, operaciones costosas
- 🧹 Código Limpio - Refactoring, nombres variables, duplicación
- 📝 TypeScript - Tipado, interfaces, tipos genéricos
- 🐛 Bugs - Lógica errónea, null checks, edge cases
- Genera comentarios Markdown:
$(ANALYSIS_DIR)/source/pr-comments/
Comando: 📋 Extract PR Info
Qué hace:
REPO_URI="$(System.PullRequest.SourceRepositoryUri)"
# Extrae: https://dev.azure.com/returngisorg/GitHub%20Copilot%20CLI/_git/ReviewerAgent
ORG="returngisorg" # Organización
PROJECT="GitHub Copilot CLI" # Proyecto
REPO="ReviewerAgent" # Repositorio
PR_ID="123" # ID de la PR- Parsea la URL del repositorio
- Extrae componentes necesarios para la API de Azure DevOps
- Guarda en variables:
PR_ORG,PR_PROJECT,PR_REPO,PR_NUM
Comando: 💬 Publish Comment on PR
Ejecuta: scripts/post-pr-comment.sh con:
./scripts/post-pr-comment.sh \
"$(ANALYSIS_DIR)/source/pr-comments" \
"$(PR_ORG)" \
"$(PR_PROJECT)" \
"$(PR_REPO)" \
"$(PR_NUM)" \
"$(AZURE_DEVOPS_EXT_PAT)"Qué hace:
- Lee los comentarios generados por Copilot (paso 8)
- Conecta a Azure DevOps API usando PAT
- Publica comentarios directamente en la PR
- Resultado: Los desarrolladores ven en la PR exactamente qué problemas encontró Copilot
Comando: 📦 Publish Complete Analysis as Artifact
Qué hace:
- Publica toda la carpeta
$(Build.ArtifactStagingDirectory)como artefacto - Nombre del artefacto:
pr-analysis-complete - Contenido descargable:
pr-diff.json- Diferencias completas en formato JSONpr-analysis/source/- Todos los archivos analizadospr-analysis/source/pr-comments/- Comentarios generados- Logs completos de ejecución
Beneficio: Los usuarios pueden descargar y revisar el análisis completo desde Azure Pipelines
El pipeline ejecuta los siguientes pasos de forma automática cuando se crea o actualiza una PR:
- 📋 Mostrar Información del PR - Imprime datos de la PR (repositorio, rama, commit)
- ⚙️ Setup Node.js 22.x - Instala Node.js para Copilot CLI
- 🔍 Detectar Ruta NPM - Localiza la ruta global de NPM
- 📦 Cache de Paquetes NPM - Cachea paquetes globales para acelerar ejecuciones futuras
- 📦 Instalar Copilot CLI - Instala @github/copilot en la versión especificada
- 🔍 Obtener Diferencias del PR - Extrae los cambios usando Azure DevOps API
- 📁 Descargar Archivos Modificados - Descarga archivos de ambas ramas (origen y destino)
- 🤖 Analizar con GitHub Copilot - Ejecuta Copilot para revisar el código
- 📋 Extraer Información del PR - Obtiene datos como organización, proyecto, repositorio e ID del PR
- 💬 Publicar Comentario en PR - Publica los hallazgos como comentario en la PR
- 📦 Publicar Artefactos - Guarda el análisis completo como artefacto de build
Pull Request Created/Updated
↓
Show PR Information
↓
Setup Node.js 22.x
↓
Detect NPM Global Path
↓
Cache Global NPM Packages
↓
Install Copilot CLI
↓
Get PR Differences
(Azure DevOps API)
↓
Download Modified Files
↓
Analyze with Copilot
(Identifica problemas)
↓
Extract PR Info
(Org, Proyecto, Repo, PR ID)
↓
Publish Comment on PR
↓
Publish Artifacts
↓
✅ Review Complete
-
Azure DevOps con permisos para:
- Crear pipelines
- Configurar variables de pipeline
- Acceder a Pull Requests
-
GitHub Account con:
- Acceso a GitHub Copilot
- Personal Access Token con permisos de Copilot
-
Agente de Build con:
- Node.js 18.x o superior
- Git
- Bash
Crea un Variable Group llamado GitHub Copilot CLI con las siguientes variables:
Variables Requeridas:
AZURE_DEVOPS_EXT_PAT: Personal Access Token de Azure DevOps con permisos para:- Code (Read): Para leer información de PRs y archivos modificados
- Pull Request (Contribute): Para crear comentarios en PRs
Instrucciones para crear el PAT de Azure DevOps:
- Ve a tu perfil de usuario en Azure DevOps (esquina superior derecha)
- Selecciona "Personal access tokens"
- Haz clic en "New Token"
- Configura:
- Name: "ReviewerAgent Pipeline"
- Organization: Tu organización
- Expiration: Según tus políticas de seguridad
- Scopes: Selecciona "Code" (Read) y "Pull Request" (Contribute)
- Copia el token generado y guárdalo como
AZURE_DEVOPS_EXT_PATen el Variable Group
Importante: Marca la variable como "Secret" para proteger el token
- En tu proyecto de Azure DevOps, ve a Pipelines → New Pipeline
- Selecciona tu repositorio
- Elige "Existing Azure Pipelines YAML file"
- Selecciona el archivo
azure-pipelines.yml - Guarda la pipeline
En el archivo azure-pipelines.yml, puedes configurar:
variables:
- group: "GitHub Copilot CLI"
- name: MODEL
value: claude-sonnet-4 # Cambia el modelo según tu preferencia
- name: COPILOT_VERSION
value: "latest" # o especifica una versión fija como "0.0.339"Modelos disponibles:
claude-sonnet-4(recomendado)gpt-4oo1-previewo1-mini
Obtiene las diferencias de un Pull Request usando la API de Azure DevOps.
Parámetros:
SOURCE_REPO_URI: URI del repositorioSOURCE_BRANCH: Rama fuenteTARGET_BRANCH: Rama destinoPAT: Personal Access TokenOUTPUT_FILE: Archivo de salida
Uso:
./scripts/get-pr-diff.sh \
'https://user@dev.azure.com/org/project/_git/repo' \
'refs/heads/feature-branch' \
'refs/heads/main' \
'your-pat-token' \
'/path/to/output.json'Descarga los archivos modificados en un PR, organizándolos en directorios temporales por rama.
Parámetros:
DIFF_FILE: Archivo de diff JSONSOURCE_REPO_URI: URI del repositorioSOURCE_BRANCH: Rama fuenteTARGET_BRANCH: Rama destinoPAT: Personal Access TokenOUTPUT_DIR: Directorio de salida
Uso:
./scripts/download-pr-files.sh \
'/path/to/diff.json' \
'https://user@dev.azure.com/org/project/_git/repo' \
'refs/heads/feature-branch' \
'refs/heads/main' \
'your-pat-token' \
'/path/to/output-dir'Analiza archivos usando GitHub Copilot CLI y genera un comentario de revisión de PR.
Parámetros:
SOURCE_DIR: Directorio con archivos descargados
Uso:
./scripts/analyze-with-copilot.sh '/path/to/downloaded/files'Publica comentarios de revisión en Pull Requests de Azure DevOps.
Parámetros:
COMMENT_DIR: Directorio con comentarios a publicarORG: Organización de Azure DevOpsPROJECT: Proyecto de Azure DevOpsREPO: RepositorioPR_ID: ID del Pull RequestPAT: Personal Access Token
Uso:
./scripts/post-pr-comment.sh \
'/path/to/comments' \
'your-org' \
'your-project' \
'your-repo' \
'123' \
'your-pat-token'Script completo que combina la obtención del diff y descarga de archivos.
Uso:
./scripts/get-and-download-pr-files.sh \
'https://user@dev.azure.com/org/project/_git/repo' \
'refs/heads/feature-branch' \
'refs/heads/main' \
'your-pat-token' \
'/path/to/output-dir'Script que ejecuta todo el flujo: obtener diff, descargar archivos y analizar con Copilot.
Uso:
./scripts/complete-pr-analysis.sh \
'https://user@dev.azure.com/org/project/_git/repo' \
'refs/heads/feature-branch' \
'refs/heads/main' \
'your-pat-token' \
'/path/to/analysis-dir'Script de demostración que muestra cómo usar todos los componentes.
El proyecto utiliza templates de Azure DevOps para mejorar la mantenibilidad:
templates/run-script.yml: Template genérico para ejecutar scripts bash
- Simplifica la invocación de scripts
- Maneja errores automáticamente
- Propaga variables de entorno necesarias
- Permite personalizar el directorio de trabajo
Uso del template:
- template: templates/run-script.yml
parameters:
script: mi-script.sh
args: '"arg1" "arg2"'
displayName: 🔧 Mi Paso
workingDirectory: $(Build.SourcesDirectory)La pipeline implementa cache de paquetes NPM globales para optimizar tiempos:
- Detecta automáticamente la ruta de NPM global
- Cachea instalaciones de
@github/copilot - Reduce tiempo de instalación en builds posteriores