Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

?id=d7a3c5aa-8493-4a77-9eb4-5b4b29f76b27

Github: mucho más que un simple almacén de código fuente

Hace unas semanas tuve la suerte de participar en el meetup de un grupo de usuarios, compartiendo sesión y hablando sobre Github Actions con un miembro del equipo de desarrollo de la herramienta. De esa charla en el meetup y del tiempo de preparación previo, saqué una conclusión un poco agridulce:

Todavía hay mucha gente que piensa que Github es un simple almacén de código 😱

Precisamente, de esta conclusión que me llevé, y del hecho de que hace unos días, Github anunciase que ampliaba las capacidades gratuitas de la herramienta cuando se trabaja a nivel organizativo, surge esta entrada, en la que voy a dar un repaso a las capacidades que nos ofrece Github, y con la que podrás sacar la conclusión de si es o no un simple repositorio de código fuente 😉

Si tienes interés en ver la charla, está subida en el canal de YouTube de Dotnetters Zaragoza: Github Actions: ¿Hasta dónde podemos llegar?

Un poco de historia

Hace muchos años que aparecieron plataformas con las que poder gestionar el código fuente en internet. Los más veteranos en la sala recordarán como Codeplex o SourceForge se llevaban el mercado en los tiempos de Subversion (SVN). De hecho, aunque Codeplex está actualmente en modo archivo, SourceForge sigue funcionando y hospedando miles de proyectos como repositorio de control de versiones.

Con el paso de los años y la predominancia de Git como sistema de control de versiones distribuido (casi el estándar hoy en día), fueron tomando fuerza plataformas online alternativas centradas en Git como base para el control de versiones. Una muestra de estas plataformas puede ser la que nos ocupa (Github), pero también otras muy conocidas y utilizadas, como Bitbucket o Gitlab. Desde sus inicios, estas plataformas han ido evolucionando durante el paso de los años y han ido añadiendo cada vez más capacidades.

Antes de seguir, vamos a hacer una aclaración muy importante. Git es un software de control de versiones distribuido diseñado por Linus Torvalds como solución a los problemas de control de versiones que se encontraban los desarrolladores del kernel de Linux. Plataformas como Github son sistemas web para control de código fuente que utilizan Git como sistema de versionado subyacente y son compatibles con sus protocolos. Es decir, aunque parezca una obviedad, es necesario aclarar que todos los repositorios de Github utilizan Git pero no todos los repositorios Git están en Github.

Además de Git, algunas plataformas online soportan otros software de versionado como puede ser Mercurial, SVN, o la de los pucelanos Plastic SCM.

Teniendo clara la diferencia de concepto entre Git y Github, es lógico preguntar qué aportan plataformas como Github cuando puedes tener tu repositorio en un servidor directamente.

Github en concreto fue "una revolución" y se hizo enseguida con el mundillo del código abierto porque, aparte de facilitar el uso sencillo de los repositorios sin tener que gestionar nosotros la infraestructura, inventaron una forma de trabajo muy interesante: las bifurcaciones (más conocidas como fork) y los pull request.

Aunque el concepto de fork existe desde al menos el comienzo de los años 80 del siglo pasado, esta funcionalidad fue una importante revolución ya que clonaba el repositorio en el servidor (para un uso exclusivo del que hacía el fork), pero lo deja enlazado con el repositorio original. Eso elimina de raíz la necesidad de tener acceso de escritura sobre un repositorio para poder hacer cambios en él y facilita el poder contribuir cambios propios hacia el repositorio original.

Así, gracias a las bifurcaciones es posible que el desarrollador A cree un fork del repositorio del desarrollador B, haga cambios directamente sobre su propia copia independiente del repositorio y una vez que haya terminado con los cambios, aprovechando que su repositorio está vinculado al original, cree una solicitud de extracción de cambios (Pull Request) para que el desarrollador B (el único con permiso de escritura en el repositorio original) incorpore de manera sencilla esos mismos cambios.

Este flujo ha sido incorporado posteriormente por otros gestores de código fuente online.

