Usualmente, escuchamos hablar de control de versiones y nos viene a la mente alguno de estos tres grandes exponentes: GitHub, Gitlab o Bitbucket. Igualmente, algunos de nosotros que hemos estados más expuestos al mundo del desarrollo escuchamos sobre SVN, Git, o Mercurial.
En esta serie de entradas, enfocaremos nuestros esfuerzos en Git, que es uno de los software de control de versiones más populares y potentes de nuestro tiempo.
Servicios de alojamiento
Usualmente, cuando comenzamos a usar Git, es necesario buscar un alojamiento de repositorios remotos. Es ahí donde pensamos en GitHub o Gitlab, ya que son los más sugestivos. Por lo tanto, toma en cuenta que GitHub o Gitlab son como alojamientos para nuestros repositorios con una funcionalidad adicional a criterio de los desarrolladores de dichos alojamientos. Puede que una comparación cercana sea como el Google Drive o Dropbox para nuestros repositorios
Enlistemos puntualmente algunos repositorios:
- Gitlab: nos enfocaremos fuertemente en esto en Klooid, ya que es nuestro favorito. Permite tener grupos de repositorios, multiples usuarios, CI/CD, repositorios privados ilimitados, entre otros.
- Github: recientemente permite tener repositorios privados y tiene CI/CD integrado. Igualmente, permite tener colaboración entre múltiples usuarios.
- Bitbucket: es más restrictivo. Permite igualmente tener equipos y repositorios privados. Sin embargo, recién inauguraron el CI/CD y otras integraciones interesantes.
¿Por qué debemos usar Git?
En general, quizás la pregunta sea ¿por qué tenemos que usar un control de versiones? La respuesta es bastante amplia en favor de dejar de archivar nuestros proyectos localmente o usar un simple alojamiento para archivos. Es casi imposible pensar ahora en un desarrollo profesional sin control de versiones y Git se ha vuelto un must en nuestra vida de desarrolladores.
Flujo de desarrollo controlado
Usando control de versiones, es posible ordenar el desarrollo de una aplicación, tratando de cómo si se tratara de armar un barco con bloques de Lego. A esa aplicación podemos irle añadiendo funcionalidades, como el esqueleto, la autenticación de usuarios, el dashboard, entre otros. Cada una de estas funcionalidades son añadidas de forma incremental al proyecto.
En la teoría, cada funcionalidad puede considerarse un nuevo branch o etapa en nuestro desarrollo y es posible ir a un punto anterior en caso de una ruptura del código. Inclusive, es un hecho de que queremos tener una versión estable y funcional, y eso se puede lograr con Git de una forma muy fácil y sin tener replicación de archivos.
Desarrollo colaborativo
Git permite a un equipo completo a trabajar de forma simultánea sobre el mismo proyecto. Esto hace que incremente la productividad en tu empresa o equipo de desarrollo. Cada miembro puede trabajar sobre el último código estable del proyecto y añadiendo diversas funcionalidades en paralelo. No obstante, la coordinación de los miembros también es una labor interesante y a veces desafiante.
Redundancia del código
Sí. A alguno le ha pasado que la computadora se daña y todo el avance de meses de un proyecto se pierde. Con Git y repositorios remotos, esto no va a ser un problema, ya que cada desarrollador contará con una copia actualizada del proyecto.
Continuous integration/deployment
La integración y despliegue continuo ha sido una tendencia reciente y es, quizás, de las mejores prácticas en desarrollo de proyectos de software/hardware.
El desarrollo continuo garantiza que el proyecto está constantemente recibiendo updates sobre nuevos features y reparaciones de bugs. Igualmente, esto añadido a que el código deberá cumplir con algunos criterios para garantizar la estabilidad del mismo. En general, el proceso de continuous integration son:
- El código está versionado en un repositorio: esto garantiza revertir cambios más fácilmente.
- El repositorio está alojado remotamente: podemos usar Gitlab para esto.
- El código tiene un sistema de construcción: para compilarlo, construirlo e instalarlo. En Python, solemos usar setuptools, en NodeJS npm, en C++ y Rust meson, entre otros.
- El código tiene la capacidad de probarse durante construcción: esto permite verificar que el proceso de construcción sea exitoso.
- El código tiene pruebas para evaluar que sus funcionalidades trabajen como se espera. En NodeJS, solemos usar mocha, en Python, pytest.
- Luego, el secreto es realizar todas las verificaciones remotamente en un servidor de pruebas, donde se construya y prueben las funcionalidades.
El concepto ha también escalado al punto de que, cuando hay una nueva versión, el sistema de producción también se actualice. A esto se le llama continuous deployment.
Conclusión
Queremos cerrar esta entrada invitándolos en los posts que vienen, ya que resumirá la vida de un desarrollador dentro de Git y todo lo que conllevan las buenas prácticas asociadas al desarrollo de software versionado. Stay tuned!