Skip to main content

Creación de un proceso de revisión optimizado con Copilot

Automatice las revisiones con Copilot para optimizar y mejorar el proceso de revisión.

¿Quién puede utilizar esta característica?

revisión de código Copilot is available for Copilot Pro, GitHub Copilot Pro+, Copilot Business and Copilot Enterprise. See Copilot plans.

Introducción

Las revisiones de código son más eficaces cuando se dedica menos tiempo a detalles de implementación menores, como las convenciones de nomenclatura y estilo, y en su lugar se centran en el diseño de nivel superior, la resolución de problemas y la funcionalidad que satisface las necesidades del usuario.

En este artículo, mostraremos cómo las revisiones automáticas de Copilot pueden ayudar a optimizar el proceso de revisión para que dedique menos tiempo a cambios menores y más tiempo en la resolución de problemas matizados y una comprensión más profunda de la implementación que no es simplemente adecuada, sino que satisface las necesidades del usuario de forma eficaz.

1. Mejorar la calidad de la revisión de Copilot

          revisión de código Copilot puede proporcionar revisiones automatizadas para todas las solicitudes de incorporación de cambios en el repositorio y hacer que la revisión sea más eficaz detectando los cambios que no desee en el código. Cuando se empareja con instrucciones personalizadas, revisión de código Copilot es más eficaz porque puede proporcionar respuestas adaptadas a la forma en que trabaja el equipo, las herramientas que usa o los detalles del proyecto. 

Entre los procedimientos recomendados para escribir instrucciones personalizadas se incluyen:

  • Encabezados distintos
  • Puntos de viñeta
  • Instrucciones cortas y directas

Veamos un ejemplo. Si va a crear un sistema de procesamiento de pedidos mediante Python, las instrucciones personalizadas pueden incluir procedimientos de codificación, rendimiento y formato específicos de Python, así como instrucciones directamente relevantes para el proyecto. En el ejemplo siguiente se muestra el aspecto de algunas de las líneas de las instrucciones personalizadas.

## Repository context
- This repository implements an order processing system (order intake, payment, fulfillment) where correctness, security, and auditability are critical. 

## Style and conventions
- Follow the PEP 8 and PEP 257 style guide for Python.
- Use clear, domain-relevant names (orders, payments, inventory, customers, shipments).
- Prefer small, focused functions and methods with clearly defined responsibilities.

## Secure coding 
- Verify proper input validation and sanitization.
- Review authentication and authorization logic.

## Error handling guidelines
- Handle timeouts and network errors gracefully.
- Ensure failures are logged with enough detail for debugging.

## Order processing context
- Ensure order creation, payment handling, and updates are idempotent to avoid duplicate orders or duplicate charges.
- Validate and normalize all order, payment, and customer data before persisting or acting on it.
- Do not log or persist sensitive data (passwords, raw payment details, full identifiers) without hashing, encryption, or redaction.
- Call out obvious performance issues in core order workflows (e.g., N+1 queries, per-order synchronous network calls) and suggest simpler, more efficient alternatives.

## Review style
- Be concise, specific and actionable.
- Explain the "why" behind recommendations using bullet points.

En la sección siguiente, veremos cómo nuestras instrucciones personalizadas de ejemplo pueden afectar positivamente los comentarios de revisión que Copilot proporciona para una solicitud de incorporación de cambios.

2. Automatizar las revisiones para abordar las convenciones de estilo y el rendimiento

Cuando revisión de código Copilot se habilita automática, Copilot revisará automáticamente un pull request una vez que esté fuera del modo borrador.

Imagina que envías un pull request que incluye la siguiente función para actualizar el inventario en el sistema de procesamiento de pedidos.

def notify_inventory(product_id, quantity):
    requests.post("http://inventory-service/update", json={"product_id": product_id, "quantity": quantity})

Aunque esto es funcional, carece de claridad y solidez. La intención de los tipos es implícita, no hay ninguna cadena de documentos y no incluye el control de errores ni el registro, lo que hace que no esté claro si la notificación ha funcionado realmente.

          Copilot revisaría el código y podría hacer el siguiente comentario y sugerencia de código.

Nota:

La respuesta siguiente es un ejemplo. Las respuestas de Chat de Copiloto no son deterministas, por lo que puedes obtener una respuesta diferente a la aquí mostrada.

Missing error handling for network calls

The notify_inventory function makes a synchronous network call without any error handling for timeouts, connection failures, or non-200 responses.

Why this matters:

- Network failures will cause unhandled exceptions and crash the order processing flow
- Orders could be marked as CONFIRMED but inventory never gets updated
- This violates the requirement to "handle timeouts and network errors gracefully"
- Failures won't be logged with enough detail for debugging

Recommendation: Add proper error handling with timeout and logging:
def notify_inventory(product_id: str, quantity: int) -> bool:
    """Notify the inventory service of order placement.

    Args:
        product_id: The product identifier.
        quantity: The quantity ordered.

    Returns:
        True if the notification succeeded; False otherwise.
    """
    try:
        response = requests.post(
            "http://inventory-service/update",
            json={"product_id": product_id, "quantity": quantity},
            timeout=5,
        )
        response.raise_for_status()
        logger.info(
            "Inventory notified for product %s, quantity %d (status %d)",
            product_id,
            quantity,
            response.status_code,
        )
        return True
    except requests.exceptions.Timeout:
        logger.error(
            "Timeout notifying inventory for product %s, quantity %d",
            product_id,
            quantity,
            exc_info=True,
        )
    except requests.exceptions.RequestException:
        logger.error(
            "Failed to notify inventory for product %s, quantity %d",
            product_id,
            quantity,
            exc_info=True,
        )
    return False

