Migración Hound → reviewdog
Contexto
Desde hace un tiempo estamos pasando los proyectos que usaban Hound para el linting a reviewdog. Hound corría en un servidor hosteado por nosotros y usaba una versión de Hound de cuando el proyecto era completamente open-source. Lamentablemente ciertas partes del proyecto pasaron a ser closed-source por lo que nos quedamos con una versión antigua.
Además, Hound usaba una versión particular de los linters, por lo que al hacer una actualización de rubocop por ejemplo, había que actualizar todos los proyectos para que fueran compatibles, haciendo que la actualización de reglas ocurriera muy esporádicamente.
Reviewdog es una especie de formateador de los outputs de los linters, y se puede correr donde uno quiera. Esto nos permite correrlo en CircleCI y no depende de versiones particulares de los linters, simplemente recibe el output de un linter y reporta a GitHub el comentario correspondiente.
Pasos para migrar un proyecto antiguo
Los proyectos actualmente no cuentan con los linters como dependencias por lo que se deben agregar. Para eso se deben lockear a
devDependencies
delpackage.json
las siguientes librerías:eslint
, sus respectivos plugins comoeslint-plugin-import
oeslint-plugin-vue
ystylelint
.
Por el lado de ruby, se deben agregar al
Gemfile
bajo el grupo:development, :test
todas las gemas relativas al linting, esto esrubocop
y los plugins comorubocop-rspec
,rubocop-rails
, etc.
Nota: rubocop suele introducir breaking changes en cada actualización de minor antes de que lleguen a la versión
1.0
, por lo que se debería dejar la versión especificada al menos como~> 0.82.0
, es decir, fijando el minor pero permitiendo updates al patch.
Copiar las reglas de cada linter a la raíz del proyecto, esto implica los archivos:
.eslintrc.json
,.rubocop.yml
y.stylelintrc.json
. En Potassium están incluidos los archivos, considerando el de rubocop actualizado para ser compatible con la versión0.82
.
Nota: Al terminar este paso ya tenemos los linters con sus reglas en el proyecto, lo siguiente es correr los linters en CircleCI.
Actualizar el archivo
config.yml
incluido en cada proyecto. Para esta actualización hay que basarse en el archivo incluido aquí. En primer lugar el job llamadobuild
se renombra atest
y en segundo lugar se agrega un nuevo job llamadolint
. Este último agrega los pasos necesarios para realizar linting en el proyecto usando caché; se puede copiar entero sin cambiar. Finalmente se agrega una secciónworkflows
que especifica cómo se deben correr ambos jobs, en este caso en paralelo y utilizando un contexto global para el de linting.
**Nota 1: **si no se requiere linting de
eslint
o destylelint
se pueden eliminar los steps correspondientes a cada uno, y si no se va a usar ninguno se pueden eliminar los steps correspondientes a dependencias deyarn
y su caché.**Nota 2: **el contexto llamado
org-global
lo que hace es incluir la variable de entorno necesaria (REVIEWDOG_GITHUB_API_TOKEN
) para que reviewdog reporte a GitHub.**Nota 3: **el job de linting no va a reportar una falla (o una cruz roja) a GitHub en caso de encontrar violaciones, solo va a comentar el PR. Esto se condice con el comportamiento que tenía Hound.
Asumiendo que ya está CircleCI activado en el proyecto, se debe ir a la configuración del proyecto para marcar que solo corra los builds en PRs. Esto es necesario porque reviewdog no reporta nada si no hay un PR en el que hacerlo. Para activar esta configuración ir en los settings del proyecto a la sección
Advanced
. Ahí seleccionarOnly build pull requests
como se ve en la foto.
Nota: Para la rama master igual se van a correr los tests al mergear un PR pero no se reportarán errores de linting.
Última actualización