Con el paso de los años, Github ha ido evolucionando y ampliando las herramientas que ofrece a los usuarios.

Vamos a ver sus principales características. Y lo mejor: son totalmente gratuitas.

1.- Github para gestionar proyectos

Desde hace ya algunos años es posible crear tableros de gestión de proyectos. Si bien es cierto que la idea original detrás de los tableros era gestionar las incidencias (y de hecho se pueden añadir directamente), nada nos impide crear nuevas tareas manualmente. Para crear nuestro tablero, basta con que dentro del repositorio vayamos a la pestaña de proyectos:

La imagen señala el botón "Projects" en las pestañas de Github

Dentro de un proyecto es posible crear tantas columnas como consideremos necesarias dentro de nuestro flujo de trabajo, de modo que podamos gestionar las tareas al estilo Kanban.

Por poner un ejemplo real, así es cómo se ve el tablero de tareas de la extensión DevOps de Az Cli:

La imagen muestra el tablero Kanban de Az DevOps

2.- Solicitudes de extracción (Pull Request)

En la introducción planteaba que el "nuevo" concepto de bifurcación ofrecía una ventaja para el desarrollo colaborativo. Esta ventaja son las solicitudes de extracción. Al estar el repositorio original y nuestra bifurcación relacionadas, es posible que una vez que hemos terminado los cambios en la bifurcación solicitemos al propietario del repositorio original que incorpore esos cambios. Esto abre un mundo de posibilidades porque ya no es necesario tener permisos de escritura sobre un repositorio para poder contribuir en él, y facilita el desarrollo colaborativo.

Esto está integrado de manera nativa en GitHub de modo que, para el propietario del repositorio, aceptar una solicitud de extracción es tan simple como lo puede ser mezclar una rama.

Además de esto, Github ofrece integración con muchos servicios de terceros para realizar diferentes acciones, como una integración o despliegue continuo, una revisión con un analizador de código estático y otras variantes que se pueden incorporar como diferentes validaciones. En caso de que alguna de las validaciones no se cumpla, se notificará de manera bien visible para que el propietario sepa que los cambios tienen algún problema. Y por el contrario, se le mostrará de forma prominente que todo va bien.

La imagen muestra una solicitud de extracción donde se han pasado todas las validaciones y el botón para mezclar los cambios está en verde

3.- Revisión y discusión del código

Está muy bien tener un tablero con el que poder gestionar al proyecto, ya que aporta visibilidad al trabajo que se está desarrollando y marca el camino a seguir en el futuro cercano pero... en un mundo colaborativo donde cualquiera puede aportar su granito de arena a un proyecto, es necesaria una herramienta con la que poder revisar el código de las aportaciones. Y en el trabajo en equipo es algo indispensable.

Github ofrece esta posibilidad de manera integrada, de modo que cualquiera puede ir a una solicitud de extracción o a un commit y abrir una discusión en un punto concreto, incluso para una línea de código en particular.

Gracias a esto es posible revisar el código in situ, de manera que el que ha creado el código o el responsable del proyecto y los desarrolladores involucrados puedan debatir.

La imagen muestra una discusión en un pull request del repositorio tonerdo/coverlet

Esto es especialmente útil ya que, aunque se puede debatir todo lo que sea necesario en la propia conversación asociada a un commit, a un Pull Request o a una línea de código concreta, el hecho de poder hacer anotaciones directamente o poder poner el fragmento de código que se sugiere, dinamiza mucho la revisión del código.

4.- Gestión de incidencias (issues)

Con lo planteado hasta el momento tenemos un lugar donde almacenar nuestro código, gestionar el ciclo de desarrollo del producto y hacer solicitudes de extracción y revisiones de código pero... ¿y la interacción con los usuarios de lo que estamos desarrollando? Existen muchas herramientas para hacer seguimiento de las incidencias de modo que los usuarios puedan registrar sus problemas directamente.