La respuesta de Copilot sigue las instrucciones personalizadas en su recomendación. En este ejemplo, sigue las instrucciones de estilo PEP 8 y 257 para Python y sugiere una mejora para controlar mejor los tiempos de espera y el registro de errores, al tiempo que explica concisamente el razonamiento detrás de las sugerencias.

Nota:

Revise cuidadosamente las sugerencias de Copilot antes de aceptar y comprometerse.

Los comentarios de revisión automática como estos le ayudan a crear su propia comprensión al codificar o pueden ayudarle a centrarse y restringir los comentarios proporcionados a otros usuarios al revisarlos.

3. Marcar vulnerabilidades de seguridad y corregirlas

A continuación, imagine que se le ha encargado mejorar cómo se almacenan las contraseñas en el sistema de procesamiento de pedidos. Envía una solicitud de incorporación de cambios con un código que consideró que aplicaba hash suficiente a las contraseñas de usuario para protegerlas.

def get_password_hash(password: str, salt: str) -> str:
    """Hash a password with the given salt using SHA-256.

    Returns the hexadecimal representation of the hashed password.
    """
    return hashlib.sha256((password + salt).encode()).hexdigest()

class User:
    """Represents a user in the order processing system."""

    def __init__(self, username: str, password: str, salt: str):
        """Initialize a User with username, password, and salt.

        The password is hashed and stored for authentication.
        """
        self.username = username
        self.salt = salt
        self.password_hash = get_password_hash(password, self.salt)

    def verify_password(self, password: str) -> bool:
        """Verify a plain-text password against the stored hash."""
        return get_password_hash(password, self.salt) == self.password_hash

Sin embargo, en este ejemplo, el uso de SHA-256 no es aceptable, ya que no es lo suficientemente costoso de cálculo como para proteger las contraseñas de usuario.

Aunque revisión de código Copilot puede hacer sugerencias de procedimientos recomendados de seguridad, Autofix de Copilot para code scanning lo lleva un paso más allá. Aprovechar las funcionalidades de code scanning junto con CodeQL para realizar análisis del código en un repositorio GitHub e identificar vulnerabilidades de seguridad y errores de codificación. Autofix de Copilot puede entonces sugerir correcciones para las alertas, permitiéndole prevenir y reducir vulnerabilidades de forma más eficaz.

Por ejemplo, Autofix de Copilot puede hacer el siguiente comentario en el código.

Using SHA-256 for password hashing is insecure for authentication systems. SHA-256 is designed to be fast, making it vulnerable to brute-force attacks. 

To fix the problem, use a password-specific hashing algorithm like bcrypt, scrypt, or argon2 (e.g., `argon2-cffi` from the PyPI package) which are designed to be slow and include built-in salting mechanisms.
          Autofix de Copilot también realizará sugerencias de código para una posible corrección de la vulnerabilidad para que pueda revisarla. En este caso, puede realizar sugerencias de código, como las siguientes, para importar un paquete y actualizar el código relacionado con el hash de la contraseña. 
from argon2 import PasswordHasher
def get_initial_hash(password: str):
    ph = PasswordHasher()
    return ph.hash(password)

def check_password(password: str, known_hash):
    ph = PasswordHasher()
    return ph.verify(known_hash, password)

Nota:

  • Compruebe y valide siempre los cambios Copilot que sugiere antes de aceptarlos.
  • En este ejemplo, revisión de código Copilot también puede resaltar la necesidad de generar sales únicas.

Como puede ver, la identificación de vulnerabilidades automáticamente, junto con sugerencias para corregirlas, le ayuda a hacer que la seguridad sea una prioridad. Autofix de Copilot le permite centrarse en comprender la codificación segura y en las correcciones que funcionan mejor para el código base y el proyecto.

Revisiones optimizadas con Copilot

Los comentarios de revisión automática le ayudan a optimizar las revisiones y proteger el código de forma más eficaz, independientemente del nivel de experiencia.

  • Las instrucciones personalizadas ayudaron a refinar las respuestas de revisión de código Copilot para que fueran específicas de nuestro proyecto y las necesidades del usuario, y también vimos cómo podemos adaptar la cantidad de explicaciones que Copilot proporciona en los comentarios.
  •         revisión de código Copilot  nos ayudó a mejorar rápidamente el registro de errores y comprender por qué importaba. 
    
  •         Autofix de Copilot para code scanning nos ayudó a evitar el uso de un método de hash de contraseña inadecuado y proteger los datos del usuario.   
    

Pasos siguientes

Para que las revisiones sean más eficientes y eficaces usando las funcionalidades de revisión de Copilot, empiece por seguir estos pasos.

  1. Cree instrucciones personalizadas específicas del proyecto y el repositorio. Escriba su propio o tome inspiración de nuestra biblioteca de ejemplos. Consulta Instrucciones personalizadas.
  2. Para habilitar la opción automática revisión de código Copilot para el repositorio, consulte Configuración de la revisión automática de código mediante GitHub Copilot.
  3. Para configurar Autofix de Copilot para su repositorio, necesitará habilitar code scanning. Una vez que se habilita code scanning con el análisis de CodeQL, Autofix de Copilot está habilitado de forma predeterminada. Para obtener la configuración más sencilla, consulte Establecimiento de la configuración predeterminada para el examen del código.

Lectura adicional

Para profundizar en la revisión del código generado por IA, consulte Revisión del código generado por IA.