El Blog de Webcu

Configurando mi entorno de desarrollo en Exercism

October 25, 2019

Organizar nuestro entorno de desarrollo de una manera que nos resulte sencilla, práctica y eficiente, nos permite concentrarnos mejor en resolver los problemas y por tanto aumentar nuestra productividad.

Exercism está organizado de una manera que me parece practica. Tenemos caminos (tracks) asociados a un lenguaje de programación. Dentro de estos camino tenemos ejercicios principales (core) y ejercicios opcionales. Estos a su vez tienen diferentes grados de dificultad y tratan diferentes aspectos del lenguaje de programación.

La consola de comandos de Exercism

Exercism tiene una consola de comando, que te permite descargar los ejercicios y subir las soluciones desde la línea de comandos. Desde el año pasado trato siempre de utilizar Docker en todos los proyectos en que trabajo. Cuando comencé a practicar en Exercism fue igual. Inicialmente intente instalar la consola de Exercism en la imagen que estaba creando. Después de varios intentos y errores, me di cuenta que no era realmente necesario. Es mejor simplemente instalarla en el sistema operativo que utilizamos. Hay una guía muy util que explica como instalarla en los diferentes sistemas operativos: Cli Walkthrough.

Imagen Docker

Ahora que ya tenía la consola de comando instalada, el segundo paso fue crear una imagen para mis containers. Este es el contenido de mi Dockerfile:

FROM node:10

# Install Global npm dependencies
ENV NPM_CONFIG_PREFIX=/home/node/.npm-global

# optionally if you want to run npm global bin without specifying path
ENV PATH=/home/node/.npm-global/bin:$PATH

Creó una imagen a partir de la última versión estable de node y configuró npm para que sea fácilmente accesible en mis containers. El problema era que por cada ejercicio estaba creando un container y este a la vez estaba creando una imagen. Entonces decidí publicar la imagen que estaba utilizando en DockerHub, para de esa forma no tener que crearla para cada container. Inicialmente intente hacerlo con el comando push, pero me daba un error que no podía loguearme en DockerHub. El problema era que yo utilizo WSL Ubuntu y este no utiliza X11, se resuelve con: https://github.com/docker/compose/issues/6023#issuecomment-419792269

Después experimentando un poco con DockerHub, me di cuenta que era mucho más eficiente crear un repositorio allí y relacionarlo con uno en Github, como explican en esta guía. De esa manera cada vez que hacemos modificaciones a nuestro Dockerfile en Github, se va a generar automáticamente una nueva versión de nuestra imagen en DockerHub. Hay muchas opciones de configuración, hay que valorar que resulta práctico para cada proyecto. Si no quieren publicar su imagen en DockerHub y/o su Dockerfile en Github hay opciones para configurar su propio registro de imágenes Docker, como explica este artículo. Estos son los links a la imagen Docker y el repositorio que cree:

Container

Este es el fichero docker-compose.yaml que utilizó para crear los container

version: '3'

services:
  node:
    image: webcu/exercism-js:latest
    volumes:
      - .:/src
      - node_modules:/src/node_modules
    working_dir: /src
    command: tail -f /dev/null

volumes:
  node_modules:
    external: true

Antes de utilizar docker-compose debemos haber creado el volumen node_modules. De esa manera podemos reutilizar los módulos que ya han sido instalados, sin necesidad de hacer otro npm install, lo que nos salva bastante tiempo y evita problemas con symlinks en Windows.

Al comienzo descargaba un nuevo ejercicio, copiaba el archivo docker-compose.yaml y desde WSL iba a la carpeta del ejercicio y ejecutaba los comandos:

  • docker-compose up -d
  • docker-compose exec node bash

Dentro del container ejecutaba los test con el comando

  • npm test

Así funcionaba bien pero aun creaba un container por cada ejercicio y finalmente todos usan las mismas dependencias. Entonces decidí hacer una pequeña modificación para crear un solo container para el camino de JS. Copie los fichero docker-compose.yaml y package.json dentro de la raíz del camino de JS en vez de copiarlo dentro de cada ejercicio. De esa manera funcionaba bien el container, pues instalaba todas las dependencias y tenía acceso a todos los ejercicios que había descargado, pero los test no funcionaban. Yo no estoy muy familiarizado con la configuración de Jest, pero por suerte resulto mucho más sencillo de lo que esperaba la solución del problema. Lo único que necesite hacer fue copiar el fichero babel.config.js a la raíz del camino de JS y voila, problema resuelto. Ahora puedo ejecutar los tests de todos los ejercicios, o solamente los de uno en específico.

Referencias


Jorge Glez

Escrito por Jorge Glez. Un ser humano con defectos y virtudes que intenta ser mejor cada día. Twitter