Las Acciones de GitHub ofrecen una solución conveniente y completa para construir pipelines de CI. Las acciones consisten en pasos componibles controlados por archivos YAML que se guardan en tu repositorio de código. Ven y aprende cómo realizar tareas que son comúnmente requeridas en bases de código Node.js modernas, como la instalación de paquetes, el linting, la ejecución de pruebas como parte de las solicitudes de extracción, la construcción de imágenes Docker y la implementación cuando el código se fusiona en la rama principal.
Acciones de GitHub para aplicaciones Node.js
Video Summary and Transcription
Las Acciones de GitHub permiten realizar tareas de integración continua, definidas en archivos YAML, que pueden ser versionadas y revisadas a través de solicitudes de extracción. Los flujos de trabajo pueden ser activados por eventos como solicitudes de extracción o fusiones, y los pasos pueden hacer referencia a repositorios externos de GitHub. Se pueden construir y desplegar contenedores Docker utilizando las Acciones de GitHub, con la configuración y el despliegue definidos en archivos YAML. Los valores pueden ser utilizados y compartidos entre las Acciones de GitHub, y los componentes internos de Node.js pueden ser instrumentados para el monitoreo de rendimiento.
1. Introducción a las Acciones de GitHub
Hola, soy Thomas Hunter y bienvenidos a mi charla, Acciones de GitHub para aplicaciones Node. En esta charla, daré una visión general de las acciones de GitHub, que te permiten ejecutar tareas de integración continua relacionadas con tu base de código. Las acciones de GitHub se definen utilizando archivos YAML y se pueden versionar y revisar a través de solicitudes de extracción. Son componibles, lo que te permite construir gráficos de dependencia y ejecutar código en paralelo. Los pasos pueden hacer referencia a repositorios externos de GitHub.
Hola, soy Thomas Hunter y bienvenidos a mi charla, Acciones de GitHub para aplicaciones Node. Y el contenido de esta charla se basa en un libro que publiqué recientemente llamado Sistemas Distribuidos con Node. Bien, vamos a sumergirnos en ello. Primero, vamos a ver una visión general de las acciones de GitHub. Es posible que te preguntes qué es una acción de GitHub. Bueno, es una forma de ejecutar tareas de integración continua relacionadas con tu base de código. Y es realmente conveniente si tu código ya está alojado en GitHub, lo cual parece ser el caso de la mayoría de los repositorios en estos días. La forma en que funciona es que finalmente asigna una máquina virtual para ti en algún lugar, y luego ejecuta un montón de código para ti una vez que se ha activado una acción de GitHub. Y en cuanto a la facturación, se basa en minutos. Si tienes una cuenta gratuita, obtienes 2000 minutos al mes, una cuenta Pro 3000 minutos al mes. Y si tienes cuentas pagadas, puedes obtener diferentes niveles y también puedes pagar por ellos. Y así se proporciona una integración continua que se define utilizando código. Y estas acciones de GitHub se definen utilizando archivos YAML que se guardan en el repositorio. Por lo tanto, se encontrarán en el directorio de GitHub dentro de una carpeta llamada flujos de trabajo. Y luego puedes crear varios archivos YAML para cada flujo de trabajo que quieras definir. Por lo tanto, se confirman. Se versionan, puedes hacer solicitudes de extracción, verificar y revisar que se vean bien. Y sinceramente, en comparación con el uso de un sistema como Travis CI o CircleCI, este enfoque no va a ser muy diferente. Sin embargo, algo bueno es que no tienes que crear una nueva cuenta. No tienes que autorizarlo, configurarlo y todas esas cosas. Ya que todo está bajo el techo de GitHub, todo funciona junto de manera bastante fluida.
Una buena cualidad de estos flujos de trabajo es que son componibles. Por lo tanto, un flujo de trabajo está compuesto por uno o más trabajos y luego un trabajo está compuesto por uno o más pasos. Estos diferentes trabajos se ejecutan en diferentes máquinas virtuales. Puedes especificar dependencias. Puedes decir que este trabajo depende de ese otro trabajo. Y al definirlos de esa manera, puedes construir algún tipo de gráfico de dependencia y ejecutar código en paralelo. Y los pasos individuales se ejecutan secuencialmente. Por lo tanto, los pasos pueden hacer referencia a repositorios externos de GitHub. Y por ejemplo, esta línea que se usa aquí, representa código que verías dentro de uno de estos archivos de flujo de trabajo. Y esto significa que se está utilizando
2. GitHub Actions y Ejemplo de Flujo de Trabajo
Y eso en realidad se traduce en un repositorio de GitHub. Otra cosa que puedes hacer es definir la configuración utilizada por estos flujos de trabajo. Es una forma de establecer pares clave-valor que puedes usar dentro de tus flujos de trabajo. Si adoptas las Acciones de GitHub, considera crear acciones para patrones de organización comunes. Veamos un ejemplo de flujo de trabajo para una solicitud de extracción. La salida de estos flujos de trabajo es contextual dentro de la solicitud de extracción. Ahora, veamos un archivo de flujo de trabajo. Representa el esqueleto necesario para diferentes flujos de trabajo. Tenemos un flujo de trabajo llamado PR lint test.yaml. Especifica el disparador para ejecutar este flujo de trabajo. Tenemos una cláusula de trabajos con un trabajo de construcción definido.
Otra cosa que puedes hacer es definir la configuración utilizada por estos flujos de trabajo. Y esa configuración termina en la configuración del proyecto. Y esa configuración se llama un secreto. Esos secretos se mantienen ocultos a los ojos de aquellos que no deberían verlo necesariamente. Pero en esencia, es una forma de establecer pares clave-valor que puedes usar dentro de tus flujos de trabajo.
Otra cosa que debes considerar hacer si adoptas las GitHub Actions es crear acciones para patrones de organización comunes. Por ejemplo, si tu empresa tiene tal vez una docena de repositorios de node, y todos terminan implementando microservicios dentro de tu infraestructura, tendría sentido crear GitHub Actions que luego puedas compartir entre todos esos proyectos.
Muy bien, ahora veamos un ejemplo de flujo de trabajo, este es uno que vamos a usar para una solicitud de extracción. Y al igual que otras soluciones de CI, si las has usado, es que la salida de estos termina siendo contextual dentro de la solicitud de extracción. En este caso, podemos ver que hay una solicitud de extracción mal elaborada sin descripción. Pero podemos ver en la parte inferior que se han publicado los resultados del flujo de trabajo. Por lo que son muy convenientes para ver contextualmente dentro de una solicitud de extracción.
Así que veamos un archivo de flujo de trabajo. Esto representa un poco de esqueleto, que necesitarás usar en estos diferentes flujos de trabajo. Pero no es tan malo. En este caso, tenemos un flujo de trabajo llamado PR lint test.yaml. Lo primero que hacemos es definir un nombre. Esto se mostrará en la interfaz de usuario de GitHub. En este caso, el nombre es linter y prueba de aceptación. Luego tenemos esta cláusula on aquí, que especifica esencialmente el disparador para ejecutar este flujo de trabajo. Y lo que esto dice es que cuando se hace una solicitud de extracción contra la rama principal, se debe iniciar este flujo de trabajo. También se observa ese campo colgante llamado workflow dispatch. Y al proporcionarlo, puedes activar manualmente este flujo de trabajo también utilizando la interfaz de usuario. Después de eso, tenemos esta cláusula de trabajos. Y dentro de ella tenemos un trabajo de construcción definido.
3. Running Steps in a Workflow
El código se verifica usando la acción de verificación. El entorno de node se configura usando la acción de configuración de node, proporcionando la última versión LTS. Las dependencias se instalan usando npm install. Se ejecuta el linter asumiendo que se ha definido un script de lint. Se construye y se inicia un contenedor Docker usando el comando Docker compose.
4. Running Docker Compose and Deploying Containers
Ejecutamos Docker Compose para ejecutar los contenedores Docker en segundo plano. Especificamos el entorno para ejecutar las pruebas MPM. El archivo YAML de Docker Compose está configurado para escuchar en el puerto 1337. Proporcionamos el nombre de host y el puerto a la suite de pruebas. Una captura de pantalla muestra que se aprobaron 110 pruebas. Se desencadena otro flujo de trabajo cuando la solicitud de extracción se fusiona en la rama principal. El archivo de flujo de trabajo se llama main deploy.yaml. Configura el entorno de Docker, construye y envía el contenedor al registro.
5. Configuration Setup and Deployment
Esta parte cubre la configuración compleja para el contenedor Docker, incluyendo proporcionar el contexto, establecer la bandera de push y definir etiquetas. Las etiquetas incluyen una etiqueta específica para la construcción utilizando el nombre SHA del código. El trabajo de despliegue se define para ejecutarse después del trabajo de construcción y utiliza SSH para ejecutar comandos en un servidor remoto. Se utiliza un repositorio de acciones SSH de terceros para este proceso.
Así que ahora veamos el despliegue real. Aquí tenemos un segundo trabajo definido para este flujo de trabajo, el nombre de este trabajo es despliegue. Y así, aquí tenemos el campo needs establecido en build. Lo que eso significa es que este trabajo de despliegue debe ejecutarse después de que se haya completado el trabajo de construcción. También especificamos que esto se ejecuta en Ubuntu latest nuevamente. Y aquí, solo tenemos un solo paso. Y así, este paso aquí es desplegar la aplicación en un VPS. Y así, esto va a representar una especie de proceso de despliegue de pobre hombre. Y así, este es bastante simple. Vamos a usar SSH para ejecutar algunos comandos en un servidor remoto. Pero por supuesto, podrías construir una integración más compleja usando algo como Kubernetes, por ejemplo. En este caso, estamos usando un paso de terceros. Esto es de alguien llamado Appleboy. Y luego estamos usando su repositorio de acciones SSH usando un
6. Configuración de Implementación y Despacho de Flujos de Trabajo
Pasamos el host, el nombre de usuario y la clave de la colección de secretos. La configuración de conexión no se configura en el archivo YAML para evitar la inclusión de información confidencial. El script se ejecuta en el servidor remoto, descargando la imagen de Docker, deteniendo y eliminando la aplicación, y luego volviéndola a ejecutar. Los secretos se pueden inyectar como variables de entorno en el código de la aplicación. Puede haber un tiempo de inactividad cuando se detiene y se inicia la aplicación. Los flujos de trabajo se pueden despachar desde la pestaña Acciones si se define el campo en el archivo YAML.
Entonces, hay una pequeña limitación con este enfoque en el sentido de que, ya sabes, vas a tener algo de tiempo de inactividad al detener e iniciar la aplicación. Así que esto definitivamente no es algo que usarías necesariamente en producción, pero te dará una idea del poder que tienes disponible utilizando GitHub Actions. Mencioné anteriormente que los flujos de trabajo son despachables. Si tienes ese campo de despacho de flujo de trabajo disponible en tu archivo YAML. Y así, dentro del proyecto, si tienes eso definido,
7. Ejecución de GitHub Actions y Definición de Entradas
Luego, aquí en el lado derecho, hay este menú desplegable Ejecutar Flujo de Trabajo. Puedes configurar el flujo de trabajo y ejecutar el código. Puedes definir entradas en el archivo YAML e ingresarlas en el menú desplegable para ejecutar el flujo de trabajo con el objetivo correcto. Las GitHub Actions se pueden definir utilizando node. La organización oficial de GitHub Actions proporciona un repositorio de ejemplo llamado Hello World JavaScript Action. Necesita un archivo llamado Action.yaml, que describe la acción, especifica las entradas y salidas, y define el entorno en el que se ejecuta.
Muy bien, finalmente, echemos un vistazo a algunas de estas GitHub Actions. Y así como un pequeño bono, estas GitHub Actions pueden ser definidas utilizando node. Y así, la organización oficial de GitHub Actions nos proporciona un repositorio de ejemplo que vamos a ver ahora. Y el nombre de este repositorio es Hello World JavaScript Action. Y así, tomé el código de eso para esta presentación, pero luego lo limpié un poco para que encajara en las diapositivas. Así que esto no es exactamente lo que encontrarías dentro del repositorio. Entonces, el repositorio de GitHub Actions necesita algunas cosas. Una de ellas es un archivo llamado Action.yaml. Dentro de este archivo, primero se describe la acción. Aquí tenemos un nombre y una descripción para la acción. También puedes especificar las entradas. Y así, estas se correlacionan con las entradas en ese archivo YAML. Y así, aquí estamos diciendo que hay una sola entrada definida llamada whom. Y luego la descripción de whom es a quién saludar. Esta entrada no es obligatoria. Así que se establece en falso. Y luego se proporciona un valor predeterminado de world. También podemos especificar salidas. Y así, en este caso, tenemos una sola salida definida llamada time. Y así, ese campo de tiempo representará el tiempo en que se ejecuta este código. Puedes usar estas entradas y salidas para encadenar valores entre estos diferentes pasos dentro de tu proceso de compilación.
8. Uso de Valores en GitHub Actions
Esta parte explica cómo usar valores en GitHub Actions. El código en index.js obtiene los valores de entrada, los registra, genera la hora actual y los asigna a una salida. El bloque catch maneja los errores y permite que la tarea falle. El archivo de flujo de trabajo de ejemplo incluye un trabajo de hola mundo que ejecuta la acción de hola mundo utilizando un repositorio de GitHub.
Y esto representa una versión truncada de uno de estos archivos de flujo de trabajo. Aquí tenemos este paso de hola mundo, o perdón, el trabajo se llama hola mundo. Y luego el primer paso aquí ejecuta esa acción de hola mundo. Así que aquí podemos ver que estamos usando ese GitHub
9. Uso del paso 'hello' y resultados de la encuesta
Estamos utilizando el campo de nombre para especificar el paso como 'hello' y proporcionando el valor 'whom'. Luego tenemos otro paso que muestra la salida, demostrando cómo usar el valor. Llamamos a steps.hello.outputs.time para acceder a la variable del paso anterior. Gracias por ver, sígueme en Twitter en TLHunter. El ganador más grande en la encuesta es la integración de repositorio, con un 40% eligiendo GitHub Actions y GitLab. Es un poco sorprendente, ya que esperaba más herramientas de terceros dedicadas. Pero cada vez más empresas están utilizando GitHub Actions o GitLab por la conveniencia de la integración con su sistema git.
QnA
Q&A sobre anclas YAML, plataformas móviles y Jenkins
La primera pregunta es sobre las anclas YAML y la reutilización de pasos/configuraciones en GitHub Actions. La segunda pregunta es sobre cómo mover GitHub Actions a otra plataforma y usarlo para repositorios autohospedados. La tercera pregunta es sobre el uso de GitHub Actions como alternativa para ejecutar un servidor Jenkins.
Instrumentando Internos de Node.js
Puedes instrumentar los internos de Node.js, como los retrasos del bucle de eventos o la frecuencia de GC, para monitorear el rendimiento. Mide el retraso del bucle de eventos, el recuento de descriptores de archivos y el uso de memoria. Registra esta información para fallar una compilación o proporcionar un informe para la ejecución de CI.
Compartir Caché y Despliegue con GitHub Actions
Alguien preguntó si hay una forma de compartir caché entre los trabajos de solicitud de extracción y los trabajos de fusión. El orador mencionó que podría existir una acción de GitHub de terceros con este propósito, utilizando representaciones de la caché almacenadas en disco. Para el despliegue con GitHub Actions, el orador recomendó utilizar el método de despliegue que mejor se adapte a la configuración de la infraestructura, ya que GitHub Actions puede admitir diversas herramientas de despliegue.
De acuerdo, recibí comentarios de alguien de que el volumen está un poco bajo. ¿Puedes subirlo un poco? Sí, definitivamente. Genial. ¿Es eso mejor? Oh, bueno, ¿dónde está el volumen alto? No, está bien. Disculpa, una broma tonta. No pude resistirme. La siguiente pregunta es de Austin. ¿Hay alguna forma de compartir caché entre los trabajos de solicitud de extracción y los trabajos de fusión? Oh, sí, buena pregunta. Sí, compartir caché generalmente se refiere, por ejemplo, al directorio de módulos de Node. Y, sabes, de memoria, no se me ocurre una forma fácil de hacerlo, pero no me sorprendería que alguien más haya creado, como, una acción de terceros que permita, ya sabes, tomar alguna especie de representación de lo que estaría en disco. Por ejemplo, con los módulos de Node, una forma de representarlo sería hashear el archivo package-lock.json. Y luego podrías hashear eso y comprimir los módulos de Node. Luego podrías escribir ese archivo tarball en, por ejemplo, Amazon S3. Y luego en una ejecución diferente, podrías tener otra acción que verifique S3 antes de ejecutar la instalación de NPM y luego, de alguna manera, descargarlo según ese hash. Y si está allí, entonces descargas el archivo. Si no, realizarías una instalación de NPM. Así que no me sorprendería si alguien tiene una acción de GitHub de terceros solo para eso.
De acuerdo. Entonces, si alguien sabe algo al respecto, háganoslo saber en el canal de Discord si está disponible para que podamos ayudar. Tenemos tiempo para una pregunta más. Y es de Martin. ¿Qué método de despliegue recomiendas con GitHub Actions? ¿Qué método de despliegue? Bueno, en realidad, eso depende de, ya sabes, cómo se configure tu infraestructura. Entonces, ya sabes, con estas herramientas de CI, son bastante independientes de tu proceso de despliegue, por lo que si estás desplegando en Heroku o, ya sabes, Kubernetes, o tal vez solo estás haciendo SSH en una máquina remota, aún puedes utilizar cualquiera de esas herramientas de despliegue con GitHub Actions. Y así, tengo, como, un proyecto paralelo que construirá un archivo, enviará una imagen a un contenedor Docker remoto y luego, ya sabes, instruirá a Kubernetes para que descargue esa imagen y vuelva a ejecutar la aplicación. Entonces, ya sabes, no recomendaría en realidad ningún enfoque de despliegue en particular, pero diría que con GitHub Actions, realmente puedes admitir muchas herramientas de despliegue diferentes. Lo que mejor se adapte a tus necesidades. Sí. Como dije, no tenemos más tiempo. Hemos recibido un...
Preguntas y respuestas sobre anclajes YAML, depuración y compartición de caché
Recibimos preguntas sobre anclajes YAML, depuración en acciones y compartición de caché entre trabajos de solicitud de extracción y fusión. El ganador del libro será contactado a través de Discord y el libro se enviará directamente a ellos. ¡Gracias, Thomas, por unirte a nosotros!
Voy a leer las preguntas para que puedas evaluarlas para tu sorteo de libros. Recibimos una respuesta de Lara, quien preguntaba sobre... Solo veo su respuesta ahora... sobre anclajes YAML, y ella respondió que los anclajes YAML te permiten hacer referencia a data para no tener que repetirlo varias veces, manteniendo la configuración más seca. Así que eso se relaciona con la pregunta que acabamos de tener, ¿verdad? Entonces, ¿hay alguna forma de compartir caché entre trabajos de solicitud de extracción y fusión? Esperemos que los anclajes YAML puedan ayudar con eso. Otra pregunta es de AMP. Estoy teniendo problemas para depurar algo en acciones. ¿Alguna sugerencia? He configurado un entorno local con Docker Compose y todo está bien. Pero luego, cuando lo ejecuto en acciones, obtengo un error. Y otra pregunta es de D. Nekto's act es increíble. Solía hacer mi- Oh espera, esto no es una pregunta, es solo un comentario sobre otra persona. Así que eso es todo el tiempo que tenemos. Entonces, ¿puedes informarnos primero cómo el ganador recibirá su libro? Y luego haré un redoble de tambores y anunciaremos al ganador. Sí, definitivamente. Contactaré al ganador directamente a través de Discord, obtendré su dirección de correo electrónico, y se la proporcionaré al editor para que puedan enviarlo directamente a él. Oh, genial. De acuerdo. Así que, todos, contengan la respiración, es hora del redoble de tambores. Genial. Sí, me gusta mucho la pregunta sobre la caché. Es interesante y no había pensado personalmente en eso con GitHub hasta ahora, pero lo he usado en soluciones anteriores. Así que me gusta esa pregunta. La pregunta es, ¿hay alguna forma de compartir caché entre trabajos de solicitud de extracción y trabajos de fusión? Genial. Entonces, Aston es el que pregunta. No sé si esa es una palabra, pero es el que hace la pregunta. Y Thomas se pondrá en contacto contigo y recibirás este bonito libro. Asegúrate de informarnos en Twitter cuando lo recibas. Sería genial tener una bonita foto. Y también etiqueta a Thomas, por supuesto. Y hazle saber qué te pareció el libro cuando termines de leerlo. Thomas, muchas gracias por unirte a nosotros. Ha sido un placer tenerte de nuevo, y esperamos verte de nuevo pronto. Genial. Gracias por tenerme.