Busca aplicaciones del mundo real | Chris Frewin | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Busca aplicaciones del mundo real

teacher avatar Chris Frewin, Full Stack Software Engineer

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Introduccion

      0:52

    • 2.

      Por qué ir

      5:15

    • 3.

      API de alergia

      2:27

    • 4.

      Requisitos de aplicación

      1:29

    • 5.

      Instalar Go y la extensión de Visual Studio Go

      1:13

    • 6.

      Cómo establecer el esquema del proyecto

      1:47

    • 7.

      Crear el Cron Job

      6:07

    • 8.

      Creación de una función de utilidad HTTP genérica

      8:57

    • 9.

      Llamada y análisis de la API de alergia

      15:39

    • 10.

      Creación de una aplicación y función de mensajería en Slack

      6:07

    • 11.

      Completar el Cron Job

      3:15

    • 12.

      Cómo ejecutar la aplicación

      2:13

    • 13.

      Pruebas de escritura

      7:48

    • 14.

      Cómo hacer Dockerización en la aplicación

      4:58

    • 15.

      Reinicio del contenedor con el mínimo tiempo de inactividad

      2:19

    • 16.

      Cómo agregar formato elegante a los mensajes de Slack

      6:25

    • 17.

      Cómo mover secretos y valores codificados a un archivo env

      8:11

    • 18.

      Creación de una canalización de CD de CI con Circle CI

      24:28

    • 19.

      Conclusión

      0:41

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

17

Estudiantes

--

Proyectos

Acerca de esta clase

Sumérgete en el poderoso mundo de Go (Golang) y aprende a construir, probar e implementar aplicaciones del mundo real desde cero. Tanto si recién comienzas a usar Go como si buscas aplicar tus habilidades a proyectos prácticos, este curso te dotará de un flujo de trabajo esencial y moderno.

Acompáñame en esta clase práctica donde exploraremos por qué Go es un recurso increíble para cualquier desarrollador. Aprovecharemos su rendimiento, las capacidades de prueba integradas y el sencillo manejo de JSON para crear una aplicación funcional.

En esta clase, aprenderás lo siguiente:

  • Escampe un proyecto Go: comienza completamente desde cero, configura correctamente una nueva estructura de proyecto.

  • Escribe código funcional para Go: desarrolla la lógica central para una aplicación práctica y basada en API.

  • Implementa pruebas unitarias: usa el conjunto de pruebas integrado de Go para garantizar que tu código sea confiable y robusto.

  • Containeriza con Docker: empaqueta tu aplicación Go en un contenedor de Docker ligero y portátil.

  • Automatiza tu flujo de trabajo: configura una canalización completa de CI/CD (Integración continua/Despliegue continuo) con CircleCI para probar y construir automáticamente tu proyecto.

Al final de este curso, tendrás un conocimiento completo y práctico de todo el ciclo de vida de desarrollo de una aplicación moderna Go, desde una sola línea de código hasta una canalización de despliegue completamente automatizada.

Conoce a tu profesor(a)

Teacher Profile Image

Chris Frewin

Full Stack Software Engineer

Profesor(a)

Hi everyone!

I've been a professional full stack software engineer for 7+ years, and I've been programming for many more. In 2014, I earned two separate degrees from Clarkson University: Mechanical Engineering and Physics. I continued at Cornell for my M.S. Degree in Mechanical Engineering. My thesis at Cornell was a technical software project where I first learned Bash and used a unique stack of Perl and Fortran, producing a publication in the scientific journal Combustion and Flame: "A novel atom tracking algorithm for the analysis of complex chemical kinetic networks".

After opening up my first terminal while at Cornell, I fell in love with software engineering and have since learned a variety of frameworks, databases, languages, and design patterns, including TypeScrip... Ver perfil completo

