Automatice los flujos de trabajo de desarrollo de software con Github Actions 馃殌 | por Ansh Sachdeva

Cr茅ditos: clouddefence.ai

  • GitHub Actions es una plataforma de integraci贸n continua y entrega continua (CI/CD) que nos permite automatizar su proceso de compilaci贸n, prueba e implementaci贸n.
  • Podemos crear flujos de trabajo que creen y prueben cada solicitud de extracci贸n para nuestro repositorio o implementen solicitudes de extracci贸n combinadas en producci贸n. Hay muchos casos de uso y eventos que podemos combinar para obtener los resultados que queremos.

En resumen, definimos un conjunto de comandos en un archivo y los insertamos en nuestro c贸digo. Cuando Github identifica este archivo, ejecuta estos comandos en un dispositivo en la nube que aloja nuestro c贸digo.

  1. Flujo de trabajo: un flujo de trabajo es un archivo .yml (obtenga m谩s informaci贸n sobre su sintaxis aqu铆.) archivo que agregamos en la carpeta .github/workflows y verificamos en nuestro repositorio de proyectos. Consiste en una serie de trabajos que se ejecutan en nuestro c贸digo cuando se desencadenan por un evento. Estos trabajos tambi茅n se pueden activar manualmente. Podemos tener m煤ltiples flujos de trabajo en nuestro proyecto
  2. Evento: un evento es una actividad espec铆fica en un repositorio que desencadena la ejecuci贸n del flujo de trabajo. Por ejemplo, un activador puede provenir de GitHub cuando alguien crea una solicitud de extracci贸n, abre una propuesta o env铆a una confirmaci贸n a un repositorio. Tambi茅n puede desencadenar la ejecuci贸n de un flujo de trabajo seg煤n un cronograma, mediante la publicaci贸n en una API REST o manualmente. En esta lista encontrar谩s todos los eventos:

3. Trabajos: Los trabajos son una serie de pasos que se realizan secuencialmente en el mismo corredor. Un flujo de trabajo define 1 o m谩s trabajos y en un trabajo definimos 1 o m谩s pasos. Cada trabajo se ejecuta en su propio contenedor y, por lo tanto, los pasos de cada trabajo se ejecutan en paralelo a menos que se configure de otra manera4. Paso: un paso es la unidad de comando m谩s peque帽a en un flujo de trabajo de Github. Cada paso es un script de shell que se ejecuta o una acci贸n que se realiza. Los pasos se realizan en orden y dependen unos de otros. Debido a que cada paso se realiza en el mismo corredor, podemos compartir datos de un paso a otroEjemplo de un flujo de trabajo de Github. Definimos Job1, Job2 y los pasos en un flujo de trabajo. Se desencadena por un evento y los trabajos se ejecutan en paralelo.

  • Como se mencion贸 anteriormente, los trabajos se ejecutan en contenedores paralelos mientras que los pasos se ejecutan secuencialmente en el mismo contenedor. Por lo tanto, podemos mezclar y combinar si una tarea determinada debe ejecutarse en un trabajo separado (para que pueda ejecutarse en paralelo) o en el mismo trabajo (para que pueda ejecutarse en orden secuencial junto con otros pasos).
  • De manera predeterminada, la falla de un paso en un trabajo hace que falle todo el trabajo (a menos que se configure de otra manera), pero no afecta a los otros trabajos que se ejecutan en paralelo.

Consideremos el siguiente ejemplo:

  1. Apellido: identifica el nombre de la acci贸n de GitHub que se muestra en el historial de ejecuci贸n de la acci贸n
  2. en : Esta secci贸n designa los eventos que activan los trabajos definidos en la secci贸n de trabajos. Este bloque puede contener muchas subconfiguraciones. Por ejemplo, si queremos que el flujo de trabajo sea desencadenado por un solicitud de extracci贸n, podemos nombrar las ramas contra las que disparar el PR. Otra subconfiguraci贸n disponible para PR es tipo: que puede tomar los valores cerrado, abierto, editado, etc. La lista completa de eventos puede ser encontrado aqu铆
  3. trabajos: Esta secci贸n consta de diferentes trabajos que se ejecutan en paralelo tan pronto como ocurren los eventos mencionados en una secci贸n. Tu nombre puede ser cualquier cosa:

trabajos: lint-static_checks-prueba-construcci贸n: trabajo_paralelo_2: trabajo_paralelo_3:

3.1 Configuraci贸n de un pedido.

