joselikitfg / proyecto

GNU General Public License v3.0
0 stars 0 forks source link

Linters #11

Open joselikitfg opened 2 months ago

joselikitfg commented 2 months ago

En esta Issue vamos a explicar que son los Linters, cuales estamos utilizando en el proyecto y porqué y alternativas a estos.

joselikitfg commented 2 months ago

Linters

¿Que es un Linter?

Los linters son herramientas muy valiosas para los desarrolladores, ya que contribuyen a mejorar la calidad del código. Logran esto analizando el código fuente para identificar y señalar problemas que pueden provocar errores, vulnerabilidades y posiblemente indiquen problemas más profundos en el código (code smells).

Un linter escanea el código fuente en busca de errores, defectos, problemas de estilo y bloques de construcción cuestionables.

El término "Linter" proviene de los orígenes de una herramienta conocida como "lint", que fue desarrollada inicialmente por Stephen C. Johnson en 1978 en Bell Labs. Originalmente diseñada para analizar código C, esta función sentó las bases para el concepto moderno de linting.

Hoy en día, los linters están disponibles para casi todos los lenguajes de programación y se utilizan para mejorar la calidad y mantenibilidad del código.

Importancia de los Linters

Un linter es una herramienta importante para cualquier desarrollador, ya que simplifica sus tareas y asegura la calidad del código que escribe. Consigue esto identificando y ofreciendo sugerencias para los problemas antes de que se suban a producción. Las capacidades de los linters modernos van más allá de la mera detección de problemas, contribuyendo a mejorar la legibilidad, mantenibilidad y consistencia del código.

Cómo funciona un Linter

Un linter funciona mediante el análisis del código fuente del programa, comparándolo directamente con un conjunto de reglas predeterminadas. Cuando el código se desvía de estas reglas, el linter notifica al usuario sobre el problema. A menudo, el linter se integra con otras herramientas de desarrollo como parte del flujo de trabajo. Las reglas que siguen los linters suelen ser personalizables y, según el linter específico, pueden variar desde comprobaciones amplias y generales hasta evaluaciones más específicas y detalladas del código. Los linters permiten a los desarrolladores mantener las normas de codificación y mejorar la calidad de su código mediante comprobaciones sistemáticas y dinámicas.

Beneficios de los Linters

Los linters desempeñan un papel importante en el desarrollo de software al analizar el código en busca de posibles errores y marcarlos para que el desarrollador los solucione. El resultado es un código limpio: legible, fácilmente comprensible, portable y capaz de adaptarse gracias a su estructura y coherencia. A su vez, este código sigue siendo mantenible, fiable y seguro, cumpliendo con las exigencias de rendimiento. Algunos de los beneficios de utilizar un linter incluye:

  1. Mejora de la calidad del código Los linters detectan y corrigen errores en el código, promueven el cumplimiento de estándares de codificación, mejoran la legibilidad y fomentan las mejores prácticas, educando asi a los desarrolladores, especialmente a los menos experimentados.
  2. Aumento de la velocidad y productividad Los linters mejoran la productividad al ofrecer información en tiempo real durante el desarrollo, evitando así que los problemas se conviertan en desafíos criticos más adelante
  3. Mejora de la colaboración y trabajo en equipo Las normas de codificación facilitan la colaboración y eficiencia en un equipo de desarrollo. Los linters pueden ayudar a los equipos a comprender y utilizar las mejores prácticas y complejidades del lenguaje explicando los problemas del código.
  4. Seguridad La seguridad es un aspecto crítico en cualquier aplicación moderna. Los linters son herramientas vitales para detectar y identificar patrones de código que podrían resultar en vulnerabilidades de seguridad. Pueden ajustarse a normativas específicas, como el OWASP Top 10 o el MISRA C++ 2023, para garantizar que el código cumpla con requisitos y directrices normativos. Al utilizar pautas de codificación segura, los linters señalan el uso de funciones o métodos que representan vulnerabilidades conocidas o están obsoletos, guiando a los desarrolladores hacia alternativas más seguras.
  5. Reducción de costes Gracias a detectar y abordar poroblemas en una etapa temprana, antes de que se conviertan en un problema mayor, los linters pueden reducir tanto el tiempo como los gastos asociados a la depuración

Bibliografía:

https://www.sonarsource.com/learn/linter/

joselikitfg commented 2 months ago

Pre-commit

¿Qué es?

Pre-commit es una herramienta muy útil utilizada en el desarrollo de software para automatizar la ejecución de tareas antes de realizar un commit en un repositorio de control de versiones, como Git. Se integra fácilmente en el flujo de trabajo de desarrollo y puede configurarse para ejecutar una serie de acciones, como linters, pruebas unitarias, formateadores de código, entre otras, antes de que se realice un commit. Esto ayuda a garantizar que el código cumpla con ciertas normas y estándares antes de ser enviado al repositorio, lo que contribuye a mantener la calidad y consistencia del código en un proyecto. Pre-commit utiliza hooks cada vez que se realiza un commit, para señalar automáticamente problemas en el código, como la falta de puntos y comas, espacios en blanco al final y sentencias de depuración. Al señalar estos problemas antes de la revisión del código, permite al revisor centrarse en la arquitectura de un cambio y no perder tiempo con detalles triviales de estilo. Uno de los problemas comunes que Pre-commit abordó al crear más bibliotecas y proyectos era la dificultad para compartir los hooks de pre-commit entre proyectos. Para resolver este problema, se creó Pre-commit, un gestor multi-lenguaje para hooks. Simplemente necesitas especificar el hook que deseas emplear, escrito en cualquier lenguaje, y Pre-commit se encarga de gestionar la instalación y ejecución de cualquier hook antes de cada commit.

