Podcast
Questions and Answers
En el contexto del despliegue automatizado, ¿cuál de las siguientes acciones NO forma parte tÃpicamente del paso de 'BUILD'?
En el contexto del despliegue automatizado, ¿cuál de las siguientes acciones NO forma parte tÃpicamente del paso de 'BUILD'?
- Borrar el código SASS y TypeScript de la carpeta 'target' después de la transpilación.
- Compilar el código Java y transpilación de TypeScript a JavaScript.
- Copiar el código fuente desde 'src' a 'target'.
- Desplegar el archivo .jar en un servidor remoto. (correct)
¿Cuál es la principal ventaja de utilizar scripts de npm para las tareas de automatización del despliegue en proyectos web?
¿Cuál es la principal ventaja de utilizar scripts de npm para las tareas de automatización del despliegue en proyectos web?
- Permite escribir scripts exclusivamente en Bash.
- Reduce la necesidad de utilizar herramientas como Maven.
- Aumenta la velocidad de ejecución de las tareas de compilación.
- Estandariza la ejecución de scripts, independientemente del lenguaje o la carpeta donde se encuentren. (correct)
¿Qué comando se utiliza comúnmente para ejecutar Maven y realizar tareas de limpieza e instalación en un proyecto?
¿Qué comando se utiliza comúnmente para ejecutar Maven y realizar tareas de limpieza e instalación en un proyecto?
- `mvn deploy`
- `mvn clean install` (correct)
- `bash build.sh`
- `npm install`
Después de la fase de 'BUILD', ¿qué acción sigue inmediatamente como parte del proceso de despliegue automatizado?
Después de la fase de 'BUILD', ¿qué acción sigue inmediatamente como parte del proceso de despliegue automatizado?
Considerando un proyecto web moderno, ¿cuál de las siguientes transformaciones de código es gestionada durante la fase de 'BUILD'?
Considerando un proyecto web moderno, ¿cuál de las siguientes transformaciones de código es gestionada durante la fase de 'BUILD'?
Flashcards
¿Qué es 'BUILD' en el despliegue?
¿Qué es 'BUILD' en el despliegue?
Compila el código (SASS a CSS, TypeScript a JS), copia el código fuente en la carpeta 'target', genera el artifact (.jar o .war) y borra los archivos innecesarios.
¿Qué implica la etapa de 'Desplegar'?
¿Qué implica la etapa de 'Desplegar'?
Copiar el archivo .jar (o .war) desde la carpeta 'target' al servidor de destino (ej: Tomcat).
¿Qué significa 'Ejecutar' en el contexto de despliegue?
¿Qué significa 'Ejecutar' en el contexto de despliegue?
Implica ejecutar el archivo .jar en el servidor, haciendo que la aplicación esté activa y accesible.
¿Qué son los Scripts de npm?
¿Qué son los Scripts de npm?
Signup and view all the flashcards
¿Qué hace 'mvn clean install'?
¿Qué hace 'mvn clean install'?
Signup and view all the flashcards
Study Notes
- Aquà están las notas de estudio detalladas:*
Tareas de Automatización del Despliegue
- BUILD: Compila el código SASS, elimina los archivos
.SASS
y conserva el.CSS
compilado.- En Maven, el
Build
se denominapackage
. - El código de "src" se copia en "target".
- En Maven, el
- Compilación del código Java.
- Transpilación del código SASS a CSS dentro de la carpeta "target".
- Transpilación del código TypeScript a JavaScript dentro de la carpeta "target".
- Eliminación del código SASS de la carpeta "target".
- Eliminación del código TypeScript de la carpeta "target".
- Generación del archivo
.jar
. - Despliegue:
- El archivo
.jar
de la carpeta "target" se copia en el servidor donde se va a ejecutar, o se copia el archivo.war
en Tomcat.
- El archivo
- Ejecución del archivo
.jar
.
Transformación de SASS a CSS
- Instalación de SASS (ejemplo):
npm install sass -g
- Transpilación de SASS a CSS (ejemplo):
sass ./scss/main.scss ./css/main.css
Transformación de TypeScript a JavaScript
- Instalación de TypeScript (ejemplo):
npm install typescript -g
- Transpilación de TypeScript a JavaScript (ejemplo):
tsc --outDir ./js ./ts/*.ts
Scripts npm
- Permiten homogeneizar la ejecución de scripts mediante los Scripts de npm.
- Un script para node se crea dentro del archivo
package.json
. Ejemplo:
"scripts": {
"compile-scss": "sass ./scss/main.scss ./css/main.css"
}
- Ejecución de un Script de node:
npm run compile-scss
Ejecutar un Script cuando algo cambia
onchange
permite ejecutar un comando cuando cambia algún fichero.- Instalación de
onchange
:
npm install onchange -g
- Ejemplo para mostrar un mensaje cada vez que cambia un fichero JavaScript:
onchange '**/*.js' -- echo Ha cambiado un fichero JavaScript
- Para ejecutar Maven, se utiliza:
mvn clean install
Copiar ficheros por scp
- Para copiar ficheros locales a un servidor remoto, se utiliza la sintaxis:
scp /mi_carpeta_local/mi_fichero mi_usuario_remoto@ip_remota:/mi_carpeta_remota
- Ejemplo:
scp /home/logongas/app.jar [email protected]:/opt
Copiar ficheros remotos a una carpeta local
- Sintaxis:
scp mi_usuario_remoto@ip_remota:/mi_carpeta_remota/mi_fichero /mi_carpeta_local
- Ejemplo:
scp [email protected]:/opt/app.jar /home/logongas
Ejecutar ordenes en servidores remotos
- Sintaxis:
ssh mi_usuario_remoto@ip_remota "comando"
- Ejemplo crear un directorio
/home/logongas/miapp
en la máquina remota192.168.1.1
ssh [email protected] "mkdir /home/logongas/miapp"
Scripts necesarios en proyectos
- Scripts que siempre se deberÃan tener:
"scripts": {
"build": ".\\scripts\\build.sh",
"deploy": "mvn clean install && .\\scripts\\deploy.sh"
}
build
: Compila el código de cliente de "src" y lo deja en "target", incluyendo la compilación de TypeScript y SASS.
npm run build
deploy
: Despliega la aplicación en un servidor.
npm run deploy
Comandos importantes:
- Para compilar TODO el código:
mvn clean install
- Para desplegar la aplicación:
npm run deploy
Variables de entorno
- Se usan para personalizar los scripts en Bash.
- Ejemplo de declaración variables:
USER_NAME=logongas
IP_SERVER=192.168.1.1
- Para usar variables ${}, también se puede usar $
- Ejemplo de uso variables:
scp /home/logongas/app.jar ${USER_NAME}@$IP_SERVER:/opt
Ficheros externos de variables
- Ejemplo de
config.env
:
USER_NAME=logongas
IP_SERVER=192.168.1.1
- Para cargar un fichero de variables, se usa el comando
source
. Ejemplo:
source config.env
Parámetros del Script
-
Los scripts de bash, $1, $2, $3, etc., denotan la posición del parámetro.
-
Ejemplo script con 1 parámetro ./deploy.sh config.env
-
Siguiendo el ejemplo usar $1 el primer parámetro
deploy.sh
echo El primer parámetro es $1
source $1
Interpretar las Variables de Bash
- Se puede hacer de varias maneras al pasar argumentos a un script
test.sh
#!/bin/bash
echo $1
- Ejemplo:
a=Hola
b=Adios
./test.sh $a $b
./test.sh '$a $b'
./test.sh "$a $b"
./test.sh "$a \$b"
Parámetros | Resultados | Explicación | |
---|---|---|---|
$a $b | Hola | Lo toma como 2 argumentos separados y solo muestra Hola porque solo se muestra el primer argumento | |
'$a $b' | $a $b | Todo ahora es un único argumento, pero con la peculiaridad de que no interpreta las variables (y otras cosas) de BASH | |
"$a $b" | Hola Adios | Todo ahora es un único argumento, pero si que se interpretan las variables de bash | |
"$a $b" | Hola $b | Todo ahora es un único argumento, pero si que se interpretan las variables de bash aunque no se evalúa la variable $b ya que está escapada con \. |
Instalar Java JRE
- Para instalar y usar el JRE:
- descargar Temurin download
- Descomprimir el fichero tar.gz en la carpeta actual creará una carpeta con el JRE:
tar -xf OpenJDK21U-jre_x64_linux_hotspot_21.0.5_11.tar -C .
- Crea Variable JAVA_HOME:
export JAVA_HOME=$(pwd)/jdk-21.0.5+11-jre
- Muestra la versión de java con:
$JAVA_HOME/bin/java -version
- Ejecutar un jar:
export JAVA_HOME=$(pwd)/jdk-21.0.5+11-jre
$JAVA_HOME/bin/java -jar mi_app.jar
- Si GitHub restringe OpenJDK21U-jre_x64_linux_hotspot_21.0.5_11.tar.gz puedes dividirlo:
split --bytes=45m nombre_fichero_grande nombre_fichero_grande.trozo_
- Generando ficheros:
nombre_fichero_grande.trozo_aa
nombre_fichero_grande.trozo_ab
nombre_fichero_grande.trozo_ac
- Para unir los trozos se usará la orden:
cat nombre_fichero_grande.trozo_* > nombre_fichero_grande
Cortafuegos
- Abrir los puertos, usa ufw.
ufw allow numero_puerto.
- Ejemplo abriendo el puerto 80
ufw allow 80
- Usuario gestiona firewall:
sudo visudo
- Añadir una linea para permitir gestionar el cortafuegos (ejemplo):
logongas ALL=(ALL) NOPASSWD: /usr/sbin/ufw
- Usar el parámetro- i: ssh
ssh -i $HOME/.ssh/id_rsa [email protected] "mkdir /home/logongas/miapp"
- Ejemplo con scp
scp -i $HOME/.ssh/id_rsa /home/logongas/app.jar [email protected]:/opt
- Archivos $HOME/.ssh/id_rsa y $HOME/.ssh/id_rsa.pub uso predeterminado
$HOME/.ssh/config
- Establece el uso de claves en servidores:
Host servidor.ejemplo.com
User usuario
IdentityFile /ruta/de/mi_clave_privada
-
Para saber que clave privada usar (prioridad):
- Comando ssh o scp con - i
- Arch fichero $HOME/.ssh/config para cada servidor
- Archivo $HOME/.ssh/id_rsa
- Clave añadida con ssh-agent
-
Permisos claves privadas ejecución
chmod 600 id_rsa.pub
TEMA 7 : DOCKER
- Instala Docker en Ubuntu:
snap remove docker
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-clicontainerd.io
- Instrucciones actualizadas Install Docker Engine on Ubuntu
- Comprueba que funciona:
sudo docker container run hello-world
Gestión de Imágenes
- DockerHub para descargar imágenes
- Similar github para imagenes docker
Ordenes
Orden | Explicación |
---|---|
docker image pull | Bajar una imagen de DockerHub |
docker image rm | Borrar una imagen en local |
docker image Is | Ver las imagenes que hay en local |
docker image save | Exportar una imagen a un fichero |
docker image load | Importan una imagen desde un fichero |
Uso
- Tiene parámetro con nombre imagen descargar
- Formato de la imagen usuario/nombre de la imagen:tag de la imagen
Descarga de ejemplo
docker image pull mysql/mysql-server:8.0.22
Proxy
- Para configurar en clase:
mkdir /etc/systemd/system/docker.service.d
echo "[Service]" >> /etc/systemd/system/docker.service.d/http-proxy.conf
echo "Environment=\"HTTP_PROXY=http://172.16.0.9:8080/\"" >> /etc/systemd/system/docker.service.d/http-proxy.conf
systemctl daemon-reload
- Si todo bien:
systemctl show --property Environment docker
- Deberá mostrar: Environment=HTTP_PROXY=HTTP_PROXY=http://172.16.0.9:8080/"
Gestión de Contenedores
Orden | Explicación |
---|---|
docker container run | Crear un nuevo contenedor y ejecutarlo a partir de una imagen |
docker container start | Iniciar un contenedor que está parado |
docker container stop | Parar un contenedor |
docker container rm | Borrar un contenedor que está parado |
docker container Is | Ver los contenedores que hay |
docker container exec | Ejecutar una orden en el contenedor (Shell) |
docker container stats | Mostrar uso de CPU, memoria |
docker container logs | Muestra lo que se llama en Linux stdout y stderr |
-
Ordenes importantes:
docker container run
docker container exec
-
Ejemplo:
-
Los datos de "/var/lib/mysql" se guardarán carpeta local "/opt/mariadb".
-
Password root MYSQL_ROOT_PASSWORD=root
-
Puerto 4000
-
Contenedor "prueba_mariadb"
docker container run \
- dit \
- -restart always \
- v /opt/mariadb:/var/lib/mysql\
- e MYSQL_ROOT_PASSWORD=root \
- p 4000:3306 \
- -name prueba_mariadb \
- -hostname prueba_mariadb \
mariadb:10.1
Opciones
--rm: Que se borre el contenedor si éste se para.
-w carpeta: Carpeta en la que se estarán en el contenedor.
--pull=never: Hace que si no existe la imagen no la descargue.
docker container run \
- dit \
- -rm \
- -pull never \
- w/var/lib/mysql \
- v /opt/mariadb:/var/lib/mysql \
- e MYSQL_ROOT_PASSWORD=root \
- p 4000:3306 \
- -name prueba_mariadb \
- -hostname prueba_mariadb \
mariadb:10.1
Uso
docker container exec -it nombre_container cat /etc/passwd
- Ejecutar bash:
docker container exec -it nombre_container /bin/bash
TEMA 8 Despliegue avanzado en Servidor
- Crear imágenes propias usando
docker buildx build
:
docker buildx build --tag nombre_imagen:etiqueta --file ruta_del_dockerfile ruta_contexto_ficheros
- Nombre y tag:
--tag nombre_imagen: etiqueta
- Ruta del Dockerfile:
--file ruta_del_dockerfile
- Contexto de los ficheros:
ruta_contexto_ficheros
Ejemplo de uso
docker buildx build -t mi_aplicacion_web:1.0 ./src
Estructura Básica del Dockerfile
Especifica imagen base
FROM imagen_base:version
Instrucciones configurar imagen
RUN comando1
RUN comando2
Copia archivos locales al contenedor
COPY origen destino
Expone un puerto en el contenedor:
EXPOSE puerto
El directorio de trabajo
WORKDIR /directorio
Define variables de entorno
ENV variable=valor
Comando ejecutar o servicio
CMD ["comando", "argumento"]
Ejemplos
- Indica la imagen base:Versión opcional
FROM eclipse-temurin:17.0.10_7-jdk
- Ejecuta comandos nueva capa del contenedor
RUN mkdir /opt/app
- Copiar archivos:
COPY ./app.jar /opt/app
- Copiar por comando o descargarlos RUN para crear
- Copiarlos fuera con COPY / RUN
- **
Ventaja
- Permitir la imagen y están siempre ahÃ
- No necesitas descargar
Desventaja
- descarga previamente
- desaparecer internet.
Informa a Docker que el contenedor escuchará puerto
EXPOSE 8080
Establece el directorio de trabajo para cualquier instrucción posterior:
WORKDIR /opt/app
Variables entorno en Dockerfile
ENV ENTORNO=produccion
Especifica el comando predeterminado ejecutará iniciar:
CMD ["java", "-jar", "/opt/app/app.jar"]
Ejecutar app java
- Imagen basada en JDK 17
- Fichero maquina: /opt/peliculas/target/app.jar en /opt/app.
- Ejecuta el App Java:
FROM eclipse-temurin:17.0.10_7-jdk
mkdir /opt/app
COPY /opt/peliculas/target/app.jar /opt/app
WORKDIR /opt/app
EXPOSE 8080
CMD ["java", "-jar", "/opt/app/app.jar"]
Docker Compose
Define la sección services
en un arch YAML
Estructura Básica de un archivo docker-compose.yml
Sección | Explicación |
---|---|
services | Configuración del servicio |
nombre_contenedor_1: | Primer servicio |
image | Imagen de servicio: ej imagen_serviciol |
restart | Opciones reinicio: ej always servidor |
hostname | Nombre del Host |
volumes | /ruta/host:/ruta/contenedor |
ports | "puerto_host:puerto_contenedor" |
environment | VARIABLES=valor |
tty | true |
stdin_open | true |
pull_policy | never |
nombre_contenedor_2: | Configuración del segundo servicio |
services:
nombre_contenedor_1:
image: imagen_serviciol
restart: opciones si se reinicia el servidor
hostname: nombre del host
volumes:
/ruta/host:/ruta/contenedor
ports:
"puerto_host:puerto_contenedor"
environment:
VARIABLE=valor
tty: true
stdin_open: true
pull_policy: never
nombre_contenedor_2:
# Configuración del segundo servicio
Comandos Docker Compose
- Iniciar la aplicación
docker compose up -d
- Detener y eliminar:
docker compose down
- Muestra el estado:
docker compose ps
Ejemplo
services:
peliculas_java:
image: temurin_peliculas
restart: always
hostname: peliculas_java
volumes:
/opt/peliculas/target:/opt/app
ports:
"80:8080"
peliculas_mysql:
image: mysql:8.3.0
restart: always
hostname: peliculas_java
environment:
MYSQL_ROOT_PASSWORD=peliculas
MYSQL_DATABASE=peliculas
MYSQL_USER=peliculas
MYSQL_PASSWORD=peliculas
- Ejecutar
docker compose up -d
Estructura ficheros:
/FacturaDespliegue
docker-compose.yml
deploy.sh
/mysql
/volumes
/data
/logs
/build
Dockerfile
/src
my.cnf
/java
/volumes
/logs
/build
Dockerfile
/src
/opt
/app
facturas.jar
/compilar
/volumes
/app
pom.xml
/src
/scripts
/target
/build
/facturas.jar //Se crea después al ejecutar el contenedor
Dockerfile
/src
/root
/.m2
/opt
settings.xml
/java
/maven
/app
Compilar
- Crea imagen Docker compilar aplicaciones JAVA
- JDK
- Maven
- NodeJs
- Sass
Fichero Docker File
`FROM ubuntu:24.04`
`ENV DEBIAN_FRONTEND=noninteractive`
`RUN apt-get update`
`RUN apt-get install -y curl unzip ca-certificates`
`RUN curl -fsSL` `https://deb.nodesource.com/setup_lts.x | bash -`
`RUN apt-get install -y nodejs`
install -g sass
`COPY /opt /opt`
ENV JAVA_HOME=/opt/java
ENV PATH="${JAVA_HOME}/bin:${PATH}"
ENV MAVEN_HOME=/opt/maven
ENV PATH="${MAVEN_HOME}/bin:${PATH}"
`RUN mkdir -p /root``
`COPY /root /root``
`WORKDIR /opt/app`
`CMD ["mvn", "clean", "install"]`
File settings.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2
3
4
5
6 http://maven.apache.org/xsd/settings-1.0.0.xsd">
7
8
9
10 central
11 central
12 https://repo.maven.apache.org/maven2
13 default
14
15
16
Ejecutarlo todo
sudo docker image rm logongas/compilar:1.0.0
sudo docker buildx build--tag logongas/compilar:1.0.0 --file ./build/Dockerfile ./build/src
sudo docker container run \
- it \
- -rm
- -pull=never \
- v./volumes/app:/opt/app\
- -name compilar \
- -hostname compilar\
- u $(id -u):$(id -g)
logongas/compilar:1.0.0
- Cree una imagen:
docker image pull logongas/compilar:1.0.0
TEMA 9 Despliegue continuo
- Hay varias formas de hacerlo
Jenkins GitHub Actions
Contenedor con Jenkins
Jenkins es un "Servidor de automatización (Documentación amplia enlaces)
- Jenkins es el camino para software de calidad
Github Action
Acciones al cambiar
- Fichero codigo fuente proyecto java:
.github/workflows/desplegar.yml
Desplegar
name: Desplegar
on:
workflow_dispatch:
push:
branches:
master
jobs:
vpn_job:
runs-on: ubuntu-latest
steps:
name: Checkout repo
uses: actions/checkout@v3
name: Configurar la VPN
working-directory: .github/workflows
run: |
sudo apt-get update && sudo apt-get install -y openvpn openvpn-systemd-resolved
echo "${{ secrets.VPN_CA }}" | base64 --decode > ca.crt
VPN_USERNAME }}" > credenciales.txt
VPN_PASSWORD }}" >> credenciales.txt
sed -i "s/REPLACE_VPN_IP/${{ secrets.VPN_IP }}/" vpn-pve.conf
sed -i "s/REPLACE_VPN_PORT/${{ secrets.VPN_PORT }}/" vpn-pve.conf
name: Connect to VPN
working-directory:.github/workflows
run: sudo openvpn --config vpn-pve.conf --daemon-log openvpn.log
name: Wait for VPN to establish
run: sleep 10
name: Test Connection
working-directory:.github/workflows
run: sudo cat openvpn.log
name: Test Connection
run:ping -c 2 192.168.59.104
name: Run remote script
working-directory:.github/workflows
env:
SSH_PRIVATE_KEY: ${{ secrets.SERVER_ID_RSA }}
run: |
echo "$SSH_PRIVATE_KEY" > ./id_rsa
chmod 600 ./id_rsa
ssh -i./id_rsa -o StrictHostKeyChecking=no -t ${{ secrets.SERVER_USERNAME}}@192.168.59.104 'sudo rm -rf DesplegarFacturasDocker'
sshi./id_rsa -o StrictHostKeyChecking=no -t ${{ secrets.SERVER_USERNAME}}@192.168.59.104 'sudo git clone https://github.com/lgonzalezmislata/DesplegarFacturasDocker.git'
sshi./id_rsa -o StrictHostKeyChecking=no -t ${{ secrets.SERVER_USERNAME }}@192.168.59.104 'sudo chmod 77 -R/DesplegarFacturasDocker'
sshi./id_rsa -o StrictHostKeyChecking=no -t ${{ secrets.SERVER_USERNAME }}@192.168.59.104 'cd DesplegarFacturasDocker && sudo ./deploy.sh 2>&1'
- Al hacer cualquier cambio en rama master ejecutará
Ejemplo:
https://github.com/lgonzalezmislata/Facturas/tree/master/.github/workflows
Studying That Suits You
Use AI to generate personalized quizzes and flashcards to suit your learning preferences.