Mi espacio de desarrollo puede ir conmigo a cualquier parte del mundo que tenga conexión a internet (de banda ancha). Obviamente, es mejor tenerlo todo instalado, que sea arrancar y ponerse en manos a la obra. Pero ¿qué pasa si necesito levantar el entorno de desarrollo en un equipo nuevo? Ya sea porque mi equipo se haya roto, lo he perdido o simplemente esté a kilómetros de donde estoy en este momento. Aquí, tener una serie de buenas prácticas me permite levantar mi entorno de desarrollo (o el de alguien de mi equipo) en tiempo record, y marca la diferencia entre estar parado o poder recuperar el control rápidamente.
[Hoy dejaré de lado la solución de tener todo virtualizado en un servidor y tener mi IDE (editor de código) en el navegador. @TODO escribir artículo sobre entorno de desarrollo virtualizado online].
0.- Documentar todo en el README
Ya sea para recordarme a mí mismo del futuro, o para pasarle el proyecto a un tercero, este es el lugar para explicar no solo de que va el proyecto sino como ponerlo en marcha. Ahí anoto además que dependencias necesita.
Un buen README es un documento de onboarding para nuevos miembros del equipo, y ese mismo puedo ser yo dentro de unos meses. Dejar ahí unas instrucciones claras y concisas: instalar esto, en este orden, configurar estas variables…. y todo listo. Muchos pasos se pueden automatizar con scripts, pero lo que no se pueda se deja anotado ahí.
1.- Repositorios de código online.
Obviamente, lo primero de todo es tener nuestro código versionado replicado fuera de nuestro equipo. En mi caso soy de Git, y tengo mi código en un servicio con repositorios privados. Pero también serviría cualquier otro sistema de versionado en un servidor (puede ser privado) disponible desde internet.
Friendly reminder: Usar un repositorio Git no invalida tener una copia de seguridad del código.
Tener un repositorio es vital para poder continuar por donde lo dejamos, incluso con código que no está terminado y no está corriendo en ninguna parte, quizá estamos aún a medias con algo en una rama. Clonamos y a tirar millas.
Eso si, si estamos en un equipo nuevo tendremos que generar algún sistema de acceso seguro (claves SSH o tokens, mejor evitamos las contraseñas), así que necesitamos poder tener acceso al admin del repo para poder añadirlas.
2.- No depender de la configuración local: Docker
Toda la configuración del entorno debe estar virtualizada. El código se ejecuta en un entorno controlado y parametrizado aislado de la máquina que lo aloja (obviamente la máquina que lo aloja tiene que tener recursos físicos suficientes, pero nos da igual el sistema operativo).
Una buena configuración de docker-compose nos permite tener múltiples servicios que se levantan con un solo comando: docker-compose up -d
Para poder correr múltiples servicios web en una sola máquina (y acceder a ellos) uso un proxy inverso: nginx-proxy. Esto me evita configurar puertos, cada proyecto tiene sus subdominio local (hay que configuarar el hosts/etc de turno). [@TODO escribir un artículo sobre como configurarlo]
3.- Creación de la base de datos: semillas y datos de prueba.
Esta parece una tontería, pero a la larga te da la tranquilidad. Una base de datos con datos controlados que tiene la información básica para que funcione la aplicación recién instalada (usuarios por defecto, configuraciones iniciales…), y luego datos de desarrollo que simulan y cubren variedad de casos de uso.
Si eres de los que desarrolla con la tranquilidad de un test que respalde su código, seguro que esta base la tienes cubierta. Disponer de una base de datos semilla coherente te asegura que los tests son consistentes entre máquinas y desarrolladores.
Pienso en estos seeds como un «snapshot mínimo» del proyecto: una pequeña dosis de información que hace que todo funcione a la primera.
4.- Configuración de entorno centralizada: .env
La configuración de cada proyecto es un mundo, cada framework y proyecto tiene sus peculiaridades, pero poder tener un fichero de texto plano en la raíz. Ahí van parámetros particulares del entorno. Todos los frameworks con los que he trabajado siempre les pongo una manera de acceder a un dotEnv.
Dejo un fichero .env.example con todas las variables enunciadas y en ocasiones dejo incluso ya rellena ahí la configuración del entorno de desarrollo. Así, solo es copiar el fichero, renombrarlo a .env y cambiar lo que sea necesario (p.e. ciertos datos sensibles que no se pueden dejar a la vista, o datos que cambian por cada desarrollador / entorno).
Con estas prácticas, y solo dependiendo del ancho de banda (para descargar el proyecto y sus dependencias y las imágenes de docker) puedo levantar un entorno de desarrollo en minutos, en lugar de horas.
¿Que otra buena práctica puedo añadir para que todo funcione como la seda?