Level: Intermediate

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. Introduccion: Go es un lenguaje back-end increíblemente poderoso que puede ser un activo para el kit de herramientas de cualquier desarrollador Es performante. Se ha construido en serialización y deserialización JSON, tiene pruebas integradas y mucho más. En este curso, vamos a empezar completamente desde cero, haciendo una nueva carpeta, andamiando un proyecto G, escribiendo todo el código para ello, escribiendo pruebas para el proyecto Dockerizar la aplicación, y luego finalmente al final, automatizar una tubería CICD de flujo de trabajo de pruebas y construcción CICD de flujo Al final del curso, espero que obtenga una visión general práctica y práctica de cómo puede crear aplicaciones de go dockerized, Espero que me acompañes en este curso, Ve por aplicaciones del mundo real. 2. Por qué ir: Antes incluso de empezar a hablar sobre lo que va a hacer nuestra aplicación o cualquier programación, quiero repasar rápidamente por qué incluso elegiríamos G como opción de idioma en primer lugar. Entonces, ¿por qué elegiríamos G? En primer lugar, es extremadamente performante. En este punto, he escrito al menos una docena de solicitudes de go, y nunca tuve que buscar ningún tipo de condición de carrera o problema de rendimiento. Y una de esas era una API para una startup bastante grande. Teníamos alrededor de 10,000 usuarios, y en algunos puntos, 1,000 a 2000 usuarios simultáneos. E incluso entonces, nunca tuvimos problemas importantes de rendimiento, y eso se estaba ejecutando en una máquina virtual de cuatro núcleos. Go también es extremadamente compacto. Por lo tanto, la aplicación se ejecuta normalmente desde un único archivo principal dot go, y eso se puede hacer simplemente emitiendo go run main dot go. Como veremos más adelante en el curso, esto es extremadamente potente para cuando queremos dockerizar Es muy sencillo de transportar y ejecutar una aplicación go. Go también es extremadamente comprobable. Tiene un marco de pruebas incorporado. Entonces importaríamos este paquete de prueba. Pasamos eso a nuestra función de prueba. Y entonces es tan sencillo como llamar a la función que queremos probar. Y en este caso, he devuelto un error de esta función. Si el error no es Nulo, esto es ir por no nulo o vacío. Entonces usamos este puntero al framework de pruebas, y emitimos un error. Entonces esto está integrado. No necesitamos ninguna configuración externa. No necesitamos bibliotecas externas. Está integrado en el idioma. Go también es extremadamente amigable con API. Entonces tengo un ejemplo aquí para mostrarte cómo funciona en Go. Entonces si asumimos que tenemos algún tipo de respuesta JSON de una API como esta, podemos usar el paquete JSON y también el identificador JSON cuando definimos un tipo aquí, lo llamamos alguna API, es una estructura. Y sabemos que nuestra respuesta tiene algún tipo int y alguna matriz de cadena. Es una matriz de cadenas. Utilizamos este identificador JSON. Ahora, la magia sucede cuando usamos estos identificadores y usamos el paquete JSON integrado, supongamos que ya tenemos la respuesta de la API, algún tipo de resultado binario. Simplemente podemos llamar a JSON Unmarshal y Golang serializará ese resultado binario en Y cuando ve estas claves, sabe poner esos valores en cada una de estas partes de esta estructura. Entonces entonces pasamos a asumir que no hay error , ordenando la respuesta, si pasamos a cerrar la sesión alguna int, obtendríamos cinco y si hacíamos bucle sobre la matriz de cadenas, obtendríamos esto A, B y C. Así que de nuevo, no necesitamos ningún archivo de configuración, ninguna biblioteca externa Solo usamos la biblioteca JSON incorporada con el método Unmarshal, y Golang maneja toda la serialización y deserialización de JSON Ir también es extremadamente uniforme. Entonces, cuando estés escribiendo, ve con un editor de código moderno como Visual Studio Code, ve a los formatos al guardar de acuerdo con sus propias reglas integradas. Y esto significa que no importa dónde estés leyendo el código G, ya sea un paquete externo, un paquete de terceros, código de tus compañeros de equipo, siempre verás los mismos patrones, sangría y espaciado en cualquier Esto hace que sea muy fácil leer otros proyectos de go. Esto también le ahorra tiempo a usted y a su equipo de debatir sobre reglas de formato como pestañas y espacios y todas estas cosas Estas reglas también están integradas en el lenguaje go. Entonces, en resumen, G es muy performante. Es muy rápido, al menos en toda la experiencia lo he usado, es muy compacto. Solo necesitas tu único archivo main dot go. Es fácilmente comprobable. Las pruebas vienen con el propio lenguaje. Es muy amigable con API. Esta serialización y deserialización JSON también sale de la caja con el lenguaje, y es uniforme Estas reglas de linting y formateo también vienen con el lenguaje Y así, en conjunto, G es una opción muy sólida para cualquier software de back end que pueda necesitar construir. Entonces, con un fondo básico de lo que es G y algunas de sus ventajas, en la siguiente lección, podemos comenzar a mirar la aplicación real que vamos a construir, y luego finalmente podemos entrar en la codificación de la aplicación. 3. API de alergia: En este curso, vamos a construir una aplicación que nos envíe mensajes y nos avise diariamente de los niveles esperados de polen en el aire. Si eres como yo, puedes padecer fiebre del heno desde aproximadamente mediados de mayo hasta mediados de junio de cada año, al menos en el hemisferio norte. Y no te preocupes. Incluso si no tienes alergias de ningún tipo, prometo que el contenido y los patrones en este curso son extremadamente útiles sin importar qué tipo de aplicación go estés usando. Entonces donde vivo en Austria, la Universidad de Medicina de Viena tiene este gran sitio que predice los niveles de polen para el día Y con un poco de excavación e inspección de las llamadas API para este sitio, encontré los puntos finales que producen todos los datos Hay principalmente dos puntos finales que vamos a utilizar. El primero es este obtener datos de carga por hora, que tiene una clave de éxito y el resultado. Lo más importante, aquí está esta matriz horaria. Entonces, por cada hora, dará un valor esperado del polen en el aire, que va desde cero hasta, creo, ocho o nueve. El segundo punto final que utilizaremos en este curso es este obtener datos de gráficos actuales. Este lo usaremos para promedios históricos. Entonces como puedes ver aquí, también tenemos una clave de éxito. Tenemos algunos resultados. Y para cada resultado, tenemos una fecha, la actual o en este caso, lo que realmente sucedió en esa fecha de este año, y luego el promedio histórico. No obstante, es el 16 de mayo en este momento, y como se puede ver, la corriente es cero, e incluso para ayer, la corriente es cero. Por lo que estos datos están un poco retrasados. Sin embargo, como mencioné, lo estaremos usando principalmente para los valores promedio. Por lo que estaremos enviando mensajes tanto el valor esperado para el día a partir de estos datos por hora también el promedio histórico del día. Entonces, con una visión general y una idea de lo que va a ser nuestra aplicación en la siguiente lección, discutiremos brevemente los requisitos técnicos que queremos que nuestra aplicación cumpla, y luego finalmente podremos comenzar a escribir algún código. 4. Requisitos de aplicación: La última lección, nos fijamos en la API de alergia que íbamos a usar y de dónde provenían esos datos. Y en esta lección, solo discutiremos brevemente los requisitos de la aplicación a un nivel más técnico antes de comenzar a codificar. Entonces, desde el punto de vista del flujo de aplicaciones, a un tiempo diario específico, queremos llamar a esos puntos finales de alergia Vamos a analizar esa respuesta JSON de cada llamada y luego hacer algún trabajo de formateo para transformarla en un buen mensaje legible por humanos. Entonces finalmente, queremos enviar ese bonito mensaje a través de los webhooks de Slack Todas las funciones que escribimos deben tener pruebas. La aplicación se debe ejecutar desde un contenedor Docker. El contenedor Docker debe reiniciarse en cualquier tipo de falla debe construir una tubería automatizada que ejecute todas las pruebas que escribimos y luego publique el contenedor Docker en el caso de que todas esas pruebas efectivamente pasen Y luego, finalmente, los diversos valores importantes utilizados alrededor de la aplicación, como los endpoints de API, la URL del gancho web de Slack, el tiempo de trabajo de Cron y la zona horaria del trabajo de Crown deberían ser configurables lo que a lo largo de este curso, abordaremos paso y cumpliremos con todos estos requisitos. En la siguiente lección, finalmente comenzaremos a andamiar nuestra aplicación go 5. Instalar Go y la extensión de Visual Studio Go: Empezar, todos debemos comprobar que tenemos G instalado. Para verificar que tengo G instalado, simplemente emitiré la versión G. Y puedo ver que tengo G 1.20 0.2. Si este comando no devuelve nada o un error, entonces probablemente necesite instalar G en su sistema. Puedes ir a ir dot dev slash dClash Install, y tienen las instrucciones de instalación para Linux, Mac y Windows Para lo que resta de este curso, asumiré que estás codificando junto conmigo en código de Visual Studio. Por lo que también te recomiendo que tengas instalada la extensión G. Para encontrar la extensión G, dirígete a la pestaña de extensiones y busca G. Debería ser el primer resultado, y por supuesto, ya la tengo instalada. Esta extensión es una tienda integral para todo lo que debes necesitar para editar el código G. Es un inter, probador, depurador y formato combinado para G. Una vez que haya instalado esta extensión, podemos comenzar a andamiar nuestro proyecto G. 6. Cómo establecer el esquema del proyecto: La última lección, nos aseguramos de que tuviéramos G instalado, y también instalamos la extensión de Visual Studio Code G. Ahora vamos a andamiar nuestra app. Normalmente, cuando comienzas un nuevo proyecto G, crearías una nueva carpeta para esa aplicación. En este caso, yo lo llamaría Allergy Cron y tú emitirías make DR Allergy cron emitirías make DR Allergy cron No obstante, como ya estoy en el repositorio del curso, tengo una carpeta aquí para el proyecto y no voy a hacer una nueva carpeta. El siguiente paso sería entonces inicializar un módulo para el proyecto Normalmente tomo el mismo nombre que el nombre de la carpeta en sí. En tu caso, ese sería cron alérgico. Entonces aquí, lo inicializaremos de acuerdo con ese nombre de carpeta El comando para inicializar un módulo G es Gomd init y luego en nuestro caso, Go nos dirá que creó un nuevo archivo mod go dot. Podemos subirnos a este archivo gomd y ver qué hay en él. Por ahora, como no hemos instalado ningún paquete adicional, solo tiene el nombre del módulo y la versión go que se utilizó para crearlo. A continuación, podemos crear el archivo principal, para que sea touch main dot go. Y si todavía estabas en solo un entorno terminal, no tenías un editor abierto. Podrías, por supuesto, abrir el punto principal ir con el comando Abrir. O si quisieras abrirlo en código de Visual Studio, podrías emitir código main dot go. Entonces, después de toda esa configuración, finalmente estamos listos para comenzar a escribir algo de código G. 7. Crear el Cron Job: La última lección, andamiamos nuestro nuevo proyecto G, inicializando un módulo G, que nos dejó con este archivo mod go dot, y creamos un archivo main dot go vacío En esta lección, comenzaremos a abordar el primer requisito técnico, y es decir, tener un trabajo cron diario que se dispare exactamente al mismo tiempo Cada archivo go tiene una declaración de paquete en la parte superior. En este caso, este es el paquete Min. Entonces podrías tener algunas importaciones aquí. Y en el caso del archivo main dot go, tendremos nuestra función principal, que es simplemente función main. Ahora, para trabajos de Crown y G, me gusta usar la popular biblioteca Rob Fig Cron Esta biblioteca también nos permite establecer el Cron Job de acuerdo a una zona horaria específica Entonces primero, haré uso del paquete de tiempo de Go para cargar la zona horaria, y luego podremos configurar el trabajo de corona en esa zona horaria. Entonces obtenemos una ubicación y un error y eso es de tiempo, cargar ubicación. Y como estoy en Austria, quiero Europa, Viena. Entonces, claro, tenemos que verificar si el error no es Nil, entonces vamos a entrar en pánico con ese error, y de lo contrario, podemos continuar Ahora, para configurar un Crown Job con este paquete, todo lo que tenemos que hacer es llamar nuevo con ubicación, y vamos a pasar por esa ubicación. Ahora, vemos con el inter, cuanto hago referencia a este cron, el inter sabe qué paquete quiero usar El único problema aquí es que este paquete aún no está en nuestro archivo mod. Entonces, si pasamos el cursor sobre la importación aquí, Go se queja de que no hay ningún módulo que proporcione este paquete Pero, por suerte, el Linter nos proporciona una solución rápida, que es simplemente el comando install o go get package Entonces si solo hacemos clic en que el paquete está instalado. Deberías ver tu archivo mod got modificado, y luego podemos continuar con nuestro código aquí. Para no pasar el tiempo real de Cron, necesitamos agregar Cron Job punto ad Funk y esto toma el identificador cron tipo unix estándar necesitamos agregar Cron Job punto ad Funk y esto toma el identificador cron tipo unix estándar con seis caracteres. Y esos son específicamente los segundos, los minutos, las horas, el día del mes, el mes mismo, y el día de la semana. En nuestro caso, creo que un tiempo razonable, al menos para mí son las 8:00 A.M. Todas las mañanas. Entonces especificaré tanto cero para los segundos como para los minutos, y luego ocho para la hora. Y entonces el segundo parámetro a este ad funk es la función que realmente queremos ejecutar Y por ahora, sólo voy a poner ahí una función vacía. Puedo limpiar este comentario de importación, y podemos guardar nuestro archivo. Otra cosa que quiero destacar aquí es la capacidad de extensiones de Visual Studio go para formatear automáticamente. Entonces si tenemos algún espaciado descuidado aquí o algo así, en aquí o algo así, cuanto guardemos, en mi caso, en un Mac Command S, vemos que el inter formatea automáticamente ese código También debo mencionar para estas zonas horarias, estas se buscan desde algo llamado la base de datos de Zona Horaria Iana Encontré un bonito sitio web llamado Nota time, que enumera todas las diversas zonas horarias. Así que donde quiera que estés en el mundo, puedes sentirte libre de mirar a través de esta mesa y establecer la zona horaria de acuerdo a donde estés, o cuando quieras que tu Cron Job dispare También necesitamos asegurarnos de que se inicie nuestro trabajo cron. Entonces hemos agregado la función, pero explícitamente necesitamos llamar a cronjob dot SAT Y entonces si tuviéramos que dejar esto, cuando ejecutamos la función principal, simplemente correría aquí y luego saldría. Por lo que sí necesitamos bloquear el hilo principal para mantener el proceso go funcionando para que mantengamos en vivo este trabajo cron después de que lo iniciemos, y el cron continuará funcionando hasta cada día cuando llegue a ese horario de las 8:00 A.M. En esta lección, comenzamos a escribir nuestro archivo principal dot go. Aprendimos que cada archivo go comienza con una declaración de paquete. Entonces usualmente hay algunas importaciones y luego tus funciones. En este caso, es un caso un poco especial. El archivo main dot go siempre tiene una función principal. Y comenzamos a escribir el cuerpo de nuestra función principal. Cargamos la zona horaria de Viena, y usamos esa zona horaria de ubicación en nuestro trabajo cron, y configuramos el trabajo de Cron para disparar a las 8:00 AM todos los días. Vimos una buena característica de cómo el formato de código de Visual Studio puede corregir y formatear automáticamente la sangría en nuestro Y también discutimos todas las diversas posibilidades que puede pasar a esta función de ubicación de carga para que pueda establecer la zona horaria que desee. La siguiente lección, entraremos construcción de una función de utilidad HTTP, para que podamos comenzar a ver cómo vamos a llamar a las URL API que eventualmente agregamos en el cuerpo de la función aquí de nuestro trabajo de Crown 8. Creación de una función de utilidad HTTP genérica: Última lección, comenzamos andamiando nuestro archivo principal punto go y configurando el trabajo cron que podría disparar nuestras diversas tareas a las 8:00 A.M. en la zona horaria de Viena Ahora vamos a escribir una función HTP genérica que se utilizará tanto para las llamadas API de alergia como para enviar nuestro mensaje de slack Ahora bien, esta función es bastante compleja y hace uso de las funcionalidades genéricas de G. No voy a entrar en demasiados detalles cuanto a cómo se construyó la función. Tengo una entrada de blog separada que entra en los detalles de su implementación, y eres más que bienvenido a leer sobre eso por separado. Para comenzar con esta función, crearemos una nueva carpeta llamada Utils y un nuevo archivo llamado make http request dot go El paquete aquí será Utils. Y para nuestra función, realizar solicitud HDP. Eso toma un tipo genérico. Después pasaremos la URL completa, que es una cadena, el método HTTP esperamos, que también es una cadena. Cualquier encabezado que necesite la llamada, que es un mapa de cadenas y cadenas. Los parámetros de consulta que son de valores de tipo RL, el cuerpo, que es lector IO, y el tipo de respuesta T, y devolveremos ese tipo o un error. Lo primero que haremos dentro de esta función es inicializar nuestro cliente HTTP Y convertiremos la URL de cadena un objeto URL completo con Rl punto pars con esa URL completa Si el error no es NIL, entonces simplemente devolveremos nuestro tipo de respuesta y el error Si el método es G, necesitamos anexar cualquiera de los parámetros de consulta que se pasaron Entonces primero, obtendré la consulta del objeto URL, y necesitamos recorrer esos pares de valores clave dentro de los parámetros de consulta. Y vamos a establecer la clave y el valor. Para cada parámetro. Y luego estableceremos la consulta sin procesar a la consulta construida codificada tonta que hemos construido aquí. También podemos establecer el cuerpo y eso es haciendo una nueva solicitud, pasando el método, la versión de cadena de la URL y el cuerpo. Si el error no es nulo, nuevamente, devolvemos el tipo de respuesta y el error. Y ahora que tenemos nuestra petición, necesitamos establecer los encabezados. En cuanto a la clave y el valor de esos encabezados, estableceremos el valor de encabezado. Y finalmente, podemos hacer su petición real, y eso es literalmente con la función de punto do del cliente. Nuevamente, si el error no es NIL, devolvemos ese tipo de respuesta y el error También comprobaremos si la respuesta en sí es NIL devolveremos el tipo de respuesta y un error diciendo que al llamar a la URL se devolvió una respuesta vacía, y queremos pasar en esa versión de cadena del objeto URL De lo contrario, si seguimos aquí, queremos leer el cuerpo. Y nuevamente, si el error no es nill, devolver ese tipo de respuesta error diferir el cierre de ese cuerpo Y también queremos verificar si el código de estado no es el código de estado o. Tipo de respuesta, y también haremos un error personalizado aquí. Formato similar aquí. Puede lanzar una nueva línea con el código de estado, otra nueva línea con los datos de respuesta reales. Y luego queremos poner en la cadena URL, el código de estado real, y esos datos de respuesta. Ahora bien, si hemos llegado hasta aquí, finalmente podemos desagrupar los datos de respuesta en el objeto de respuesta, que es el tipo T que esperamos Así que vamos a declarar el objeto de respuesta, y vamos a tratar de desmarcar los datos de respuesta en el objeto de respuesta Si el error no es nuevo, gire el tipo de respuesta y el error en sí. Finalmente, estamos seguros de devolver el objeto de respuesta completa con un error NL. Ahora cuando guarde aquí, la extensión visual studio go importará automáticamente todas esas bibliotecas que usemos. Entonces IO, la biblioteca HDP, la biblioteca de URL, cadenas, y así sucesivamente Entonces, con un poco de esfuerzo, tenemos una función genérica muy poderosa, y me gusta usar esta función para casi cualquier llamada HTTP de descanso estándar que necesite hacer. Como hemos visto, está implementado que pueda funcionar para get put, post y todo tipo de verbos HTTP. Entonces con esta poderosa función ahora implementada, en la siguiente lección, realidad llegaremos a llamar a la API de alergia. También definiremos los tipos que pasarán como este tipo genérico. Entonces sabemos que la respuesta JCN se serializará correctamente, y luego podremos consumirla más abajo en nuestro código G. 9. Llamada y análisis de la API de alergia: Última lección, construimos esta función genérica de solicitud HDP bastante poderosa, y ahora en esta lección, haremos uso de ella llamando a la API de alergia de la Universidad de Medicina de Viena Entonces, para empezar, haremos una nueva carpeta. Llamado Allergy API y un nuevo archivo go Alergia subrayado api punto go Y este paquete es el mismo que la carpeta y el nombre de archivo, API de subrayado de alergia Ahora bien, lo primero que tenemos que hacer es definir los tipos que pasaremos aquí a nuestra función genérica para que el JSON aquí, cuando esté desordenado, conozca el tipo en el que debería desmaridar el tipo en el que debería desmaridar Y mirando hacia atrás en esas dos llamadas API separadas, tenemos nuestros datos de carga horaria, que tiene una especie de estructura general con las claves de éxito y resultado, y luego dentro del resultado, tenemos otro objeto, que tiene un total, algún tipo de opción personalizada, y luego lo más importante para nosotros, la matriz horaria, que es una matriz de enteros Para los datos del gráfico get current, también tenemos una estructura similar. Tenemos un objeto grande que tiene las claves de éxito y resultado. Pero entonces los resultados aquí son directamente una matriz con un objeto repetitivo que tiene fecha actual, temporada promedio y fecha hora. Y una vez más, lo más importante para nosotros aquí es el promedio. Vamos a tomar este punto final para la porción promedio histórica del mensaje que enviamos. Así que comencemos con los tipos de datos de carga por hora. Entonces primero, voy a definir la respuesta, y eso tiene una clave de éxito y resultado aquí. Entonces voy a definir esto como respuesta de carga horaria. Este es un Strup y tenemos nuestro éxito, que es un int, y el identificador JSON aquí es éxito en minúsculas Y el resultado, que necesitamos definir un nuevo tipo, una nueva estructura para este tipo anidado, lo voy a llamar resultado de carga horaria Y también necesitamos definir la clave JSON que es resultado en minúsculas Ahora como este tipo usa esta otra estructura, normalmente me gusta poner el tipo de arriba aquí ¿Y qué tenemos? el total y el total por hora es un int. JSON en minúsculas y por hora es una porción de ins, y el JSON es Y cuando vuelva a guardar aquí, los Linters formateando todo lo bonito y ordenado en columnas Ahora podemos pasar a los datos del gráfico. Así que de manera similar, tenemos la respuesta de datos de Chart. Y echemos un vistazo a esto. También, claves de éxito y resultado. Entonces el éxito es un int. Y el resultado o debería decir, resultados plural está en matriz, y este tipo tendrá que ser otro tipo personalizado, al que llamaré resultado de datos de gráfico actual. Y también necesitamos especificar la clave JSON. Tomaré esto y definiré el tipo aquí. Y todo lo que realmente necesitamos es la fecha, que por ahora tomará como cuerda y la media, que es una flotación. Entonces tenemos fecha y el promedio puedo guardar esto, y eso debería ser todo lo que necesitamos para mecanografiados personalizados. Ahora vamos a escribir una función separada para cada punto final de API. El primero, podemos llamar a obtener datos de carga por hora. Y el segundo, llamaremos a obtener datos actuales del gráfico. Ahora para ambos, esperamos que devuelvan un puntero de cadena y un error. Y esta cadena será en última instancia el mensaje que pasará a nuestro mensajero holgado. Y sabemos que el objetivo aquí es llamar a nuestra función genérica aquí. Entonces tendremos una respuesta y un error de podemos importar este paquete Utils que acabamos de crear en la lección anterior y la solicitud make HTTP Ahora no necesitamos especificar el tipo explícitamente. Golán inferirá eso para nosotros. Y para la URL, la tenemos aquí. Ese es este índice punto pP. Podemos poner eso. Sabemos que esta será una solicitud de obtención. No necesitamos pasar ningún encabezado. Tendremos que pasar algunos parámetros de consulta. No hay ningún cuerpo que necesitemos pasar y el tipo de respuesta es la respuesta de carga por hora. Y si el error no NL devolveremos una cadena Nil y el error por ahora, pasemos a estos parámetros de consulta Este tipo son los valores de URL. Y podemos agregar todos los parámetros que necesitamos. Así que aquí hay bastantes por esta hora. Tenemos un EID, un tipo de acción puede proporcionar un país zip, y así sucesivamente Así que vamos a proporcionar todos esos parámetros de consulta. Así que estamos seguros de que nuestro Get request funciona exactamente como lo hace en el navegador. Entonces vamos a agregar este EID El tipo es ZIP El código postal es de 6,800. El país es Austria A T. Y también está esta bandera para el JSON Cure, y esa es una. Puede importar este paquete de URL. Y ahora pasemos a formatear y construir esta cadena que queremos devolver. Entonces, a partir de los datos aquí, tenemos la matriz completa de la carga horaria esperada. Y entonces lo que haremos es recorrer esta matriz, construir un promedio y luego crear una cadena que mencione lo que es este promedio. Entonces primero definiremos alguna carga promedio. Y luego vamos a hacer un bucle en el rango que sabemos que está dentro de la parte horaria del resultado. Entonces eso es solo más igual al valor de la hora, y luego la carga promedio se convierte en la carga promedio dividida por la duración de todas las horas. Otra cosa que he notado al mirar alrededor de la API es que están haciendo algún tipo de normalización de los datos. No se muestra aquí, pero estos números pueden llegar hasta ocho o nueve, pero solo muestran un ranking 0-4 en la interfaz de usuario real del sitio web Entonces, por ahora para imitar esa funcionalidad, vamos a simplemente dividir el promedio, lo llamaremos una carga promedio escalada, y esa solo será esta carga promedio dividida por dos El mensaje formateado que vamos a enviar, tomaremos el paquete de formato, sprint F, y diremos pero la carga promedio de polen para hoy es escalada promedio, y devolveremos ese mensaje formateado y no hay error La implementación para obtener datos de gráficos actuales es bastante similar. De hecho voy a copiar todo esto, y luego podemos hacer cambios en consecuencia. Y he cometido un pequeño error aquí. Esta es la clave de acción, y el EID es, de hecho, la interfaz de la aplicación Puedes agregar eso aquí. Ahora, aquí, en este caso, la acción es, como podemos ver aquí en la URL es obtener los datos actuales del gráfico. Todo el ID, esto es en realidad para el tipo de planta. En este caso, lo he hecho para mi alergia, que es para pastos o heno Todavía podemos pasar la cremallera. Solo nos importan los datos de la temporada, y esa es la bandera para los datos de la temporada. Y también queremos que se active esa bandera pura de JCN. La URL es la misma. El método es el mismo. Todavía pasamos, por supuesto, los parámetros de consulta, y ahora solo necesitamos cambiar el tipo de respuesta, que es el tipo de respuesta de datos del gráfico actual. Ahora, claro, G se quejará aquí porque la forma de la respuesta es diferente. Entonces, lo que queremos hacer para este método es hacer bucle en todos estos resultados hasta que encontremos una fecha coincidente, y luego queremos imprimir el promedio histórico para la fecha actual. Voy a definir una variable llamada actual YY MMDD. Ese es el punto de tiempo ahora, y luego necesitamos formatearlo usando el estilo Go de formateo de cadenas. Definiremos un histórico promedio que inicializará un cero y luego recorremos esos resultados y encontraremos la fecha coincidente Entonces, si la fecha de resultado es igual a esta fecha actual, entonces sabemos que el promedio histórico es ese promedio de resultado. Y de manera similar, como hicimos anteriormente, deberíamos crear un promedio escalado Y tomaremos un int cast de eso ya que solo queremos de cero a cuatro, y solo vamos a redondear el promedio histórico encontrado dividido por dos, y luego podremos crear nuestro mensaje formateado En este caso, diremos, históricamente, la carga promedio de polen para hoy es y pasaremos en ese promedio escalado Guardamos el inter, vamos a importar esos paquetes, y deberíamos estar todos listos. Entonces en esta lección, empezamos a pensar en cómo podemos llamar estos dos endpoints y deserializar el JSON que Comenzamos mirando la estructura del JSON y definiendo los tipos necesarios y las partes necesarias de ese JSON que necesitamos usar para construir nuestros mensajes. Luego comenzamos a escribir las funciones reales que llaman al punto final, haciendo uso de nuestra solicitud make HTP que construimos en la lección anterior Una vez que obtenemos la respuesta, hacemos un poco de cálculo y formateo. Y para cada función, finalmente devolvemos la cadena formateada, que podremos enviar a través de Slack. En la siguiente lección, tomaremos esta cadena de retorno y la enviaremos Slack a través de webhooks. 10. Creación de una aplicación y función de mensajería en Slack: La última lección, definimos algunos tipos y escribimos dos funciones para llamar a la API Allergy, hacer algunos cálculos y finalmente devolver una cadena bien formateada, que dijimos que luego reenviaríamos a Slack para poder enviar el mensaje a través de Slack. Para poder enviar nuestros mensajes a través de Slack, primero necesitaremos una aplicación de Slack. Entonces tendremos que activar los webhooks entrantes para esa aplicación, y finalmente, tendremos una URL que realmente podremos publicar para enviar el mensaje Luego volveremos aquí al código y escribiremos otra función de utilidad para enviar cualquier mensaje a nuestra aplicación de Slack. Para comenzar a crear una aplicación de Slack, dirígete a api dotslaq.com y sube aquí y haz clic en tus aplicaciones, y tendrás que iniciar sesión para acceder a Voy a iniciar sesión aquí con Google. Y quiero la cuenta Full Stack Craft de mi empresa. Y solo podemos hacer clic en Cancelar aquí. Ahora que hemos iniciado sesión, podemos regresar a api dotslag.com Y luego haz clic en tus aplicaciones. Una vez que estemos en la página de listado de aplicaciones, haga clic en Crear nueva aplicación. Y queremos crear nuestra app desde cero. Yo llamaré al mío el Allergy Cron Bot. Y otra vez, lo quiero en mi propio Fullstack Craft Works. En la página resultante, entonces queremos agregar webhooks entrantes Y solo queremos alternar este interruptor a la posición on, y veremos que aparece algún código aquí. Ahora, queremos agregar un nuevo webhook, así que haremos clic aquí, y necesitamos elegir un canal para permitirle publicar Por ahora, elegiré General y daré clic en AAO. Si ya tenemos una app de Slack abierta, ya sea en la web o en la versión de escritorio, deberíamos ver que se agregó la integración. Entonces aquí en general, veo que he añadido mi bot corona alergia. De vuelta en la interfaz de usuario web, puedes ver que Slack ha creado una URL de webhook para nosotros, y así podemos copiarla de inmediato. Alternativamente, puedes copiar su ejemplo aquí. Este es un ejemplo de hola mundo. Y justo en la terminal aquí, voy a pegar en este ejemplo, debería disparar sin problema. Y si vamos a Slack, hecho vemos ese mensaje de Hello World de nuestra nueva aplicación de Slack. Por ahora, simplemente copiaremos la URL sí y nos dirigiremos a nuestro proyecto G. Crearemos una función de utilidad que podamos enviar un mensaje. Entonces voy a llamar a este archivo, enviar mensaje de Slack. Esto es paquete Utils y la función aquí, enviar mensaje de Slack Simplemente aceptaremos un mensaje, que es una cadena, y devolverá un error, si lo hubiera. Todo lo que tenemos que hacer aquí es crear un cuerpo, y vamos a usar el paquete JSON y mariguar un mapa de cadena de cadena con ese parámetro de texto, y ese será el mensaje que pasemos a la función Si el error no es Nil, devolveremos ese error Entonces podemos utilizar nuestra solicitud make HTP. Esa va a ser nuestra URL. Vamos a publicar a eso. Los encabezados, no tenemos que proporcionar parámetros de consulta. También podemos salir como Nil. Creamos un búfer a partir de nuestro cuerpo, y podemos simplemente tener una cadena vacía como nuestro tipo. Realmente no obtenemos ninguna respuesta. Solo obtendríamos un código 200 cuando tenga éxito. Entonces no hay nada que tengamos que analizar. Y a partir de aquí, podemos regresar Nil. Y si guardo este archivo, el Linter importará el paquete JSON, y deberíamos estar todos listos Ahora bien, esta URL es técnicamente un secreto, ya que si alguien se enteró de esto, podría enviar spam a tu canal de holgura indefinidamente Por ahora, lo dejaremos codificado duro , pero en una lección posterior, recopilaremos todos estos valores codificados y los pondremos en un archivo de entorno. Entonces, para resumir en esta lección, creamos una nueva aplicación de Slack y activamos los webhooks entrantes Y después de seleccionar un canal al que queríamos enviar un mensaje, Slack generó una URL en la que podemos publicar que finalmente reenviaría el mensaje a ese canal. De vuelta en nuestro código G, escribimos un conciso mensaje de Slack UTIL que luego podemos usar para reenviar que luego podemos usar para reenviar lo que analizamos de la API de alergia En la siguiente lección, combinaremos todas las funciones que escribimos en main dot go, y luego estaremos listos por primera vez para ejecutar nuestra aplicación. 11. Completar el Cron Job: última lección, creamos una aplicación de Slack y esta función de utilidad de envío de mensajes de Slack que realmente puede enviar los mensajes a Slack que se generan en nuestras funciones de API para alergias. Esta lección, finalmente combinaremos todas estas funciones que hemos escrito en main dot go. Entonces dentro de esta función de Cron, voy a llamar a nuestros datos de carga horaria G y obtener los datos actuales del gráfico y luego reenviar ese mensaje combinado a Slack Así que tenemos nuestro mensaje promedio diario. Y eso viene de la API de alergia. Obtener datos de carga por hora. Si el error no es nill, vamos a entrar en pánico Y también obtendremos el promedio histórico. Y de igual manera, si el aire no es nill, entonces entraremos en pánico. Y entonces el mensaje de holgura real que vamos a enviar va a combinar ambos mensajes, y solo pondremos un nuevo carácter de línea entre los dos. Con eso combinado, podemos llamar a nuestra función Send Slack message con ese mensaje de slack. Y nuevamente, si el error no es nill, vamos a entrar en pánico debería ser Utils Puede importar eso. Y solo por ahora para la depuración, voy a cerrar sesión que enviamos con éxito el mensaje de Slack, y agregaremos en el mensaje real de Slack Se puede salvar eso, y deberíamos estar todos a punto de irnos. Entonces, como una revisión rápida de esta lección, finalmente volvimos a nuestro archivo principal dot go, y llamamos al Obtener datos de carga horaria y también a los datos del gráfico actual G para tener tanto un mensaje promedio diario como promedio histórico Los combinamos con una nueva línea, y luego llamamos a nuestra función de mensaje New Send Slack, que finalmente completa el flujo funcional completo de nuestra aplicación. En la siguiente lección, modificaremos el tiempo de trabajo cron para disparar más o menos inmediatamente, y luego ejecutaremos nuestra aplicación 12. Cómo ejecutar la aplicación: La última lección, completamos el cuerpo de la función que realmente se disparará a nuestro tiempo cron especificado Ahora, ya que estamos listos para ejecutar realmente nuestra aplicación, deberíamos actualizar esto a la siguiente hora y minuto inmediatos para que podamos ver rápidamente el trabajo cron disparando y podamos probar el cuerpo real aquí para ver que todo está funcionando Entonces a partir de este tiempo de grabación actual, es 1209, así que voy a topar esto hasta 1210, y luego podemos llamar a nuestra función con go run main dot Y debemos esperar justo a medida que el reloj llegue a 1210, estas APIs para ser llamadas y nuestro mensaje de slack para ser enviado Entonces, efectivamente, vemos solo una garrapata después de 1210. Obtenemos el siguiente mensaje de holgura que se envía. La carga promedio de polen para hoy es una, e históricamente, la carga promedio de polen para hoy es de dos. También podemos ver por aquí en nuestra aplicación de Slack que de hecho recibimos el mismo mensaje exacto. Por lo que nuestra aplicación está funcionando exactamente como esperamos. Hasta el momento, lo que hemos construido en este curso sigue los requisitos técnicos que especificamos en términos del flujo y cómo funciona la aplicación. Obtiene los datos de la API, convierte en una bonita cadena legible por humanos y luego envía ese mensaje a través de Slack. Sin embargo, todavía hay muchas optimizaciones que podemos hacer para que esta sea más una aplicación de grado empresarial Entonces, en las próximas lecciones, veremos cosas como eliminar estas cadenas y ponerlas en un entorno, así como cosas que realmente deberían dejarse a un archivo de entorno como la URL de Slack y también el punto final de la API de alergia. Una vez que hagamos eso, pasaremos a analizar las pruebas y luego incluso a implementar una canalización CICD automatizada 13. Pruebas de escritura: Última lección, ejecutamos nuestra aplicación, y vimos que efectivamente todo está funcionando como se esperaba. Ahora bien, todo eso está bien, pero ¿y si la API cambia o sucede algo raro en nuestra aplicación haciendo que se rompa? Probablemente queremos saber si alguna de nuestras funciones está rota sin tener que ejecutar la aplicación en un entorno de producción completo. Entonces en esta lección, vamos a escribir pruebas para cada una de las funciones que hemos escrito. Específicamente la función Enviar mensaje de Slack y también las dos funciones dentro de la API de alergia, la obtención de datos de carga por hora y la obtención de datos de gráficos actuales. No vamos a escribir explícitamente una prueba para la solicitud M HTP porque esta función es llamada en realidad por las otras tres que vamos a escribir pruebas para Entonces por proxy, si escribimos una prueba para estas tres funciones, también, a su vez, por proxy estaremos probando la función make HTP request Para comenzar a escribir nuestras pruebas, haremos una carpeta llamada tests. Y voy a hacer dos archivos, uno para cada uno de los módulos o funciones que vamos a estar probando. Así que vamos a tener nuestra prueba de API de alergia, y también tendremos nuestra prueba de mensajes Send Slack. Y nota cuatro, vaya a reconocer estos archivos como pruebas reales. Sí tienen que terminar con el sufijo de prueba de guión bajo punto go Entonces dentro de cada uno de estos, esta es nuestra prueba de paquete. Sabemos que vamos a necesitar el módulo de prueba, el módulo de pruebas incorporado de G. Y también para el nombre de la función, hay una regla que el nombre tiene que comenzar con test. Entonces necesitamos tanto el sufijo de prueba de guión bajo aquí como también el nombre de la función para comenzar con la palabra prueba en mayúscula para ir a reconocer completamente tanto el archivo como las funciones dentro de los archivos para que sea una Y así aquí lo llamaré test Allergy API, y sí tenemos que pasar un puntero a ese módulo de pruebas. Déjalo vacío por ahora y haz lo mismo aquí. Para nuestra prueba de mensajes de Slack, se trata de pruebas de paquetes. Importe el módulo de pruebas. Y voy a llamar a esta prueba enviar mensaje de Slack, y pasamos en un puntero a ese módulo de prueba. Ahora para probar realmente nuestras funciones, llamaremos a los datos de carga horaria G y a las funciones de datos de gráfico. Y ahora llamamos a nuestra función como lo haríamos en cualquier otro lugar de nuestro código. Entonces primero llamaré a esto obtener datos de carga por hora, y luego haremos varias comprobaciones sobre el error y el mensaje para completar nuestra prueba. Entonces, si el error no es nuevo, entonces queremos usar la función T punto f, y podemos decir error obteniendo datos de carga por hora. Podemos pasar en el error real. También debes verificar si el mensaje es Nil. Ese también es un caso de error. Y en este caso, solo diremos error al obtener datos de carga por hora. El mensaje es NIL y también podemos verificar si el mensaje en sí es una cadena vacía Eso probablemente tampoco sea muy buen resultado de nuestra función. Entonces error al obtener datos de carga por hora. El mensaje está vacío. Y casi lo mismo para los datos del gráfico obtener actuales. Recibí nuestro mensaje y nuestro error y las mismas comprobaciones. Entonces si el error no es nulo en realidad puede copiar esto. Solo asegúrate de cambiar el mensaje aquí. Entonces queda claro cuando ejecutamos nuestras pruebas. También verificaremos si el mensaje es Nil o el mensaje está vacío, y simplemente reemplazaré esta cadena de carga horaria con los datos actuales del gráfico Ahora, dentro de la prueba de mensajes Send Slack, solo tenemos un error devuelto por esa función de Util, y solo voy a llamar al mensaje Send Slack con mensaje de prueba Si el error no es igual a Nil, entonces diremos error enviando mensaje de slack, y pondremos en el error real ahora usaremos el comando go test incorporado para ejecutar estas pruebas Entonces me gusta pasar algunas banderas cuando ejecuto mi prueba. El primero es P, que establece el número de pruebas paralelas en uno. En otras palabras, eso ejecutaría tus pruebas en serie. Y me gusta este formato porque tus pruebas siempre se ejecutarán en el mismo orden, y siempre obtienes un resultado esperado de cómo funcionan tus pruebas. Entonces con el tiempo, puedes acostumbrarte a cómo se ve esa salida. Si tienes una base de código muy, muy grande, por supuesto, podrías considerar modificarla para ejecutar múltiples pruebas en paralelo. También agrego el indicador V, que permite una salida verbosa Y esto es útil que en el caso de que algo salga mal, obtengas más salida y puedas encontrar el error más rápido. También necesitamos pasar la carpeta donde queremos ejecutar nuestras pruebas. En este caso, es la carpeta de pruebas. Entonces juntos, el comando es ir a prueba P uno y luego para el Verbose y luego la carpeta tests Y si somos buenos en nuestros trabajos, cuando ejecutamos este comando, esperaríamos ver que todas las pruebas pasan. Y de hecho, ambas pruebas, la prueba de alergia API y test sens slack message, ambas pasaron, y nuestras pruebas se ven bien Entonces, como resumen rápido, escribimos las pruebas para la mayoría de las funciones que escribimos en nuestra base de código pusimos en la carpeta test, y discutimos cómo ser una prueba válida para G, G necesita ver tanto la prueba de guión bajo al final como el nombre de la función dentro del archivo de prueba para comenzar con la prueba en nombre de la función dentro del archivo de prueba para comenzar con la prueba mayúscula Entonces escribimos nuestras pruebas. ejecutamos con el comando de prueba G con algunas banderas adicionales, y vimos que todas nuestras pruebas pasan. La siguiente lección, veremos cómo podemos dockerizar 14. Cómo hacer Dockerización en la aplicación: Última lección, escribimos pruebas para nuestra aplicación, y vimos que efectivamente las pruebas estaban pasando. En esta lección, veremos cómo podemos dockerizar Debido a que GO compila en un solo binario, no hay demasiados pasos complejos que necesitemos hacer para que nuestra aplicación GO se ejecute sin problemas en Docker Tendremos que definir dos archivos, es decir, el propio archivo Docker, y luego el archivo de composición de Docker, lo que nos permitirá ejecutar nuestro contenedor con una herramienta como Docker Compose, donde podamos administrar y orquestar Entonces voy a empezar con el archivo Docker, y voy a poner eso aquí mismo en la raíz de nuestro proyecto Eso es simplemente archivo Docker. Y voy a comenzar con el contenedor alpino Gang, y me llevaré el contenedor 1.2 Golang Entonces eso es de Golang 1.2 oh Alpine. Entonces vamos a definir el Wd como app, y esa es una práctica común para que no estemos construyendo o creando archivos en la raíz real de este contenedor, sino que definimos nuestro propio espacio de trabajo normalmente se toma como app en este contenedor, normalmente se toma como app en este contenedor, y ahí es donde haremos la construcción real. Entonces entonces queremos copiar todo lo que tenemos aquí en nuestra base de código a esa carpeta de aplicaciones, y eso es solo punto a punto. Entonces realmente construiremos nuestra aplicación. Entonces haremos Go Build O, y lo llamaremos Allergy Cron y luego para ejecutar esto, como se mencionó, G creará un solo binario, y solo necesitamos ejecutar ese binario Entonces ya este Dockerfile sería suficiente para crear un contenedor que podamos construir y luego ejecutar, pero para hacerlo más amigable con Docker Compose, que podamos ejecutarlo inmediatamente con Docker Compose, también definiremos un punto Docker Compose también definiremos un Así que al igual que el Dockerfile, voy a poner justo en la raíz aquí, el Docker Compose Dot Yamofle y usaré la Eso es 3.9. Después definimos nuestros servicios. Tenemos el cron alérgico, que es nuestro único servicio Y luego definiremos el contexto de construcción. Es solo aquí, lo que significa que Docker Compose buscará este archivo Docker justo en nuestro root y usará ese Entonces también podemos definir la política de reinicio, y la voy a definir con stop less stop value. Entonces esto significa que si nuestro contenedor se bloquea por algún motivo, Docker lo detectará y reiniciará el contenedor por nosotros. Ahora para ver si hemos configurado todo correctamente en estos dos archivos, podemos ambos compilar y luego ejecutar nuestro contenedor. Entonces primero, para construir el contenedor, voy a usar el comando Docker Compose, y queremos construir Y como es la primera vez que construimos nuestra aplicación como una doble verificación de seguridad, tampoco emitiré ningún caso, y eso significa que todo lo necesario para construir el contenedor se descargará recién de Internet. Aquí no vamos a usar ningún archivo local. Una vez hecho eso, entonces también podemos ejecutar Docker Compose. Y en este caso, queremos arriba y también pasaré la bandera D, que es la bandera desprendida, y eso significa que Docker pondrá en marcha nuestro contenedor en segundo plano y nos devolverá nuestra terminal Si no pasamos esa bandera D, empezaríamos a ver los registros de nuestro contenedor anexados directamente, y salir o salir del entorno terminal también saldríamos de nuestro contenedor Entonces pasamos esa D para que el contenedor se quede en funcionamiento en segundo plano. Entonces, si todo funciona correctamente, deberíamos ver un bonito green hecho aquí al final de toda la salida de compilación. Y podemos comprobar para ver que el contenedor en realidad se está ejecutando con el comando Docker PsA Y de hecho vemos nuestra alergia Cron corriendo creada hace 18 segundos arriba 15 segundos. Y así hemos creado y ejecutado con éxito nuestra aplicación go en un contenedor Docker Como resumen rápido, definimos tanto un archivo Docker como un archivo Docker para permitir que nuestra aplicación se ejecute con el comando Docker Compose nuestra aplicación se ejecute con el Ambos construimos y luego ejecutamos nuestra aplicación en segundo plano, y vemos, de hecho, nuestra aplicación se está ejecutando en su contenedor en nuestro sistema local. En la siguiente lección, veremos brevemente cómo reiniciar nuestro contenedor con un tiempo de inactividad mínimo 15. Reinicio del contenedor con el mínimo tiempo de inactividad: La última lección, creamos los dos archivos de configuración necesarios tanto para crear un contenedor Docker como para luego ejecutar ese contenedor Docker con Docker Compose En esta lección, veremos rápidamente cómo podemos reemplazar un contenedor en ejecución con un tiempo de inactividad mínimo. Y realmente, se reduce a reconstruir la aplicación y reemplazarla. Y nuevamente, eso es usar este comando Docker Compose. Vamos a construir de nuevo sin caché. Y emitir el comando arriba desapegado y lo que es más importante con la fuerza recrear. Pasamos esta bandera para que estemos seguros de que Docker siempre reemplazará el contenedor existente el de nueva construcción Entonces, si emitimos este comando, nuevamente vemos que se completa. Y si reviso nuestros contenedores con PSA, efectivamente sí vemos la nueva versión creada hace 10 segundos hasta 7 segundos. Por lo que solo fue reemplazado. Ahora bien, para una aplicación de Cron Job como esta, este comando probablemente sea suficiente para tus necesidades Pero ten en cuenta que este no es un método de tiempo de inactividad cero. Este es solo un método de tiempo de inactividad mínimo. Tendrías tiempo de inactividad por los breves momentos que tarda Docker en reemplazar el contenedor Para una solicitud de empleo cron como esta, solo es importante recordar no reemplazar este contenedor cerca del momento en que se ejecuta tu trabajo de corona Si está haciendo algo más complicado que necesita un verdadero tiempo de inactividad cero, tendría que hacer algo más complejo, como hacer múltiples contenedores, cambiar balanceadores de carga, etc. Pero ese tipo de estrategia queda fuera del alcance de este curso. Pero en resumen, en última instancia, si sabes lo que está haciendo tu app y cuando es seguro reemplazar ese contenedor, este método funciona bastante bien para muchos tipos de aplicaciones. En la siguiente lección, volveremos a la codificación y mejoraremos el mensaje que enviamos a través de Slack. 16. Cómo agregar formato elegante a los mensajes de Slack: En la última lección, discutimos brevemente cómo podríamos reconstruir y reemplazar un contenedor con un tiempo de inactividad mínimo. En esta lección, volveremos a entrar en algún código y veremos cómo podemos mejorar el formato de los mensajes de slack que enviamos. Entonces, si nos metemos en nuestro archivo API de alergia, podemos recordar que estamos enviando dos mensajes de holgura bastante simples. Podría ser agradable agregar un poco más de color y tal vez incluso algunos emojis para que el sentimiento de nuestro mensaje pueda mostrarse más rápidamente y de manera más interesante Entonces lo que vamos a hacer es modificar este mensaje inicial. Vamos a dejar el mensaje histórico tal como está. Pero para los datos reales en tiempo real, mejoraremos el formato de ese mensaje. Entonces abajo en la parte inferior aquí, voy a definir una nueva función llamada format Allergy data. Y es sólo una función minúscula aquí porque no necesitamos exportarla Simplemente se utilizará dentro de este archivo. Voy a pasar en la carga promedio escalada que tenemos eso es un int, y vamos a devolver una cadena Lo que tenemos actualmente es nuestro mensaje formateado y se ve así. La carga promedio de polen para hoy y pasamos en esa carga promedio escalada Pero vamos a poner tanto el prefijo como sufijo a este mensaje para que sea un poco más elegante Podemos hacer eso con un caso de switch y lo que voy a hacer es encender la carga promedio escalada Y para uno, ese es un caso algo moderado. Y así lo prefijaremos con este emoji de círculo amarillo y pondremos Bien, luego un espacio, y luego el mensaje existente que tenemos. Y tal vez queremos ponerle gorras que sea un nivel bajo o moderado. Entonces en el caso de que sean dos, podemos subir el color a una especie de color naranja de advertencia y decir algo así como cuidado de nuevo con nuestro mensaje formateado. Y en este caso, esto es mediano, y lo terminaremos con ese emoji naranja. Después cuatro o tres. Pondremos rojo y pondremos advertencia nuevamente con ese mensaje formateado y referenciaremos que este es alto y terminamos con el emoji rojo. Ahora bien, si es el nivel más alto, que es cuatro, entonces vamos a poner tres de estos emojis rojos y poner alerta con nuestro mensaje formateado Y poner muy alto estrés estos casos más altos aquí. Y también concluiremos esto con tres de esos círculos emogi rojos Entonces si el caso, si es cero, vamos a caer a través, y también tomaremos default y devolveremos este emogi verde luego decir agradable con el mensaje formateado, el none Solo para que la puntuación sea consistente aquí, y podemos cerrar el soporte de nuestra caja de conmutación Entonces ahora, en lugar de nuestro formato aquí, nos desharemos de esto ya que ya está abajo en nuestra nueva función y llamaremos a la función de datos de alergia de formato y pasaremos en esta carga promedio escalada Ahora, si guardamos esto, podemos probar nuestra aplicación. Entonces en este momento es 318. Va a subir nuestro cron a 319. Entonces eso será 15 y 19, creo. Y podemos emitir ir a correr principal Dotco. Y de hecho, justo después de 319 aquí, obtenemos una copia de lo que hemos enviado a través Slack con nuestro nuevo y agradable mensaje. Y hoy, hace un poco caliente y seco, así que tengo que cuidarme un poco. El nivel es alto hoy. Entonces, como revisión de esta lección, entramos en nuestro archivo API de alergia, y reemplazamos el primer mensaje que enviamos con esta nueva función de datos de alergia de formato. Y agregamos aquí algún texto adicional adicional, así como algunos emojis que mejor reflejan el sentimiento de la información que estamos enviando Y en general, creo que se ve bastante bien y es más fácil determinar la naturaleza del mensaje de inmediato. Entonces solo quedan unas pocas lecciones. En la siguiente lección, veremos mover todos estos valores codificados como la URL y la zona horaria de Cron, así como el intervalo Cron, y ponerlos en un archivo M. Y una vez que lo hayamos hecho y aseguramos de que nuestra aplicación siga funcionando, vamos a usar CircleCI para construir una canalización CICD que probará, construirá e implementará automáticamente nuestra aplicación 17. Cómo mover secretos y valores codificados a un archivo env: Última lección, escribimos esta función de datos de alergia de formato para mejorar el formato y hacer que los mensajes de holgura sean un poco más coloridos. En esta lección, vamos a tomar todos estos valores codificados, como la URL de la API, así como la ubicación de cron y el horario de cron y ponerlos en un archivo de entorno Entonces para comenzar, voy a crear un archivo N, así punto N. Y de inmediato, queremos crear un archivo Get Ignore y agregar este archivo N al G Ignorar. Esta es una práctica común, ya que normalmente tendrás al menos uno o posiblemente más valores secretos que no quieres registrar en tu repositorio Git. Entonces voy a crear este Get Ignore y solo voy a agregar el archivo M. Entonces, ¿qué tenemos realmente para nuestras variables de entorno? Tenemos la URL raíz de la API Allergy aquí. También tenemos nuestra URL de gancho web de Slack, y tenemos nuestra zona horaria Cron así como la cadena de horario Así que agreguemos todos estos a nuestro archivo de entorno. Así que tenemos nuestra URL de webhook de Slack. Se puede pegar eso en. Tengo nuestra raíz URL API de alergia, lo llamaré. Ese es este tipo. Consiguió nuestra zona horaria cron Eso está aquí. Y el horario cron. Y ese es éste. Y mientras esté aquí, volveré eso nuevo al valor original de las 8:00 A.M. que teníamos Ahora, para que el tiempo de ejecución de Gang realmente vea o tenga estos valores en el entorno, necesitamos asegurarnos de que este archivo de entorno se cargue en el tiempo de ejecución. Para ello, podemos usar el popular paquete Johogo dot Nv. Entonces eso es github.com, Joho y ve punto v. Y podemos recuperar Y justo en la parte superior de nuestra función principal, podemos cargar eso en. Eso devuelve un error, y es solo ir punto N punto carga. Y no necesitamos pasar ningún parámetro. Buscará por defecto nuestro archivo punto N. Por supuesto, queremos comprobar si el error no es Nil entonces vamos a tener un mensaje fatal aquí Error al cargar el archivo. Ahora necesitamos realmente tomar el valor de estas variables de entorno. Eso se puede hacer con la llamada s.gn. Así que los hemos cargado muy primero en nuestro principal, y deberían estar disponibles entonces en nuestro entorno. Así que tenemos OS GNV. Y esta será la zona horaria de Cron. Y para este, tenemos OS GNN. Este es Cron Schedule. Y de igual manera aquí en la API OSG N también hay que agregarla a continuación, creo, o arriba y también en nuestra función de slack Esto es OSG N. Y nuestra URL de webhook slack. Ahora, también necesitaremos agregar esta carga de ambiente en nuestra prueba también. Desde ahora que hemos refactorizado el código, el código que se ejecuta bajo estas pruebas también espera tener esas Entonces es ligeramente diferente en la prueba porque no estamos en la raíz, no podemos simplemente llamar a la carga predeterminada, sino que tenemos que pasar explícitamente la ruta de regreso al entorno en la raíz. Voy a copiar esto en la parte superior de nuestras dos pruebas. Y sólo tenemos que pasar explícitamente ese camino. E importa aquí tanto los paquetes de fin de Godot como de registro. Y lo mismo para la otra prueba. Importar esos. Y ya hemos definido el error ahora, así que son solo los iguales normales. Y eso debería hacerlo para las pruebas. Entonces, para revisar rápidamente, creamos un archivo punto N para todos los diversos valores codificados que estábamos usando alrededor de nuestra aplicación. También creamos un archivo get Ignore para estar seguros de que estamos ignorando ese punto N porque de hecho hay secretos En este caso, lo más importante es esta URL de webhook. No queremos que nadie se meta en eso o lo contrario podrían publicar en nuestro canal. Revisamos nuestro código y reemplazamos esos valores codificados con sus respectivos nombres de entorno. Y también agregamos a nuestras pruebas la forma de cargar la variable de entorno. Entonces, en el caso de que nuestra prueba pase explícitamente el camino a nuestro fin, que está en las carpetas superiores. Así que usamos la notación punto Unix para llegar a esa carpeta raíz desde nuestra carpeta de prueba. En definitiva, este es un patrón muy agradable porque justo en este archivo M, ves de inmediato algunos de los valores clave más importantes de cómo funciona nuestra aplicación, es decir, la zona horaria y el horario, pero también si la URL cambiara o si encontraras un proveedor diferente, podrías cambiar esta URL y escribir un cliente diferente para esa API. También, por ejemplo, si cambiaras URL de tu webhook a un canal diferente o si el equipo cambia, también podrías reemplazarlo rápidamente aquí y luego saber que se está usando alrededor de tu base de código, donde sea que esté Entonces, ahora que hemos dockerizado nuestra aplicación, hemos limpiado los mensajes de holgura, y también hemos limpiado valores codificados. Finalmente es hora de que en la siguiente lección construyamos una canalización CICD completa y completa para construir nuestra aplicación e implementarla en Docker Hub Y finalmente cerraremos el curso sacando ese contenedor recién creado de Docker Hub y ejecutándolo una última vez para ver que todo sigue funcionando 18. Creación de una canalización de CD de CI con Circle CI: En la última lección, creamos un archivo de entorno para almacenar todos los valores y secretos codificados en toda nuestra aplicación y reemplazamos esos valores codificados con los nombres de las variables de entorno alrededor de la aplicación. Y ese fue realmente el paso final para que estemos listos para empaquetar y automatizar la forma en que construimos nuestro contenedor. Entonces, en esta lección, estaremos creando una canalización completa de CI CD que construirá y luego probará nuestra aplicación con las pruebas que hemos escrito. Entonces, si esas pruebas pasan, desplegará o cargará nuestro contenedor a Docker Hub Entonces al final, tiraremos de ese contenedor y lo ejecutaremos como prueba final para ver que todo está funcionando. Entonces, para comenzar con CircleCI, primero necesitamos hacer una carpeta que sea Circle CI, y dentro de esta carpeta, un archivo config dot Ahora, lo primero que debes hacer en tu archivo de configuración punto Yamal, similar a la composición de Docker es proporcionar la versión Actualmente, esa versión o la última versión es 2.1. Y también enumeraremos un orbe. Ahora, los orbes son comandos o trabajos preempaquetados que son muy comunes de ejecutar Por ejemplo, tienen un orbe de nodo. Tienen un orbe holgado, y eso solo te ahorra tiempo en lugar de escribir comandos bash explícitos para realizar tareas, tienen cosas preempaquetadas Por ejemplo, envía un mensaje de Slack, y solo tienes que pasar el mensaje de cadena. No tienes que emitir esta declaración de curl o cosas así. En nuestro caso, el único orbe que necesitamos es para el hub Docker, y eso se puede hacer especificando Docker, y tomaremos la última versión de ese orbe Docker, que es necesitamos es para el hub Docker, y eso se puede hacer especificando Docker, y tomaremos la última versión de ese orbe Docker, que es 2.2 0.0. Todo lo que queda ahora son dos partes principales de un archivo yaml de punto de configuración Hay tanto trabajos como flujos de trabajo. Los trabajos son varios pasos que puedes usar una o más veces en tus flujos de trabajo. Entonces podrías pensar en ellos como bloques de construcción individuales, y los flujos de trabajo en realidad se combinan y dicen en qué orden y cómo deben ejecutarse esos trabajos. Por lo general, los flujos de trabajo se enumeran más arriba en el punto de configuración ñame Pero como vamos paso a paso aquí, primero escribiremos los trabajos, y luego escribiremos los flujos de trabajo después. Tiene un poco más de sentido desde una perspectiva paso a paso. Entonces comenzaremos definiendo nuestros trabajos. Y por ahora, realmente solo tenemos un trabajo, y es decir probar nuestra aplicación. Entonces solo lo llamaré prueba tenemos que especificar un directorio de trabajo. Y en el mundo Circle CI, este repositorio es el significante especial para el repositorio local Y vamos a usar una imagen de Docker, y vamos a usar la imagen GO Entonces podemos definir nuestros pasos de lo que realmente queremos que se haga dentro de este trabajo. Entonces primero, vamos a, por supuesto, revisar el código, y podemos guardar en caché nuestro archivo go sum. Esto hará que las construcciones posteriores sean más rápidas. Y vamos a poner check algunos de nuestros go s y también instalaremos dependencias a partir de eso Necesitamos emitir gGet y luego guardaremos ese caché. Entonces eso es por si acaso más adelante, si instalamos nuevos paquetes o cambiamos las versiones de los mismos, eso quedará reflejado con precisión en esta clave que hemos definido para nuestro cache. Y también necesitamos definir en qué camino está ese. Por lo que la mayor parte de esto se tomó de un ejemplo que CircleCI tiene en su sitio para las prácticas recomendadas y mejores para una Y pondré un enlace a eso en los recursos de la Lección. Ahora también necesitamos construir nuestro archivo de entorno porque sabemos que nuestra aplicación no puede ejecutarse sin esas variables de entorno. Entonces vamos a tener otro paso de carrera aquí. El nombre es crear archivo punto N. El comando puede usar la tubería para realizar múltiples pasos o múltiples comandos. Primero vamos a crear ese archivo. Entonces vamos a usar Echo para hacer eco de todas las variables de entorno que necesitamos. Para escapar al entorno CircleCI, utilizamos esta sintaxis, utilizamos esta sintaxis, los corchetes con el signo de dólar, y simplemente tomaremos los mismos nombres que tenemos en Veremos cómo definirlos más adelante en la IU de CircleCI. Y sólo añadiremos a ese nuevo archivo. Así que voy a copiar esto algunas veces, y sabemos que tenemos la raíz URL API alergia. También tenemos nuestra zona horaria cron, y también tenemos esa cadena de horario cron y con esa completa, entonces vamos a emitir pruebas Así que voy a llamar a esto pruebas de ejecución. Y el comando que conocemos de la lección anterior es ir a prueba. Vamos a establecer ese indicador paralelo y también el indicador Verbose, y queremos ejecutarlo en la carpeta tests Así que hemos definido nuestra prueba de trabajo único, y ahora necesitamos definir los flujos de trabajo. Entonces el patrón normal, como mencioné, es que los flujos de trabajo sí van por encima de los trabajos, así que volveremos a subir aquí y también especificaremos nuestros flujos de trabajo. Entonces también solo tenemos un flujo de trabajo, y ese será el flujo de trabajo de producción, y necesitamos especificar los trabajos. Y tenemos nuestro trabajo de prueba, y también vamos a filtrar en la sucursal. Y queremos sólo la rama principal. Y entonces el segundo trabajo que queremos va a hacer uso de este orbe Docker aquí Y ese va a ser Docker Publish. Y la imagen será tanto nuestro nombre de usuario, nombre de repositorio, que también definiremos más adelante en el WebBuI de CircleCI junto Entonces llegaremos a eso en unos instantes. Ahora, también necesitamos definir el orden de estos trabajos. Si no especificamos ningún orden, CircleCI, simplemente los ejecutaremos Eso puede ser útil dependiendo de lo que estés haciendo. Pero claro, en nuestro caso, sí queremos asegurarnos de que esas pruebas pasen antes de publicarlas en nuestro contenedor. La manera de hacerlo es con la directiva requiere, y nosotros requerimos, por supuesto, que el trabajo de prueba termine. Y también queremos filtrar en la rama principal. Ahora bien, hay mucho código Yamil en este archivo, y no está claro si tenemos algún error de sintaxis o problemas, pero afortunadamente, CircleCI proporciona una herramienta CLI donde podemos verificar donde podemos Voy a añadir en los recursos de la lección el enlace a su documentación oficial sobre cómo se puede instalar eso. Ya lo tengo instalado en mi sistema y la forma de verificar la configuración es con CircleCI Config con CircleCI Podemos ver aquí me he olvidado parece el punto y coma aquí Y voy a volver a ejecutar esa comprobación, y también me he olvidado una S. Y finalmente, parece que tenemos una configuración válida aquí. Entonces obtenemos el es válido. Así que ya podemos ver que es bastante práctico para encontrar cualquier tipo de errores tipográficos o problemas de formato en nuestro archivo de configuración Ahora bien, en este punto de tu código, probablemente tendría sentido ramificarse y crear una rama desarrollada. Primero, por supuesto, requiriendo que hayas inicializado el repositorio de Git y asumiendo quizás que todavía estás en la rama principal o maestra, entonces, por supuesto, emitirías, checkout B desarrollar y comprometer todo a esa rama Entonces lo que harías es fusionarte cuando estés listo, fusionarte a tu rama principal o maestra, y entonces eso daría inicio a este caso, tendría que ser la rama principal o bien CircleCI no haría nada Está a la espera de commits a esta rama principal como hemos especificado. Pero si tienes, por ejemplo, tomado la convención de nomenclatura maestra, tendrías que cambiar esto a master para CircleCI haga cualquier cosa En mi caso, ya estoy aquí en el repositorio específico del curso, y tengo un nombre de sucursal personalizado. Así que por ahora, voy a dejar esto como está, y vamos a subirnos a las aplicaciones web tanto Docker Hub como CircleCI y configurar lo que necesitamos Así que dentro del doctor Hubb, inicia sesión o crea una cuenta Si no tienes uno, son gratis. Y simplemente haremos clic en Crear repositorio aquí, y llamaré al mío Allergy Cron Simplemente podemos hacer clic en Crear aquí. Y ahora tenemos un repositorio al que podemos empujar. Entonces vamos a dirigirnos a circleci.com y hacer clic en Y en la página de inicio de sesión aquí, ya que el repositorio en mi caso, está en Github, voy a iniciar sesión con GitHub. Si has decidido seguir junto con Bitbucket por ejemplo, puedes iniciar sesión con Bitbucket Y así estoy en un montón de organizaciones, pero el repositorio en el que hemos estado codificando está en mi cuenta personal. Así que voy a seleccionar eso y verás todos tus repositorios en tu perfil de GitHub Y, por supuesto, quiero que este vaya por curso de aplicaciones del mundo real, y podemos dar clic en Configurar proyecto. Entonces antes de que CircleCI pueda encontrar el archivo Arc fig, tengo que volver aquí en el código y comprometer Entonces voy a agregar todo. Voy a cometer algo así como circleCI Config terminado. Voy a empujar que tengo que establecer el nombre de la lección con el nombre de la sucursal. Entonces aquí debería poder especificar la rama Lección 18, y vemos que CircleCI incluso mirará a través nuestro código y encontrará esa Entonces es realmente, realmente un buen servicio. Disfruto mucho usando CircleCI. Lo hacen muy fácil. Entonces en tu caso, dependiendo de donde hayas empujado, si lo has empujado a la rama desarrollada, si la has empujado a la rama principal o a la rama master, podrías especificarlo aquí, aquí, y ojalá CircleCI encontrara tu punto de configuración YamaFle encontrara tu punto de configuración Entonces, una vez que se encuentre eso, simplemente puede hacer clic en Configurar proyecto. E incluso intentará dar inicio al primer flujo de trabajo. Pero claro, ya que el commit era para la rama Lección 18, ve en la configuración, Bien, no hay nada que hacer para la Lección 18, y simplemente dirá que no hay flujo de trabajo. Entonces, ahora que tenemos nuestro proyecto CircleCI configurado, deberíamos agregar todas esas variables de entorno al entorno CircleCI real Para ello, podemos subir aquí a la configuración del proyecto y por aquí a las variables de entorno. Y podemos agregar nuestros pares de variables de entorno de valor clave. Y sabemos que tenemos nuestra URL de webhook de Slack. Y podemos continuar añadiendo todas las variables que sabemos que necesitamos para nuestra aplicación. Obtuve zona horaria. Tengo el horario de cron. Y ahora también necesitamos agregar algunos para nuestra integración con Docker Hub Entonces necesitamos agregar el nombre de usuario de Docker, el inicio de sesión de Docker, que en realidad son uno y lo mismo, la contraseña de Docker, y el nombre del repositorio de Docker Entonces en mi caso, mi Docker Hub es nuestra cuenta de empresa, Full Stack Craft Entonces voy a estar usando eso tanto para el nombre de usuario de Docker. Y también las variables de entorno de inicio de sesión de Docker. El nombre del repositorio Docker es el nombre que proporcionó para su Y en mi caso, ese es Allergy Cron. Y por último, la contraseña de Docker. Por supuesto, aquí no voy a mostrar eso. Así que ahora hemos definido todas las variables de entorno que necesitamos para ejecutar el pipeline CICD De vuelta al código, ya que en mi caso, ya tengo una rama principal que no quiero estropear, voy a crear una rama separada llamada Pipeline y también actualizar ese filtro de rama en el archivo config dot Yam, y luego podremos probar el pipeline Entonces solo modificaré esto a Pipeline. Y recuerda, por supuesto, en tu caso, puedes dejar esto a Maine o a cualquier sucursal en la que quieras que se dispare tu tubería CICD Entonces voy a crear esa nueva sucursal con G checkout B Pipeline. De hecho se puede ver que estamos en el ramal del gasoducto. Va a sumar todo. Y voy a agregar un mensaje Algo así como rama de tubería personalizada, y podemos empujar. Ahora de vuelta en CircleCI, deberíamos ver que el flujo de trabajo de producción realmente arranca porque CircleCI ve arranca porque CircleCI Podemos hacer clic aquí para ver nuestros dos trabajos. Entonces tenemos nuestro trabajo de prueba y nuestro trabajo publicado Docker. E incluso dentro de los propios trabajos, se pueden ver todos los pasos y la salida. Entonces parece que nuestras pruebas han pasado. Esta es la salida familiar que hemos visto en la lección anterior. Entonces, por supuesto, de vuelta al flujo de trabajo, va a pasar a esa publicación de Docker, y veremos cómo va esto Parece que eso también fue exitoso. Y de hecho, en Docker Hub, sí vemos que se publicó hace unos segundos, por lo que nuestro pipeline de CICD funcionó Ahora bien, aunque nuestra compilación y flujo de trabajo parecen estar funcionando, si realmente fuéramos a tirar nuestro contenedor docker e intentar ejecutarlo, veríamos que G se queja de que no puede encontrar la variable de entorno Hemos olvidado el paso clave en nuestro pipeline de CICD para persistir esa variable de entorno entre estos dos trabajos Y así para hacerlo aquí al final de nuestro trabajo de prueba, podemos especificar este comando persisten al espacio de trabajo y queremos especificar que la raíz está aquí, y solo vamos a persistir ese archivo punto m que creamos aquí. Y luego arriba en nuestro comando Docker publish, necesitamos especificar que cuando estamos publicando o construyendo ese contenedor, queremos adjuntar en esta raíz actual Y luego, cuando Docker construya, tendrá ese archivo de entorno en su espacio de trabajo de compilación Entonces, una cosa muy importante que quiero recalcar aquí es que esto es un poco de riesgo para la seguridad. Así que tenga en cuenta aquí, en este caso, este es un contenedor que cotiza en bolsa, y el archivo estará dentro del contenedor. Entonces, si bien esto está bien para variables públicas como la zona horaria de Cron y la cadena de horario cron, no está bien para secretos como nuestro webhook de slack En ese caso, sugeriría que cree un archivo separado y lo pase al ejecutar su contenedor Docker, donde sea que esté Sin embargo, estos detalles de gestión secreta tienden a ser muy diferentes dependiendo de una organización a otra, y así lo dejaré fuera del alcance de este curso Por ahora, solo ilustraremos cómo podemos incluir este archivo en nuestro CICD Pero solo tenga en cuenta que se trata un posible problema de seguridad. Un pequeño cambio final que necesitamos hacer aquí en nuestro archivo amo configurado es escapar de esta variable de entorno cron schedule Porque aquí tenemos estos asteriscos, cuando son escapados por CircleCI, obtenemos algún comportamiento extraño Entonces, para remediar eso, todo lo que necesitamos hacer es envolver esta variable entre comillas dobles, y eso solucionará el problema de hacer eco de ese valor en nuestro archivo final Entonces, como prueba final para nuestro contenedor, voy a cambiar este horario de corona a algo en los próximos minutos, y luego podremos sacar nuestro contenedor, ejecutarlo, y asegurarnos de que todo esté disparando y funcionando, de hecho, en el momento en que establecemos nuestro horario de cron Entonces son alrededor de las 4:18 en este momento. Entonces voy a borrar esto y volver a agregarlo. Hagamos por 225. Entonces ese es el minuto 25, hora 14, y luego los asteriscos para todos los demás Se puede agregar eso de nuevo en. Y de vuelta al proyecto aquí, volveré a ejecutar el último flujo de trabajo para asegurar que el contenedor se reconstruya con esa nueva variable Así que solo esperamos aquí hasta que se complete la tubería, y luego podemos irnos al doctor Hub, obtener nuestro ID de contenedor y ejecutar ese contenedor. Entonces el pipeline se ha completado, y si saltamos por aquí, a Docker Hub, vemos que tenemos nuestra nueva imagen recién publicada Damos click en eso. Podemos obtener la identificación completa. Voy a copiar eso. Después para ejecutarlo, podemos emitir Docker Run Entonces queremos desapegarse y esa identificación completa del contenedor. Se va a descargar para nosotros y empezar a ejecutarlo. Entonces podemos verificar que se esté ejecutando con P A. Vemos que está funcionando y aún no hay registros, pero sí esperamos a las 2:25, deberíamos obtener una copia loguada de nuestro mensaje de Slack, y, por supuesto, el propio mensaje de Slack Bien, entonces 225 acaba de pasar. Echemos un vistazo a nuestra holgura aquí. En efecto, sí obtenemos ese mensaje. Entonces hoy es un poco lluvioso. La carga de polen es un poco menor que el promedio. Algunas cosas buenas para que yo sepa. Y si volvemos aquí a nuestros registros de Docker, obtenemos esa copia del mensaje que se envía desde ese mensaje de registro que pusimos en punto principal, vamos bastantes lecciones atrás Entonces, enhorabuena. Has llegado al final de la última lección de codificación técnica para este curso. Solo queda una lección, y ese es el tipo de lección Outro y recapitulación que repasa lo que cubrimos en este curso, además de discutir dónde puede encontrar el código, el libro y cualquier otro recurso adicional para el 19. Conclusión: Entonces enhorabuena. Eso es. Ese es el final de este curso de ir para aplicaciones del mundo real. Espero que hayas disfrutado tomándolo tanto como yo disfruté haciéndolo. Solo un recordatorio, hay una versión de libro PDF de este curso. Voy a añadir el enlace a eso en los recursos de la Lección. También está el repositorio GitHub para este curso donde cada lección corresponde a todo lo que hicimos en esa lección. Se les nombra por sucursal. Entonces eso es todo lo que tengo de mi lado. Disfruta escribiendo código G, y los atraparé a todos la próxima vez. O.