Activa JavaScript para disfrutar de los vídeos de la Mediateca.
Introducción a Jenkins - Contenido educativo
Ajuste de pantallaEl ajuste de pantalla se aprecia al ver el vídeo en pantalla completa. Elige la presentación que más te guste:
Bueno, vamos a ver lo que es un entorno de integración continua.
00:00:01
Un entorno de integración continua es un programa que automatiza la tarea de construir y testear un proyecto.
00:00:04
Se hicieron porque se dieron cuenta de que si el proyecto lo construías y lo testeabas frecuentemente,
00:00:15
encontrabas los errores más rápidamente.
00:00:22
Hay muchas aplicaciones que diariamente, semanalmente, te generan una versión de prueba de la aplicación que la gente puede probar.
00:00:26
Yo que sé, en Firefox están las Nightly, pues Firefox Nightly es simplemente una versión de Firefox que cada poco tiempo te la sacan con los nuevos cambios, las nuevas versiones.
00:00:36
Entonces, claro, tiene el problema, o sea, esto lo hacen cada noche, como pone ahí Naily.
00:00:56
Esto tiene el problema de que estás prácticamente sin testear.
00:01:02
El tester eres tú.
00:01:06
Entonces, pues, lo usan para encontrar fallos.
00:01:07
La ventaja de cada usuario es que te puedes encontrar nuevas funcionalidades
00:01:10
que no están disponibles para el resto de los mortales.
00:01:15
Bueno, pues vamos a ver un entorno de integración continua,
00:01:19
que en nuestro caso se llama Jenkins.
00:01:22
En este Jenkins, le damos aquí, aquí tenemos a Jenkins. Esto es una aplicación web y está muy, muy orientada a Linux. Entonces, pues eso, es mejor ejecutarla en Linux.
00:01:26
¿Se puede ejecutar en otros sistemas operativos? Sí, pero vamos a tener que usar Docker y cosas similares. Como es una aplicación web, necesita un servidor web. Vamos a descargar Tomcat.
00:01:45
tonka, aquí lo tenemos
00:01:58
apache tonka, veis que pone aquí
00:01:59
download y nos vamos a ir
00:02:02
a la versión 10
00:02:04
por aquí abajo veis que pone
00:02:06
un tarje z
00:02:08
tarje z es una forma de comprimir
00:02:09
archivos, muy típica de
00:02:12
Unix
00:02:14
descargamos
00:02:14
se usa porque guarda los permisos
00:02:17
los zip no suelen guardar los permisos
00:02:20
bueno, se habrá descargado entero
00:02:22
parece que sí
00:02:23
vale, lo extraigo
00:02:26
de acuerdo, ahí lo tengo extraído
00:02:27
y ahora necesito descargar Jenkins
00:02:32
me voy aquí Jenkins
00:02:34
donde pone aquí download
00:02:36
pues esta página tengo dos versiones
00:02:38
la estable o la semanal
00:02:40
esta es la que os decía que
00:02:42
hacen pues cada poco tiempo
00:02:44
para encontrar fallos y demás
00:02:46
vamos a descargarnos la semanal
00:02:47
aquí me puedo encontrar fallos, pero bueno, para lo que vamos a hacer
00:02:49
nosotros, pues no creo que
00:02:52
de mucho problema, veis que aquí
00:02:54
pone descargar un paquete de
00:02:55
java world o lo descargamos a muy importante muy importante tenéis que
00:02:58
tener instalado java en vuestro equipo si no lo tenéis está instalado tenéis
00:03:03
que tener teclea sudo apt install open jdk
00:03:08
bueno aquí probar la 23 a ver si cuela sino del 22 y si no el 17 vale y
00:03:16
probando, si funciona el 23
00:03:22
pues genial
00:03:24
si no el 22, si no el 17
00:03:26
la que funciona
00:03:28
yo me he instalado la 23
00:03:29
para saber que versión tienes instalada
00:03:32
tecleas Java-version
00:03:34
me dice que yo tengo la 23
00:03:36
bueno pues
00:03:41
me he descargado ya Jenkins
00:03:44
me he descargado ya Jenkins
00:03:45
aquí está Jenkins
00:03:48
bueno pues me coge este fichito
00:03:49
que me he descargado, copiar
00:03:51
me voy aquí al servidor web
00:03:54
y veis que me he metido
00:03:56
la carpeta dentro del servidor
00:03:58
web apps
00:04:00
pues la pego
00:04:01
ya está instalado Jenkins, bueno, falta configurar
00:04:02
pero la instalación ya la hemos hecho
00:04:06
para arrancar
00:04:08
el servidor web Apache
00:04:09
bueno, pues me meto en Apache
00:04:11
Tomcat
00:04:14
lo he descargado
00:04:14
y me meto en la carpeta
00:04:16
bin, vale
00:04:18
y aquí hay un archivo que se llama
00:04:20
Catalina. Pues voy a ejecutar
00:04:22
Catalina. Punto barra
00:04:24
Catalina. Bueno, si lo ejecuto así, sin parámetros,
00:04:26
me va a decir, ¿qué quieres hacer?
00:04:29
Ejecutarlo, pararlo. Voy a poner un Catalina
00:04:30
RAM.
00:04:32
¿De acuerdo? He ejecutado Catalina RAM.
00:04:36
Bueno, que ya
00:04:39
me ha soltado un montón de cosas, ¿veis?
00:04:40
Ejecutado Catalina RAM.
00:04:41
Aquí me está soltando un montón de mensajes
00:04:43
del servidor, que no está funcionando.
00:04:45
¿Veis que está aquí?
00:04:48
¿Lo veis? Bueno, está haciendo
00:04:50
el despliegue. Ah,
00:04:51
Bueno, por aquí
00:04:53
Veis que ponía
00:04:58
Desplegando Jenkins
00:05:00
Desplegando Jenkins
00:05:02
Lo ha desplegado
00:05:05
Parece ser que no he visto que haya errores
00:05:06
Sí, pero ha habido errores
00:05:09
¿Veis? Aquí ha habido errores
00:05:12
Esto es una... Acordaos que hemos bajado
00:05:14
La versión de prueba de Tomcat, o sea
00:05:16
No, perdón, hemos bajado la versión de prueba
00:05:18
De Jenkins, o sea que puede haber errores
00:05:21
Vamos a ver si el invento funciona
00:05:23
para saber si el invento funciona, voy aquí, te creo, localhost 2.8080 barra Jenkins, ¿de acuerdo?
00:05:24
Esto puede tardar un ratito, ¿eh? Esto puede tardar.
00:05:39
Ah, vale, me está funcionando, me está funcionando porque yo ya los tenía instalado de antes.
00:05:45
me voy a cargar la instalación
00:05:53
me voy a cargar la instalación
00:05:56
para eso me abro un terminal
00:06:00
eso no tendría que haber salido
00:06:02
tiene que salirte un mensajito
00:06:07
de que
00:06:08
de que Jenkins
00:06:10
no está
00:06:12
bueno
00:06:14
un momentito que voy a parar la grabación
00:06:16
voy a destruir mi anterior
00:06:20
versión de Jenkins y ahora
00:06:22
continuar
00:06:24
Bueno, vamos a continuar usando la máscara, la edición de vídeo.
00:06:25
Bueno, he desinstalado mi versión anterior de Jenkins.
00:06:34
Si os pasa, tenéis que borrar el servidor web.
00:06:36
Bueno, repetir todo el proceso, borrar el servidor web, volveros a descargarlo, volveros a bajar Jenkins
00:06:42
y antes de hacer todo eso, ejecutar este comando.
00:06:47
O sea, esto que borra la versión anterior de Jenkins.
00:06:49
bueno pues ya estoy en Jenkins
00:06:52
y me dice que para instalarlo
00:06:56
tengo que, veis que me está diciendo
00:06:57
aquí un archivo
00:07:00
por seguridad me dice que
00:07:01
aquí ha escrito una contraseña
00:07:03
y la tengo que copiar aquí, vale
00:07:06
pues la copio, copio ese
00:07:08
archivo, bueno estoy
00:07:10
haciendo un less, veis
00:07:16
aquí me sale la
00:07:17
la contraseña que tengo que copiar
00:07:19
y pegar, pues la copio
00:07:22
y la pego
00:07:23
Continuo. Vale. Muy importante tener la versión adecuada de Java. Si no ha funcionado puede ser que no tengáis instalado Java. Para instalar Java sudo apt install openjdk-23. Si funciona, si no funciona la 22 y si no funciona la 17. Vale.
00:07:26
Esto yo como ya lo tengo hecho, pues nada. Bueno, ya me está diciendo que estoy bienvenido a Jenkins. Instalar los plugins. Vale, pues voy a instalar los plugins sugeridos. Jenkins se basa en plugins y puedo instalar plugins ya por defecto o nuevos que haya hecho la gente.
00:07:54
Fijaros que aquí está instalando un plugin para manejar WeHub, otro para manejar WIP, otro para mandar correos electrónicos. ¿Qué más tiene? Bueno, distintos tipos de autentificación.
00:08:12
Esto del pipeline case, ves que he hablado mucho del pipeline y del lenguaje Groovy. Hay como dos formas de crear scripts. Lo que vamos a hacer en Jenkins es crear scripts, él los va a ejecutar cuando nosotros le programemos.
00:08:30
Podemos bien ejecutarlos manualmente o decir, venga, cada noche me lo ejecutas, que es lo que hacen, por ejemplo, aquí en el Jenkins semanal, ¿no? Tendrán puesto un proceso que semanalmente lo ejecute y lo suba a la página web.
00:08:47
Parece que ya ha terminado la instalación. Bueno, está terminando la instalación. Pues eso, tengo dos formas de crear los scripts de BAS que conozco de siempre o usar este lenguaje que se llama Groovy.
00:09:01
No lo vamos a meter en Groovy porque esto es una versión muy pequeñita, pero vamos a crear nuestro primer usuario. Aquí ponéis vuestro nombre, PP, contraseña, PP, PP, seguridad máximo, nombre PP, aquí ponéis vuestro nombre, aquí no me pongáis PP, ponéis vuestro nombre.
00:09:19
Y aquí abajo, en dirección de email, ponéis la dirección, ¿de acuerdo? Vale, pues ponemos aquí el usuario, la contraseña, el nombre y la dirección de email. Salvar y continuar. Y me dice que Jenkins ya está funcionando, he instalado Jenkins, voy a poder acceder siempre tecleando esta dirección.
00:09:36
salvamos
00:09:58
y vamos a empezar a usar Jenkins
00:10:00
ahora, entre ejecuciones
00:10:02
acordaros que para poder usar Jenkins
00:10:07
tenéis que primero lanzar el servidor
00:10:09
lanzar Catalina, si no lanzáis Catalina
00:10:11
primero pues no vais a poder acceder aquí
00:10:13
bueno, aquí puedo crear
00:10:15
una nueva tarea
00:10:17
creo una nueva tarea
00:10:18
bueno, puedo crear
00:10:21
un proyecto de estilo libre o un
00:10:23
pipeline
00:10:25
el pipeline
00:10:25
el pipeline
00:10:27
los pasos de un pipeline
00:10:30
los pasos de un pipeline
00:10:36
un momentito que los tengo aquí
00:10:39
no he puesto los pasos de un pipeline
00:10:45
no he puesto los pasos de un pipeline
00:10:49
no he puesto los pasos de un pipeline
00:10:55
para unos apuntillos
00:10:58
no he puesto los pasos de un pipeline
00:11:00
los pasos de un pipeline
00:11:01
van a ser en general
00:11:03
bajarme el proyecto
00:11:05
ejecutar
00:11:07
un constructor
00:11:09
si ese constructor no ha tenido fallos
00:11:11
hacer los tests
00:11:14
si no hay errores en los tests
00:11:15
liberar
00:11:18
la aplicación o mandar un mensaje
00:11:20
¿de acuerdo? o sea, los pasos de un
00:11:22
pipeline, los pasos de un
00:11:24
pipeline son
00:11:30
descargar
00:11:31
el proyecto
00:11:38
que puede ser de width, por ejemplo
00:11:42
de width
00:11:44
el segundo paso es construir
00:11:46
build en inglés
00:11:49
que va a ser generalmente
00:11:55
ejecutar un make
00:11:57
o un build.sh
00:11:59
que es un archivo que ya
00:12:00
estará dentro del git
00:12:02
una vez terminada de construir
00:12:04
hacer los tests
00:12:06
que esto todavía no lo hemos visto
00:12:08
y si los tests no dan errores
00:12:10
lo que llaman deploy
00:12:13
que es liberar la aplicación
00:12:14
liberar la aplicación
00:12:17
o mandar un mensaje
00:12:22
que está correcto
00:12:24
estos son los pasos de un pipeline
00:12:28
¿vale? nosotros vamos a crear
00:12:31
un proyecto de estilo libre, le vamos a poner un nombre
00:12:35
que va a ser prueba
00:12:36
prueba, y vamos a crear un proyecto
00:12:37
de estilo libre aquí, le damos
00:12:40
ok, le damos
00:12:42
aquí está, bueno
00:12:48
le puedo poner, ya estoy en la configuración
00:12:53
le puedo poner una descripción
00:12:55
proyecto de prueba
00:12:57
y aquí me vienen un montón
00:13:00
de opciones, pues mira, puede ser por ejemplo
00:13:03
un proyecto de WeHub. Aquí me pone
00:13:05
unas pequeñas
00:13:07
instrucciones. Desechar
00:13:09
ejecuciones antiguas. Bueno, está muy claro que va a
00:13:11
ahorrar el entorno de trabajo
00:13:13
y me lo va a poner a funcionar.
00:13:14
El origen del código fuente
00:13:21
puede ser ninguno o un
00:13:23
WIT. ¿De acuerdo? Pues si es un WIT, tengo que
00:13:25
decir repositorio y aquí añadirle
00:13:27
las credenciales. O sea, tiene que
00:13:29
poner el usuario y el token correspondiente.
00:13:31
puedo ejecutarlo en equipos remotos, Jenkins está pensado para ser usado en máquinas en la nube.
00:13:33
Esto está pensado para que llegue Jenkins, lance un montón de máquinas virtuales en la nube,
00:13:44
a cada una le da una tarea, pues tú vas a compilar, tú vas a hacer test, tú vas a lo que sea.
00:13:52
Y cuando acaban, pues él junta los resultados y apaga esas máquinas virtuales.
00:13:57
Nosotros lo vamos a hacer en local.
00:14:02
Entorno de ejecución.
00:14:04
Esta opción es interesante, borrar el workspace antes de hacer la construcción.
00:14:06
Si activamos esta opción, vais a ver que se pueden crear archivos durante la ejecución.
00:14:11
O sea, por ejemplo, cuando te bajas un width, cuando haces un width pool y te bajas el repositorio,
00:14:17
pues ahí se queda.
00:14:22
Lo puedo borrar antes de empezar.
00:14:22
En el momento lo voy a dejar sin marcar.
00:14:25
Y aquí vienen las partes importantes, los build steps y las acciones finales. Build steps. Aquí puedo añadir yo mis sell scripts para ejecutar. Bueno, pues puedo decir que, por ejemplo, hago un echo, hola mundo, y un echo, adiós mundo. ¿De acuerdo? Este va a ser mi script.
00:14:27
Una vez que tengo escrito mi script, puedo decidir qué acciones hacer al final. Pues mira, puedo subir por Git el proyecto a algún sitio o puedo ejecutar otros proyectos o puedo mandarme un correo electrónico.
00:14:56
Vale, pues hay un montón de opciones.
00:15:13
Si, por ejemplo, digo que me lo publiqué en Wit,
00:15:17
pues me va a decir, mira, que hazlo si solamente ha sido un bueno,
00:15:20
que haga un merge de resultados, que añade una etiqueta, una run, etcétera, etcétera, etcétera.
00:15:25
Lo voy a quitar, ¿vale?
00:15:31
Lo voy a dejar de momento así.
00:15:32
Lo voy a guardar.
00:15:34
Ya tengo mi script, ¿vale?
00:15:35
Y ahora lo arranco.
00:15:37
¿Veis qué me ha dado aquí?
00:15:42
Bueno, aquí en la zona de builds, si no os habéis fijado,
00:15:43
Ha salido esto. Le voy a dar otra vez.
00:15:46
Ahí está. ¿Veis?
00:15:51
Bueno, me lo pone en verde diciendo que la ejecución ha sido correcta.
00:15:52
Es distinto pulsar aquí que pulsar aquí.
00:15:56
Si pulso aquí en el número, me dice que cuánto tiempo ha tardado, etcétera, etcétera, etcétera.
00:15:57
Vuelvo para atrás.
00:16:03
Si pulso aquí en el símbolo verde, me suelta la salida de la consola,
00:16:05
que efectivamente ha sido un éxito porque este script no tiene errores.
00:16:09
¿Qué pasa si hay errores?
00:16:13
Voy a volver.
00:16:15
¿Qué pasa si hay errores?
00:16:17
Bueno, pues me voy aquí a configurar.
00:16:18
Siempre podéis, si pincháis ahí en el nombre del proyecto y le dais a configurar,
00:16:20
pues siempre podéis volver aquí a la configuración de cambiar cosas.
00:16:25
¿Vale?
00:16:28
Vamos a suponer que voy a borrar un archivo que no existe.
00:16:28
¿De acuerdo?
00:16:34
Claro, este archivo no existe.
00:16:35
Esto es un error.
00:16:37
Si lo guardo, vais a ver que la ejecución ahora va a falto.
00:16:39
¿Veis? Ha fallado.
00:16:46
Lo ponen rojo.
00:16:47
y cuando pincho en el símbolo, ves que dice, mira, que aquí no se puede borrar este archivo, entre otras cosas, porque no existe.
00:16:48
Y me informa. A ver... Vamos a otra vez a la configuración. Vamos a hacer que no falle.
00:16:56
Vamos a hacer que no falle. Voy a coger y le voy a hacer un touch. Ahora no va a fallar, ¿no?
00:17:05
Va a caer el archivo y después lo va a borrar. No va a fallar la ejecución.
00:17:14
¿Veis? Ahora ya no da error porque el archivo es X
00:17:18
Bueno, y hasta aquí nuestro pequeño curso de Jenkins
00:17:26
Bueno, aquí en el panel de control puedo controlar los trabajos
00:17:32
Aquí he creado uno, pero puedo crear todos los que quiera
00:17:36
Aquí en administrar Jenkins
00:17:38
Es que esto ya se escapa de este tutorial
00:17:40
Pues puedo cargarle plugins, puedo controlar las nubes
00:17:43
¿Veis? Esto de nodos
00:17:47
Puedo añadir un nodo, es otro equipo en la nube
00:17:48
a que yo me puedo enchufar y mandarle opciones, pues mira, aquí puedo generar las credenciales de acceso a esos nodos o generar nubes, ¿de acuerdo?
00:17:52
Porque esto está pensado para ejecutarlo en una red. Más cositas interesantes, ah, se me olvidaba, bueno, cuando entréis vais a entrar aquí directamente,
00:18:04
bueno, no vais a entrar aquí directamente, te va a pedir tu usuario y contraseña, porque esto funciona con usuario y contraseña,
00:18:14
Si me desconecto, ¿veis que me pide entrar otra vez? ¿De acuerdo? Vale, pues entro. Y entro directamente a este entorno de pro. Puedo ejecutar otras tareas. ¿De acuerdo? Fijaos que no la he programado. No la he programado. De momento vamos a quedarnos aquí, pero puedo programar su ejecución. No lo vamos a ver, pero se puede hacer.
00:18:19
Y una última cosa que decir es que no es habitual poner los scripts aquí directamente. Lo que vamos a hacer es, en nuestro git, en nuestro widget, en nuestro proyecto, vamos a poner un build.sh y lo que vamos a hacer es directamente ejecutar ese build.sh. ¿De acuerdo?
00:18:44
ese build.sh
00:19:05
puede generar errores
00:19:08
¿cómo se generan los errores
00:19:11
en un build.sh?
00:19:12
bueno, aquí descargaría el proyecto
00:19:15
¿de acuerdo?
00:19:16
haría el cd al proyecto
00:19:18
cd al proyecto que sea
00:19:19
cd proyecto
00:19:20
con pwd
00:19:21
y con ls podéis ver
00:19:25
lo que hay
00:19:28
¿de acuerdo? cuando lo ejecutéis
00:19:30
¿de acuerdo?
00:19:32
sería más bien aquí
00:19:34
o sea, imaginaos que es un git
00:19:35
pues ha hecho la descarga
00:19:38
del proyecto
00:19:40
con WD puede ver
00:19:41
donde estáis, con el SBI los archivos
00:19:43
esto es bueno ponerlo para saber donde tengo que entrar
00:19:45
me entro en el proyecto y lo habitual va a ser
00:19:48
ejecutar un .arrapil.sh
00:19:50
y que construya el proyecto
00:19:52
¿cómo este build puede generar
00:19:53
errores? este build puede generar errores
00:19:56
de la siguiente forma
00:19:58
siempre todo script que acaba
00:19:59
todo script
00:20:01
que tenga un exit
00:20:03
que tenga un exit
00:20:06
puede generar errores
00:20:08
si el exit vale 0
00:20:10
no se genera un error, pero si el exit
00:20:12
vale 1, se genera un error, por ejemplo
00:20:14
si aquí pongo el exit
00:20:16
1, va a generar
00:20:20
un error sí o sí
00:20:22
voy a ir ahora
00:20:24
error, lo veis ahí, me ha dado
00:20:27
un fallido, porque
00:20:30
le he obligado a tener un error
00:20:31
¿de acuerdo? puedo hacer que no
00:20:33
de errores con un exit 0
00:20:38
si lo ejecuto, vais a ver que exit
00:20:40
pero no produce errores, ahí está, ¿vale? Pues puedo en un script ver si se producen errores, por ejemplo, wget, wget es un comando que sirve para descargar archivos, ¿de acuerdo?
00:20:45
Pues con este código puedo ver si se ha generado un error o no. O sea, esto funciona. IF es el sí en inglés, el sí condicional.
00:20:59
Si no se ha producido un error, o sea, si $interrogación, $interrogación es la salida de un comando. No es igual a 0, ¿de acuerdo? No es igual a 0. Si no es igual a 0, es que se ha producido un error.
00:21:12
entonces se ejecuta
00:21:30
este código que pongo yo aquí
00:21:33
pues hace esto, hace aquello
00:21:35
y luego le puedo decir que haga un exit1
00:21:36
esto lo puedo poner o no
00:21:39
indicando que se ha producido
00:21:40
un error, ¿vale? por ejemplo
00:21:43
estas líneas
00:21:44
suelen ser muy típicas, aquí estoy
00:21:46
descargando una hoja de estilos
00:21:49
de internet y aquí estoy
00:21:50
comprobando si la descarga ha sido correcta, ya sabéis que
00:21:53
a veces las descargas fallan
00:21:55
si ha sido correcta, esto no lo va a hacer
00:21:56
y si ha sido correcta, todo lo que pongo aquí se va a ejecutar, ¿de acuerdo?
00:21:59
Puedo comprobar si un archivo existe en nuestros programas, por ejemplo,
00:22:05
si pongo un if menos 6 el nombre del archivo, esto se va a ejecutar si el archivo existe.
00:22:11
Este cachito de código se ejecuta si el archivo existe.
00:22:17
Else en inglés significa si no, si no puedo ejecutar este código de aquí, ¿de acuerdo?
00:22:20
O sea, si el archivo existe, se va a ejecutar este código de aquí y si no existe, se va a ejecutar este otro código de aquí.
00:22:27
Esto lo puedo usar para comprobar si se ha ido la cosa bien.
00:22:36
Imaginaos que he hecho el comando wit.
00:22:40
Pues compruebo si la carpeta existe.
00:22:42
Si la carpeta existe, pues hago lo que tenga que hacer.
00:22:44
Y si no existe, pues hago otra cosa.
00:22:47
También puedo programar subidas automáticas a wit.
00:22:51
O sea, imaginaos que tengo que hacer una página web y después esa página web subirla a otro sitio. Pues muy fácil, se usan usando estos comandos, commit-a-m y aquí un texto, lo que le estoy diciendo al comando wit es que no me abra el editor de texto y directamente ponga este texto como etiqueta del commit, ¿de acuerdo?
00:22:53
O sea, es automático. Y luego, aquí está haciendo un WIPUS, ¿de acuerdo? Y le puedo decir el usuario que usa, ¿vale? Pues mira, al proyecto tal, me imaginaos que la dirección del proyecto es esta, ¿no?
00:23:21
pues antes de la dirección del proyecto hay que poner el usuario y la contraseña, ¿vale? O sea, si vuestro proyecto es https.withapp.com barra pp barra proyecto.wit, pues entre el withapp y el barra barra tenemos que poner esto, el usuario, dos puntos y el token y luego un arroba.
00:23:39
esto es un origen, el origen
00:24:01
de muchos fallos, porque
00:24:04
de muchos errores
00:24:05
de seguridad, muchas veces
00:24:07
la gente no se da cuenta y el token acaba por ahí
00:24:10
y ese token se acaba desperdigando
00:24:12
por un
00:24:14
proyecto, llega
00:24:16
una persona malintencionada, se encuentra
00:24:18
el usuario y el token y lo usa
00:24:20
y a veces pues cuelan virus, cuelan
00:24:22
cosas que no debe ser
00:24:24
en proyectos, ¿de acuerdo?
00:24:26
vale, pues ahora
00:24:28
sí que es todo
00:24:30
- Subido por:
- Pedro Luis L.
- Licencia:
- Reconocimiento - No comercial - Compartir igual
- Visualizaciones:
- 148
- Fecha:
- 9 de octubre de 2024 - 19:02
- Visibilidad:
- Público
- Centro:
- IES VILLABLANCA
- Duración:
- 24′ 35″
- Relación de aspecto:
- 1.78:1
- Resolución:
- 1364x768 píxeles
- Tamaño:
- 128.58 MBytes