Github integra esta característica de serie y además, no podría ser más fácil de utilizar. Basta con ir a la pestaña de incidencias (Issues en la interfaz de usuario) para poder ver, crear y editar incidencias. Los usuarios pueden ir e introducir problemas, sugerencias, preguntas...

La imagen señala la pestaña de issues y muestra las incidencias abiertas del repositorio tonerdo/coverlet

Además, permite el definir cómodamente plantillas que se mostrarán siempre que se cree una nueva incidencia, de manera que guíe a los usuarios sobre qué información es útil para la resolución del problema o qué esperamos que pongan:

La imagen muestra la plantilla de incidencias en un repositorio

5.- Documentación (wikis)

Quizás uno de los puntos que menos nos gustan a los desarrolladores sea la documentación. Crear documentación suele ser tedioso ya que hay que mantenerla y suele ir evolucionando. Es por eso que tener un punto donde centralizarla es interesante, y si además podemos utilizar gestión de versiones para ella, es un escenario ideal. Como en todo, existen muchas plataformas donde poder documentar el código, pero Github lo ofrece de manera integrada gracias a la Wiki del proyecto.

La imagen señala la pestaña de Wiki del repositorio chkr1011/MQTTnet

La Wiki de un proyecto es un repositorio Git (¿a que no te lo esperabas 😆?) en el que se puede subir la documentación en formato Markdown (*.md). El hecho de usar Markdown facilita la creación de la documentación, ya que es un texto plano con ciertas convenciones para aplicar estilos (de hecho, esta entrada está escrita en Markdown), y como es un repositorio Git, subir cambios y tener un versionado es tan simple como hacer commit y push. Del resto se encarga Github, que va a crear un índice navegable a los diferentes ficheros y una búsqueda, de modo que la información sea útil y accesible.

La imagen señala el índice de la Wiki del repositorio chkr1011/MQTTnet

6.- Páginas web (GitHub Pages)

Github ofrece una interesante utilidad para crear páginas Web. Lo que hace Github es servir una página web estática con todo su HTML, CSS y JavaScript desde el repositorio directamente, incluso en una rama aparte de modo que no interfiera con el trabajo normal.

Esto, aunque pueda parecer una tontería, es una gran ventaja para muchos casos ya que permite servir contenido en Internet de manera totalmente gratuita y desde la CDN global de Github (y recordemos que, como todo lo anterior, es gratis).

Si tienes curiosidad sobre cómo hacerlo, nos dudes en echarle un ojo a la serie de campusMVP sobre el tema: Crea tu propia página o blog gratis con Jekyll y Github

Todas aquellas páginas que optan por servirse desde Github pueden ser actualizadas de manera tan sencilla como añadir un cambio al repositorio y hacer commit y push. ¿Sencillo verdad? Todo esto con un ancho de banda muy generoso, nada menos que 100GB (recordemos que desde una CDN global como es Github) y con dominio propio y certificado HTTPS.

7.- Github para integración y despliegue continuo

Desde la compra de Github por parte de Microsoft, Github ha aumentado las herramientas que ofrece a sus usuarios, como el aumento de capacidades de manera gratuita o el fork de los agentes de Azure Pipelines. Precisamente del fork de esos agentes surge una iniciativa propia llamada Github Actions.

Github Actions es una herramienta de integración y despliegue continuo perfectamente integrada con la plataforma. Gracias a esta herramienta no es necesario recurrir a servicios de terceros como puedan ser Azure DevOps, Travis CI o AppVeyor, ni a ningún servicio propio como pueda ser Jenkins.

Para poder utilizar las acciones, basta con ir a la pestaña Actions del repositorio:

La imagen señala el botón "Actions" en las pestañas de Github

Una vez dentro es posible ver los flujos de trabajo que hay registrados así como crear nuevos. Los disparadores de estos flujos de trabajo son muchos y variados, desde cambios en el código hasta que alguien dé una estrella al proyecto. Esta versatilidad es la que nos permite realizar tanto integraciones continuas como despliegues continuos, como simplemente, por ejemplo, labores automáticas de documentación.

La imagen muestra diferentes workflows ornamentales dentro de la tabla de acciones

