Open joselikitfg opened 2 months ago
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.
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.
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.
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:
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.
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.
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.
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.
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.
Husky se destaca por su integración fácil con npm scripts y su popularidad dentro de la comunidad de desarrollo de Node.js
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.
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.
Por lo que destaca Lint-Staged es por su capacidad de ejecutar linters selectivos en archivos modificados antes de confirmarlos en el repositorio.
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.
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.
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.
En esta Issue vamos a explicar que son los Linters, cuales estamos utilizando en el proyecto y porqué y alternativas a estos.