Untitled

Choose a study mode

Play Quiz
Study Flashcards
Spaced Repetition
Chat to Lesson

Podcast

Play an AI-generated podcast conversation about this lesson
Download our mobile app to listen on the go
Get App

Questions and Answers

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?

  • 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?

  • `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?

<p>Copiar el archivo .jar o .war al servidor de destino. (D)</p> Signup and view all the answers

Considerando un proyecto web moderno, ¿cuál de las siguientes transformaciones de código es gestionada durante la fase de 'BUILD'?

<p>Transpilación de código SASS a CSS. (B)</p> Signup and view all the answers

Signup and view all the answers

Flashcards

¿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'?

Copiar el archivo .jar (o .war) desde la carpeta 'target' al servidor de destino (ej: Tomcat).

¿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?

Se utilizan para estandarizar la ejecución de scripts (Bash, etc.) en proyectos web, independientemente del lenguaje o carpeta.

Signup and view all the flashcards

¿Qué hace 'mvn clean install'?

Es un comando de Maven que limpia el proyecto, compila el código, ejecuta pruebas y empaqueta la aplicación.

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 denomina package.
    • El código de "src" se copia en "target".
  • 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.
  • 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 remota 192.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):

    1. Comando ssh o scp con - i
    2. Arch fichero $HOME/.ssh/config para cada servidor
    3. Archivo $HOME/.ssh/id_rsa
    4. 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.

Quiz Team

More Like This

Untitled
110 questions

Untitled

ComfortingAquamarine avatar
ComfortingAquamarine
Untitled
44 questions

Untitled

ExaltingAndradite avatar
ExaltingAndradite
Untitled
6 questions

Untitled

StrikingParadise avatar
StrikingParadise
Untitled
121 questions

Untitled

NicerLongBeach3605 avatar
NicerLongBeach3605
Use Quizgecko on...
Browser
Browser