Un trabajo puede constar de muchos atributos para una configuraci贸n espec铆fica. Un ejemplo de algunos de los atributos generales se ver铆a as铆:trabajos: Mi primer trabajo: permisos:Contenido: Leer paquetes: escribir se ejecuta en: [self-hosted, ubuntu-latest] Pasos: Trabajo2: sips }}necesidades: Mi primer trabajo

  1. permisos: Estos son los permisos a nivel de contenedor que proporcionaremos para nuestro trabajo. Puede haber varios tipos de permisos.
  2. se ejecuta en: Aqu铆 definimos la m谩quina que se utilizar谩 para ejecutar el trabajo
  3. si: ${{}}}: Estos son Expresiones condicionales que se ejecutan declarativamente. Las condiciones se pueden aplicar en diferentes niveles en un flujo de trabajo. Se puede usar para omitir o ejecutar todo el trabajo o solo un paso. Pero, 驴a qu茅 afectan estas condiciones? ${{}} se puede usar para evaluar cualquier condici贸n como ${{1+2==3}} . Tambi茅n hay ciertas propiedades que se generan para cada paso o trabajo, como ${{job.status == 鈥榮uccess鈥檥}. Estos se llaman contexto.
  4. necesidades: Este es un atributo que hace que diferentes trabajos que se ejecutan en paralelo se ejecuten uno tras otro. idealmente, job2 en el primer ejemplo deber铆a ejecutarse en paralelo con my_first_job. Al usar Needs nos aseguramos de que job2 se ejecute despu茅s de my_first_job
  5. pasos: un trabajo contiene una secuencia de tareas llamadas pasos. Los pasos pueden ejecutar comandos, realizar tareas de configuraci贸n o realizar acciones en su repositorio, un repositorio p煤blico o una acci贸n publicada en un registro de Docker. Los pasos pueden aceptar entradas (en forma de constantes) y generar salidas. Los pasos de un trabajo se ejecutan secuencialmente. De forma predeterminada, los pasos est谩n configurados para fallar en la ejecuci贸n si el paso anterior fall贸 o dio un resultado de error, pero este comportamiento se puede cambiar a trav茅s de Expresiones condicionales.

3.2 Estructura de un paso

pasos: 鈥 Nombre: Tarea 芦Configurar filtro de ruta禄 y 芦Ejecutar禄. Us贸: dorny/paths-filter@v2me gustar铆a: filtroCon:filtro: |md: [鈥楥HANGELOG.md鈥橾 鈥 Apellido: FALLO si no se modifican los archivos obligatoriossi: ${{pasos.filtro.salidas.md == 鈥榝also鈥 }}Us贸: acciones/github-script@v3Con:guion: |core.setFailed(鈥楲os archivos de descuento obligatorios no han cambiado鈥) 鈥 Apellido: genera archivos AAR y APK.manga: golpecorrer: ./gradlew ensamblar depuraci贸n

  1. nombre: Esta es una clave opcional que da una breve descripci贸n del paso. Si la clave de nombre est谩 presente, se mostrar谩 en el terminal de flujo de trabajo durante la ejecuci贸n
  2. id: esta es otra clave opcional que identifica de forma 煤nica el paso. Con esta clave podemos obtener detalles sobre el paso (sus entradas, salidas, tiempo de ejecuci贸n, etc.). aqu铆 el segundo paso 芦FALL脫 si los archivos obligatorios no se modifican禄 utiliza la entrada del paso anterior para determinar si la acci贸n debe realizarse a trav茅s de la sintaxis de steps.filter.* o falla
  3. usos y ejecuciones: Estas son 2 caracter铆sticas muy importantes de un paso. un paso debe definir uno de estos dos.
  4. Cuando usamos uses, le hacemos saber al corredor que queremos ejecutar una serie de comandos escritos en una sola acci贸n desde el mercado. Es como una biblioteca. por ejemplo filtro de caminos/dorny es una actividad popular para verificar si un archivo ha cambiado o no
  5. Cuando usamos ejecutar, le decimos al corredor que queremos ejecutar un comando espec铆fico en la m谩quina host. esto es como usar una terminal en nuestra propia m谩quina: si el comando se puede ejecutar con 茅xito o no depende del software ya presente en el sistema y si admitir铆a su ejecuci贸n. Por ejemplo: ./gradlew AssembleDebug es un comando de terminal que queremos ejecutar y solo se ejecutar谩 correctamente si Gradle est谩 instalado en la m谩quina host de forma predeterminada o como parte de los pasos secuenciales anteriores.
  6. Shell: este comando se usa junto con el comando ejecutar para informar a la m谩quina host del terminal que queremos usar
  7. with: este atributo se usa con pasos que solo usan acciones de terceros (a trav茅s de uses ) y les proporciona entrada. Puede pasar n煤meros, cadenas o incluso secuencias de comandos js a trav茅s de argumentos en el bloque with. Las claves est谩n definidas por estas acciones mismas.
  8. env: este atributo es similar a with pero se usa para definir entradas para el paso en s铆 y se puede usar tanto con uses como con run

Dado que podemos tener m煤ltiples flujos de trabajo en nuestro repositorio, existe la posibilidad de que usemos los mismos pasos en cada uno de ellos, lo que resultar谩 en duplicados. Y dado que la duplicaci贸n es mala y dif铆cil de mantener, es posible que deseemos una soluci贸n que nos permita aislar los pasos de los flujos de trabajo en una ubicaci贸n central y reutilizarlos cuando sea necesario. Aqu铆 es donde la composici贸n del flujo de trabajo resulta 煤til. Con la composici贸n del flujo de trabajo, podemos crear archivos separados para cada paso y usarlos en cada flujo de trabajo a trav茅s de la sintaxis de usos. Los pasos son independientes del entorno del trabajo o del sistema y, por lo tanto, se pueden realizar en cualquier flujo de trabajo con muy poco esfuerzo de integraci贸n. Aqu铆 hay un ejemplo de un flujo de trabajo que NO usa composici贸n: si necesitamos crear 10 flujos de trabajo m谩s usando los resultados de Check lint y Upload Lint, tendr铆amos que copiar manualmente todos esos comandos largos de Gradle y nombres de ruta que son propensos a errores. Tambi茅n ser铆a dif铆cil mantener 10 copias de este tipo para cambios futuros. Con la composici贸n, este archivo se vuelve tan peque帽o como esto: 隆solo se requieren 2 l铆neas para realizar verificaciones de pelusa y cargar resultados! Ahora podemos hacer 10 o incluso 100 copias, 隆no tenemos que preocuparnos por cometer errores en los archivos de ruta o en los comandos de Gradle! Esto se debe a que estos detalles existen en un archivo YML separado .github/mini_flows/s3_lint/action.yml con una sintaxis algo similar:

Deja una respuesta

Tu direcci贸n de correo electr贸nico no ser谩 publicada.