Estos flujos de trabajo, además, se registran en un fichero .yml que se queda en la carpeta .github/workflows dentro del repositorio, por lo que es muy simple el poder reutilizarlos en diferentes proyectos. Además, cuando alguien haga una bifurcación del proyecto, también tendrá disponibles los flujos de trabajo que garanticen la calidad del mismo.

8.- Organizaciones

Por si todo lo planteado antes fuese poco, Github permite crear organizaciones para poder gestionar de manera grupal un conjunto de repositorios. Esto a simple vista puede no parecer importante, pero es algo de vital importancia ya que permite que varios usuarios tengan control a diferentes niveles sobre los repositorios de la organización. Esto permite que los proyectos Open Source puedan seguir activos aunque su desarrollador original se retire, ya que otros pueden haber entrado a formar parte de la organización y tomar el relevo.

Imagina que una única persona en exclusiva tiene acceso al repositorio con el código de una librería de uso común. Mucha gente la utiliza y hace PRs a ella, pero si el propietario pierde acceso a su cuenta, se retira, o simplemente se cansa, el proyecto acabará muriendo ya que no se incorporarán los nuevos cambios.

Además, si trabajamos en una empresa con muchos proyectos en marcha gestionados en GitHub, podremos organizarlos y delegar el control de manera sencilla.

9.- Un montón de pequeños extras

En este artículo he pretendido citar las características más importantes (al menos desde mi punto de vista), pero no son todas ni mucho menos. Existen multitud de herramientas para usos muy variados dentro de la tienda de Github, muchas de ellas gratuitas para proyectos cuyo código es público.

Hace algún tiempo, se introdujeron de manera nativa feeds para diferentes repositorios de paquetes, de modo que es muy fácil tener a mano un feed propio donde alojar los paquetes que desarrollas (gratis si son repositorios públicos). Además, de manera integrada y automática, Github comprueba las versiones de paquetes que se utilizan en los proyectos para avisar de vulnerabilidades detectadas en ellos y ofrece una alternativa en base a lo que han hecho el resto de desarrolladores.

Por citar alguna otra capacidad, Github permite ver estadísticas sobre el código del repositorio y sobre el repositorio en sí mismo, dependiendo de los lenguajes, es posible navegar a la definición de los diferentes métodos desde el propio visor web... Sí, lo has leído bien, navegar por las definiciones dentro del propio navegador web 😯

El gif muestra como al ponerse sobre una método en Javascript Github ofrece el navegar a la definición

Por resumir

Con todas estas características sobre la mesa, queda claro que Github no es exclusivamente un repositorio de código fuente. Sí lo fue en sus orígenes, pero es un producto que ha evolucionado mucho a lo largo de los años. Ya tenía un futuro muy prometedor antes de que lo comprara Microsoft, pero ahora que está en manos del gigante de Redmond sus opciones han mejorado todavía más.

Si pensabas que era tan solo un repositorio Git remoto... piénsalo otra vez.

Y tú ¿cómo le estás sacando partido a GitHub? Déjanos tus comentarios debajo.

Jorge Turrado Jorge lleva en el mundo de la programación desde los tiempos de .Net Framework 3.0. Experto en la plataforma .NET, .NET Core y en técnicas de integración continua, trabaja desde hace varios años en el desarrollo de sistemas comerciales de visión artificial. Microsoft lo ha reconocido como MVP en tecnologías de desarrollo en 2018. Puedes seguirlo en Twitter: @JorgeTurrado o en su blog FixedBuffer Ver todos los posts de Jorge Turrado
Archivado en: Herramientas

¿Te ha gustado este post?
Pues espera a ver nuestro boletín mensual...

Suscríbete a la newsletter

La mejor formación online para desarrolladores como tú

Agregar comentario

Los datos anteriores se utilizarán exclusivamente para permitirte hacer el comentario y, si lo seleccionas, notificarte de nuevos comentarios en este artículo, pero no se procesarán ni se utilizarán para ningún otro propósito. Lee nuestra política de privacidad.