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.