Integración con herramientas externas

Pre-commit puede integrarse fácilmente con herramientas externas utilizando los hooks proporcionados por esas herramientas o escribiendo scripts personalizados que se ejecuten como parte de un hook de pre-commit. Esto permite automatizar y mejorar el flujo de trabajo de desarrollo al garantizar que las tareas críticas se realicen de manera sistemática y consistente antes de cada commit.

Comparaciones con herramientas similares

Existen herramientas similares, de las cuales vamos a hablar ahora después, como Husky, lint-staged, y otros. Pre-commit se destaca por su capacidad para gestionar hooks escritos en diferentes lenguajes de programación y su flexibilidad para adaptarse a una variedad de entornos de desarrollo. Además, su comunidad activa y la documentación que tiene lo hace una opción muy popular.

image

https://pre-commit.com/

joselikitfg commented 2 months ago

Husky

¿Qué es?

Husky es una herramienta que se utiliza en el desarrollo de software para automatizar la ejecución de tareas antes de realizar acciones en un repositorio de control de versiones como Git. Funciona mediante la integración de hooks que se ejecutan en respuesta a eventos específicos de Git, como pre-commit. Estos hooks pueden ser scripts o comandos personalizados que realizan acciones como ejecutar linters, pruebas unitarias, formateadores de código, o cualquier otra tarea necesaria para garantizar la calidad y consistencia del código antes de que se envíe al repositorio. Husky se configura mediante un archivo de configuración llamado ".husky.rc", donde se especifican los hooks que se deben ejecutar y las acciones que deben realizar. Entre las características clave de Husky está la capacidad para integrarse fácilmente con npm scripts y su flexibilidad para personalizar acciones según las necesidades del proyecto. Es capaz de ejecutar una variedad de acciones antes de realizar un commit, push u otras acciones en el repositorio, lo que ayuda a garantizar que el código cumple con ciertas normas y estándares antes de ser enviado.

Integración con herramientas externas

Husky puede integrarse con una variedad de herramientas y tecnologías comunes en el desarrollo de software, como linters, formateadores de código, pruebas unitarias. Esto permite automatizar y mejorar el flujo de trabajo de desarrollo al garantizar que las tareas críticas se realicen de manera sistemática y consistente.

Comparaciones con herramientas similares

Husky se destaca por su integración fácil con npm scripts y su popularidad dentro de la comunidad de desarrollo de Node.js

image https://typicode.github.io/husky/

joselikitfg commented 2 months ago

Lint-Staged

¿Qué es?

Lint-staged es una herramienta que se utiliza en el desarrollo de software para ejecutar linters de forma selectiva en archivos que han sido modificados antes de confirmarlos en un repositorio de control de versiones como Git. Funciona integrándose con Git hooks, específicamente con el hook pre-commit. Cuando un usuario realiza un commit, lint-staged se activa automáticamente y ejecuta los linters configurados en los archivos que han sido modificados. Esto permite identificar y corregir problemas en el código antes de enviarlo al repositorio. Se caracteriza por su capacidad de ejecutar linters selectivos en archivos modificados, su integración con Git hooks y su flexibilidad para personalizar las reglas y los linters que se aplican en función de las necesidades del proyecto. Lint-staged se configura mediante un archivo de configuración llamado ".lintstagedrc" o utilizando comandos de línea.

Integración con herramientas externas

Lint-staged se integra fácilmente con otras herramientas comunes en el desarrollo software, como sistemas de control de versiones (Git), editores de código y herramientas de integración continua.

Comparaciones con herramientas similares

Por lo que destaca Lint-Staged es por su capacidad de ejecutar linters selectivos en archivos modificados antes de confirmarlos en el repositorio.

image

joselikitfg commented 2 months ago

CFN-Lint

¿Qué es?

CFN-Lint es una herramienta de código abierto que se utiliza para realizar análisis estático y validar plantillas de AWS CloudFormation o SAM (AWS Serverless Application Model) ya que es una extensión de CloudFormation y también utiliza YAML o JSON. CFN-Lint analiza las plantillas en busca de errores comunes, prácticas recomendadas y posibles problemas de configuración. Identifica errores de sintaxis, verifica la validez de los recursos definidos, y comprueba si se siguen las prácticas recomendadas de AWS. Esta herramienta puede ser integrada en flujos de trabajo de desarrollo como el nuestro para automatizar la validación de las plantillas antes de su despliegue en AWS. Además este proporciona mensajes detallados sobre los problemas encontrados, lo que facilita la identificación y corrección de errores.

Integración con herramientas externas

Cfn-lint se puede utilizar de forma independiente desde la línea de comandos o integrado en pipelines de CI/CD, o como en nuestro caso integrandolo mediante pre-commit, para validar la plantilla cuando realizamos un commit antes de comenzar el CI/CD. También se puede integrar con editores de texto y entornos de desarrollo integrados para proporcionar retroalimentación en tiempo real mientras se editan las plantillas.

Comparaciones con herramientas similares

Existen otras herramientas de validación similates para plantillas de CF (CloudFormation), como lo son AWS CloudFormation Designer y AWS CloudFormation Validator. Esta herramienta destaca por su capacidad de análisis estático exhaustivo y su flexibilidad para personalizar las reglas de validación según las necesidades del proyecto.

image https://github.com/aws-cloudformation/cfn-lint