Muestra las diferencias entre dos versiones de la página.
Próxima revisión | Revisión previa | ||
clase:daw:daw:1eval:tema03 [2020/09/08 18:37] 127.0.0.1 external edit |
clase:daw:daw:1eval:tema03 [2025/05/15 11:35] (actual) admin [Conexión con claves pública/privada] |
||
---|---|---|---|
Línea 2: | Línea 2: | ||
- | ===== Contenidos ===== | + | ===== Despliegue Automatizado |
- | + | ||
- | * NodeJS | + | |
- | * Instalación de NodeJS | + | |
- | * NPM | + | |
- | * Proyectos con node | + | |
- | * Estructura de carpetas | + | |
- | * npm Scripts | + | |
- | + | ||
- | ===== Material ===== | + | |
- | + | ||
- | ==== Despliegue Automatizado ==== | + | |
En el tema anterior hemos visto como desplegar manualmente en los servidores Apache y Nginx. En este tema vamos a ver como hacer lo mismo pero de forma automatizada. Automatizar tareas es fundamental ya que se minimizan los errores que se cometen. Por otro lado el despliegue puede llegar a hacerse decenas de veces al día, por lo que obviamente debe estar automatizado. | En el tema anterior hemos visto como desplegar manualmente en los servidores Apache y Nginx. En este tema vamos a ver como hacer lo mismo pero de forma automatizada. Automatizar tareas es fundamental ya que se minimizan los errores que se cometen. Por otro lado el despliegue puede llegar a hacerse decenas de veces al día, por lo que obviamente debe estar automatizado. | ||
Línea 20: | Línea 9: | ||
- | ==== Estructura de carpetas ==== | + | ===== Estructura de carpetas |
Para poder automatizar el despliegue , lo primero es tener una estructura definida de nuestro proyecto y de nuestro servidor. Durante el curso vamos a usar este esquema tanto en este módulo como en los otros módulos. El esquema he intentado que sea lo mas fiel posible a la realidad de las empresas aunque he intentado simplificarlo. Sin embargo cada empresa tendrá la estructura que se adecue al proyecto que estén desarrollando. | Para poder automatizar el despliegue , lo primero es tener una estructura definida de nuestro proyecto y de nuestro servidor. Durante el curso vamos a usar este esquema tanto en este módulo como en los otros módulos. El esquema he intentado que sea lo mas fiel posible a la realidad de las empresas aunque he intentado simplificarlo. Sin embargo cada empresa tendrá la estructura que se adecue al proyecto que estén desarrollando. | ||
Línea 27: | Línea 16: | ||
/ | / | ||
/src //Donde está todo el código fuente de la aplicación | /src //Donde está todo el código fuente de la aplicación | ||
- | index.html | + | |
- | /assets | + | /java |
- | /img | + | /com |
- | /fonts | + | /daw |
- | / | + | / |
- | / | + | |
- | / | + | / |
- | /boostrap | + | /static |
- | /sass //Código en SASS | + | |
- | /css //código en CSS | + | /assets |
- | /ts | + | /img |
- | /js | + | /fonts |
+ | / | ||
+ | / | ||
+ | / | ||
+ | /boostrap | ||
+ | /scss //Código en SASS | ||
+ | /css //código en CSS | ||
+ | /ts | ||
+ | /js | ||
/docs // | /docs // | ||
/ | / | ||
Línea 46: | Línea 43: | ||
build.sh | build.sh | ||
/ | / | ||
- | /dist //El código " | + | /target |
+ | AppPeliculas-0.0.1-SNAPSHOT.jar | ||
package.json | package.json | ||
Línea 52: | Línea 50: | ||
Hay que fijarse que en git no se debe guardar únicamente la carpeta " | Hay que fijarse que en git no se debe guardar únicamente la carpeta " | ||
- | ==== Carpeta | + | ===== Carpeta |
- | La carpeta '' | + | La carpeta '' |
- | Podemos pensar que debe ser únicamente una copia de la carpeta " | + | |
+ | <note important> | ||
+ | En otros IDE's como NetBeans , esta carpeta puede llamarse '' | ||
+ | </ | ||
+ | |||
+ | Podemos pensar que debe ser únicamente una copia de la carpeta " | ||
+ | * Compilar el código fuente Java a el compilado en los ficheros '' | ||
* Minimizar el código: Hacer que ocupe menos el código JavaScript | * Minimizar el código: Hacer que ocupe menos el código JavaScript | ||
* Ofuscar el código: Para evitar que alguien pueda copiar nuestro código se suele, por ejemplo , cambiar el nombre de las variables por nombres sin sentido. Normalmente se minimiza y se ofusca a la vez. | * Ofuscar el código: Para evitar que alguien pueda copiar nuestro código se suele, por ejemplo , cambiar el nombre de las variables por nombres sin sentido. Normalmente se minimiza y se ofusca a la vez. | ||
Línea 62: | Línea 66: | ||
* Etc. | * Etc. | ||
- | Por ello , por ejemplo, en la carpeta " | + | Por ello , por ejemplo, en la carpeta " |
- | ==== Tareas de Automatización del despliegue ==== | + | ===== Tareas de Automatización del despliegue |
- | Veamos ahora un ejemplo de como desplegar una aplicación web en PHP con SASS , TypeScript y que se despliega en Apache. | + | Veamos ahora un ejemplo de como desplegar una aplicación web en Java con SASS , TypeScript y que se despliega en Apache. |
- | * Copiar el código de " | + | |
+ | | ||
- | | + | |
- | * Transpilar el código TypeScript en JavaScript dentro de la carpeta "dist" | + | * Transpilar |
+ | * Transpilar el código TypeScript en JavaScript dentro de la carpeta "target" | ||
- | | + | |
- | * Borrar el código TypeScript de la carpeta "dist" | + | * Borrar el código TypeScript de la carpeta "target" |
- | | + | * Generar el '' |
- | * Ejecutar el "httpd.exe" | + | |
+ | * Desplegar | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
Para hacer todas esta tareas vamos a usar Scripts del sistema operativo , por ejemplo en Linux se usará " | Para hacer todas esta tareas vamos a usar Scripts del sistema operativo , por ejemplo en Linux se usará " | ||
- | === Transformar SASS en CSS === | + | ==== Transformar SASS en CSS ==== |
* Instalar SASS | * Instalar SASS | ||
- | npm install | + | npm install sass -g |
* Transpilar SASS en CSS | * Transpilar SASS en CSS | ||
- | sass | + | sass ./scss/main.scss |
- | === Transformar TypeScript en JavaScript === | + | ==== Transformar TypeScript en JavaScript |
* Instalar TypeScript | * Instalar TypeScript | ||
Línea 98: | Línea 109: | ||
* Transpilar TypeScript en JavaScript | * Transpilar TypeScript en JavaScript | ||
- | tsc --outDir ./dist/js ./src/ts/*.ts | + | tsc --outDir ./js ./ts/*.ts |
+ | === Generar HTML con los issues === | ||
+ | Para generar un HTML a partir de los los de git se puede usar este script llamado '' | ||
- | ===== Scripts npm ===== | + | <sxh bash> |
+ | # | ||
+ | |||
+ | # Verificar que se pasó un archivo como argumento | ||
+ | if [ $# -ne 3 ]; then | ||
+ | echo "Uso: $0 usuario_de_git repositorio_de_git archivo_de_salida" | ||
+ | exit 1 | ||
+ | fi | ||
+ | |||
+ | # Usuario y repositorio de Git para el enlace de los commits e issues | ||
+ | git_user=" | ||
+ | git_repository=" | ||
+ | |||
+ | # Archivo de salida | ||
+ | output_file=" | ||
+ | |||
+ | # Crear el encabezado HTML | ||
+ | echo "< | ||
+ | echo "< | ||
+ | echo "< | ||
+ | echo "< | ||
+ | echo "< | ||
+ | # Leer el archivo de texto línea por línea | ||
+ | git --no-pager log --pretty=tformat:" | ||
+ | # Separar el cuarto campo en tres partes: prefijo, número y texto | ||
+ | prefijo=(echo "campo4" | ||
+ | numero=(echo "campo4" | ||
+ | descripcion=(echo "campo4" | ||
+ | |||
+ | # Añadir una fila a la tabla HTML | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | echo " | ||
+ | done | ||
+ | |||
+ | # Cerrar la tabla y el HTML | ||
+ | echo "</ | ||
+ | echo "</ | ||
+ | echo "</ | ||
+ | |||
+ | echo " | ||
+ | </ | ||
+ | |||
+ | * Y se ejecuta así: | ||
+ | |||
+ | <sxh python> | ||
+ | ./ | ||
+ | </ | ||
+ | |||
+ | Un ejemplo similar del servidor Tomcat se puede ver en [[https:// | ||
+ | |||
+ | ====== Scripts npm ====== | ||
Para hacer las tareas que acabamos de indicar, se harán scripts de Bash que se dejarán en la carpeta "/ | Para hacer las tareas que acabamos de indicar, se harán scripts de Bash que se dejarán en la carpeta "/ | ||
En los siguientes artículos se explican los scripts npm: | En los siguientes artículos se explican los scripts npm: | ||
+ | * [[https:// | ||
* [[https:// | * [[https:// | ||
* [[http:// | * [[http:// | ||
Línea 113: | Línea 183: | ||
* Crear un Script para node dentro del **packaje.json** | * Crear un Script para node dentro del **packaje.json** | ||
- | < | + | < |
" | " | ||
- | " | + | " |
} | } | ||
</ | </ | ||
* Ejecutar un Script de node. | * Ejecutar un Script de node. | ||
+ | |||
npm run compile-scss | npm run compile-scss | ||
Línea 127: | Línea 198: | ||
- | Veamos ahora tres script que deberíamos siempre tener en cualquier proyecto. | + | |
+ | ==== Ejecutar un Script cuando algo cambia ==== | ||
+ | [[https:// | ||
+ | |||
+ | |||
+ | * Instalar onchange | ||
+ | |||
+ | npm install | ||
+ | |||
+ | |||
+ | * Mostrar un mensaje cada vez que cambia algo en un fichero JavaScript | ||
+ | |||
+ | onchange ' | ||
+ | |||
+ | |||
+ | ===== Maven ===== | ||
+ | Ahora deberemos llamar a nuestro script de '' | ||
+ | |||
+ | Para ello añadiremos el siguiente XML al '' | ||
+ | |||
+ | <sxh xml> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | < | ||
+ | < | ||
+ | <!-- Comando npm --> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | * Para ejecutar Maven usaremos: | ||
+ | |||
+ | <sxh bash> | ||
+ | mvn clean install | ||
+ | </ | ||
+ | |||
+ | Más información: | ||
+ | * [[https:// | ||
+ | |||
+ | ===== Copiar ficheros por scp ===== | ||
+ | Para copiar ficheros locales a un servidor remoto se usa la sintaxis: | ||
+ | |||
+ | scp / | ||
+ | |||
+ | |||
+ | * Ejemplo para copiar el fichero local ''/ | ||
+ | |||
+ | <sxh bash> | ||
+ | scp / | ||
+ | </ | ||
+ | |||
+ | Para copiar ficheros remoto en una carpeta local se usa la sintaxis: | ||
+ | |||
+ | |||
+ | scp mi_usuario_remoto@ip_remota:/ | ||
+ | |||
+ | |||
+ | * Ejemplo para copiar el fichero remoto '' | ||
+ | |||
+ | <sxh bash> | ||
+ | scp logongas@192.168.1.1:/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Ejecutar ordenes en servidores remotos ===== | ||
+ | Para ejecutar ordenes en ordenadores remoto se usa la sintaxis: | ||
+ | |||
+ | ssh mi_usuario_remoto@ip_remota " | ||
+ | |||
+ | * Ejemplo de crear el directorio ''/ | ||
+ | |||
+ | |||
+ | <sxh python> | ||
+ | ssh logongas@192.168.1.1 "mkdir / | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Scripts necesarios ===== | ||
+ | Veamos ahora los script que deberíamos siempre tener en cualquier proyecto. | ||
<sxh js> | <sxh js> | ||
" | " | ||
" | " | ||
- | " | + | " |
- | " | + | |
} | } | ||
</ | </ | ||
+ | * build: Compila el código de **cliente** de '' | ||
- | | + | |
+ | |||
+ | * deploy: Despliega la aplicación en un servidor | ||
+ | |||
+ | npm run deploy | ||
+ | |||
+ | |||
+ | Por lo tanto todo queda de la siguiente forma: | ||
+ | |||
+ | * Para compilar **TODO** | ||
+ | |||
+ | <sxh bash> | ||
+ | mvn clean install | ||
+ | </ | ||
+ | |||
+ | |||
+ | * Para desplegara la aplicación: | ||
+ | |||
+ | <sxh bash> | ||
+ | npm run deploy | ||
+ | </ | ||
+ | |||
+ | ===== Variables | ||
+ | Es posible personalizar los scripts en Bash usando variables de entorno. | ||
+ | |||
+ | * Ejemplo de declaración de variables | ||
+ | |||
+ | <sxh bash> | ||
+ | USER_NAME=logongas | ||
+ | IP_SERVER=192.168.1.1 | ||
+ | </ | ||
+ | |||
+ | Para usar las variables se usa '' | ||
+ | |||
+ | * Ejemplo de uso de las variables | ||
+ | |||
+ | <sxh bash> | ||
+ | scp / | ||
+ | </ | ||
+ | |||
+ | Podemos tener en un fichero externo las variables. | ||
+ | |||
+ | * Ejemplo de '' | ||
+ | <sxh bash: | ||
+ | USER_NAME=logongas | ||
+ | IP_SERVER=192.168.1.1 | ||
+ | </ | ||
+ | |||
+ | |||
+ | Para cargar un fichero de variables se usa el comando '' | ||
+ | |||
+ | * Ejemplo de cargar las variables de '' | ||
+ | <sxh bash> | ||
+ | source config.env | ||
+ | </ | ||
+ | |||
+ | ===== Parámetros del Script ===== | ||
+ | Los Script de bash pueden tener parámetros, | ||
+ | |||
+ | * Ejemplo de script con 1 parámetro | ||
+ | |||
+ | <sxh bash> | ||
+ | ./deploy.sh config.env | ||
+ | </ | ||
+ | |||
+ | * Continuando con el ejemplo se usar '' | ||
+ | |||
+ | <sxh bash; | ||
+ | echo El primera parámetro es $1 | ||
+ | |||
+ | source $1 | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Interpretar las Variables de Bash ===== | ||
+ | Al pasar argumentos a un script se puede hacer de varias maneras. | ||
+ | |||
+ | * Imaginemos el script '' | ||
+ | <sxh bash; | ||
+ | # | ||
+ | echo $1 | ||
+ | </ | ||
+ | |||
+ | Y ahora lo vamos a ejecutar de 3 formas distintas: | ||
+ | |||
+ | <sxh bash> | ||
+ | a=Hola | ||
+ | b=Adios | ||
+ | ./test.sh a b | ||
+ | ./test.sh 'a b' | ||
+ | ./test.sh "a b" | ||
+ | ./test.sh "$a $b" | ||
+ | </ | ||
+ | |||
+ | ¿Va a mostrar siempre '' | ||
+ | |||
+ | Veamos el resultado: | ||
+ | |||
+ | <sxh text> | ||
+ | Hola | ||
+ | a b | ||
+ | Hola Adios | ||
+ | Hola $b | ||
+ | </ | ||
+ | |||
+ | ¿Qué es lo que ha pasado? | ||
+ | |||
+ | ^ Parametros | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | | '' | ||
+ | |||
+ | |||
+ | ===== Instalar Java JRE ===== | ||
+ | Vamos a ver como instalar y usar el JRE: | ||
+ | |||
+ | Para instalar el JRE: | ||
+ | * Descargar el fichero tar.gz desde [[https:// | ||
+ | * Descomprime el fichero '' | ||
+ | <sxh bash> | ||
+ | tar -xf OpenJDK21U-jre_x64_linux_hotspot_21.0.5_11.tar | ||
+ | </ | ||
+ | |||
+ | |||
+ | Comprobar que todo está instalado: | ||
+ | |||
+ | * Crea la variable de entorno '' | ||
+ | <sxh bash> | ||
+ | export JAVA_HOME=$(pwd)/ | ||
+ | </ | ||
+ | |||
+ | * Muestra la versión de java con: | ||
+ | |||
+ | <sxh bash> | ||
+ | $JAVA_HOME/ | ||
+ | </ | ||
+ | |||
+ | Ejecutar un jar: | ||
+ | |||
+ | <sxh bash> | ||
+ | export JAVA_HOME=$(pwd)/ | ||
+ | $JAVA_HOME/ | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | El nombre del fichero '' | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | Si en GitHub no deja subir el '' | ||
+ | |||
+ | * Para dividir un fichero en trozos se usa esta orden: | ||
+ | |||
+ | <sxh bash> | ||
+ | split --bytes=45m nombre_fichero_grande nombre_fichero_grande.trozo_ | ||
+ | </ | ||
+ | |||
+ | |||
+ | Que generará una lista de ficheros del estilo: | ||
+ | |||
+ | nombre_fichero_grande.trozo_aa | ||
+ | nombre_fichero_grande.trozo_ab | ||
+ | nombre_fichero_grande.trozo_ac | ||
+ | ... | ||
+ | Etc. | ||
+ | |||
+ | |||
+ | * Para unir los trozos se usará la orden: | ||
+ | |||
+ | <sxh python> | ||
+ | cat nombre_fichero_grande.trozo_* > nombre_fichero_grande | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Cortafuegos ===== | ||
+ | Para que funcione la aplicación, | ||
+ | |||
+ | * Ejemplo para abrir el puerto '' | ||
+ | <sxh python> | ||
+ | ufw allow 80 | ||
+ | </ | ||
+ | |||
+ | Para permitir que un usuario pueda gestionar el cortafuegos se debe ejecutar la orden: | ||
+ | |||
+ | <sxh python> | ||
+ | sudo visudo | ||
+ | </ | ||
+ | |||
+ | Y añadir una linea. | ||
+ | |||
+ | * Ejemplo a añadir para el usuario '' | ||
+ | <sxh python> | ||
+ | logongas ALL=(ALL) NOPASSWD: / | ||
+ | </ | ||
+ | |||
+ | ===== Conexión con claves pública/ | ||
+ | Para conectarse a un servidor, ya no se usan contraseñas sino que se crear pares de claves (una pública y otra privada). | ||
+ | |||
+ | Para generar | ||
+ | |||
+ | * Generar el par de clave con formato RSA con una logitud de 4096 bits, con el correo '' | ||
+ | |||
+ | <sxh bash> | ||
+ | ssh-keygen -f $HOME/ | ||
+ | </ | ||
+ | |||
+ | Esa orden genera 2 ficheros: | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | * Ejemplo de Contenido de los ficheros | ||
+ | |||
+ | <sxh text; | ||
+ | -----BEGIN OPENSSH PRIVATE KEY----- | ||
+ | b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn | ||
+ | NhAAAAAwEAAQAAAgEAvWjdkq77cuWHPhpleyQU8Q0uDmLqgo7CXNItPbufFC8ZZ5ljp9ms | ||
+ | LxL9x0HwjRLpIc0JdJHbzf5TR5q7MBPEqp20bqm6gjhOB57c8d2jHsqXNkhzf7/ | ||
+ | a8/ | ||
+ | EpJy5b6Sb6h9KY3Cg9TZZGUADvuZ/ | ||
+ | pz1Z+fV4RlusDp3uqLurpgxuAHRH4vEBoDAq44m8PLiLOqkwjijrsNDevh4sN05ngd6y7b | ||
+ | BgqsD074XJoujc1f/ | ||
+ | TzCGxUHEFTeibAROxa/ | ||
+ | xJTv8PwbdaYqODmanEKFu9YKTUOa/ | ||
+ | woWavBS9MwbonuAYbfrwzzCQVG6PmBus0nWrlZ2/ | ||
+ | RmLMRFhLVRFS5dxGrE/ | ||
+ | 0AAAdQkLWs95C1rPcAAAAHc3NoLXJzYQAAAgEAvWjdkq77cuWHPhpleyQU8Q0uDmLqgo7C | ||
+ | XNItPbufFC8ZZ5ljp9msLxL9x0HwjRLpIc0JdJHbzf5TR5q7MBPEqp20bqm6gjhOB57c8d | ||
+ | 2jHsqXNkhzf7/ | ||
+ | 6IxByZf4/ | ||
+ | 9CZ81yjYrk76Xb26Vcespz1Z+fV4RlusDp3uqLurpgxuAHRH4vEBoDAq44m8PLiLOqkwji | ||
+ | jrsNDevh4sN05ngd6y7bBgqsD074XJoujc1f/ | ||
+ | hfyjpcEJ/ | ||
+ | 4UNzd5ZoGaARw5LUCjOixJTv8PwbdaYqODmanEKFu9YKTUOa/ | ||
+ | wfFEO+M2qZVCTJO+4sVMwoWavBS9MwbonuAYbfrwzzCQVG6PmBus0nWrlZ2/ | ||
+ | Y99+rSkaSCFg5EO/ | ||
+ | 9Se3OifP9WNtR4chgYh50AAAADAQABAAACAA7gLEdk/ | ||
+ | nft99N5d3O8rF8L66xVkYVwznyaZQF2NpUs2Lw7p2pUM/ | ||
+ | siD/ | ||
+ | oje+EN72Y2eznBCSpl9UM068uEf+3IZLB6aZF3zAG5sm9/ | ||
+ | A0HWXP7YSDyyAK8pfYjB863YW+/ | ||
+ | ozq/ | ||
+ | UJyh3oMpPk4QbJm8p0VTaQLLgkF6QHGzXwPCQ1MqIuPzTBYzxWCLGM4EZJsf0Bfei0NoKd | ||
+ | kCkPjKLaQZehLL1maYh44fqkpZUjqTWD/ | ||
+ | vNjVRhKa8UeaBr+V0KZjGWE7aWnkuWLubJDShI7wakpRaywZTHoHKN+n9eBhuVpK2LkTVk | ||
+ | Q9ZNtYXC1pfEkk9woCPTXXk5bj3qFKQUdgjnkP1HhXdVXrR6oMbNYOg0Vm60s3DTLJ7EAE | ||
+ | 4iJvELD91zGO40emTJAAABAQCHyqvHj9a1AQ6aLKYa3ke1d/ | ||
+ | N9vVu35NTIkSg2DkLZZWE/ | ||
+ | eMOEZFowSmhAVxCFAgKGEttxenfxn4M98cQOiE1VQFO/ | ||
+ | wc1Fe5vX6sUrrPydaDgGIjICfsBaMihHFahTjhFJ9KjsPNCpKUgwUVaBWg3QwPS3rF+/ | ||
+ | tKthgpePI+mLRLOIaDdSg8WBUQy3LZdKR4rUEfLEnGCtCkiRJKkSSBBmxi/ | ||
+ | XH+v3CtQSZLFm/ | ||
+ | kVZCUUJEamf6d7tMFxiyXXx/ | ||
+ | wpJNqbl8kXnUvTpAnaeyGiKu8KWEg5d6IDxVyyRW8ilmHEOl/ | ||
+ | uGGEY4VT59KtuvL0vyRnVJ7/ | ||
+ | 1yIjpGqapDHJXkNBR2c7OueVYSwHEjmb1IMxxXoLNfXKoxqFJ9VU4XA5I+3ZYMhvJ3YYi3 | ||
+ | jOMQlEiNtAt6/ | ||
+ | pT5JvNfDy3VDmHJ4yrZm5zX4sLTdXeowHWPiW4nxTgZG4ejoJ2/ | ||
+ | tSTSdsLtCOkIM3kEDHHpvp23uYNNUARKuG9shfeiLwbr0aVXw42vck/ | ||
+ | TJHjct81dNyrVDa7SNPgE9O5XRC6D6ybCS230NBg6iQiju1mY0wI05ObaXjiYRt0clsG/ | ||
+ | U8vUt1kKx2PuyiDaTg175cbdP9R2Ev2cjJyK+ccSgJS1+hIlbhj6TkvOf6psO0oPDAEqRq | ||
+ | Q6uW0nc1hF35AAAAGWp1YW5AYWx1bW5vLmZwbWlzbGF0YS5jb20B | ||
+ | -----END OPENSSH PRIVATE KEY----- | ||
+ | </ | ||
+ | |||
+ | |||
+ | <sxh text; | ||
+ | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC9aN2Srvty5Yc+GmV7JBTxDS4OYuqCjsJc0i09u58ULxlnmWOn2awvEv3HQfCNEukhzQl0kdvN/ | ||
+ | </ | ||
+ | |||
+ | Ahora tenemos que ir al **servidor remoto** al que nos queremos conectar e ir a la carpeta del usuario al que nos queremos conectar. | ||
+ | Y añadir al fichero '' | ||
+ | |||
+ | * En el siguiente ejemplo vemos que ya existe una clave y añadimos la nueva que acabamos de crear. | ||
+ | |||
+ | <sxh text; | ||
+ | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDEq0zGyX+fP1av8Si9ywOhX2XaWKp/ | ||
+ | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC9aN2Srvty5Yc+GmV7JBTxDS4OYuqCjsJc0i09u58ULxlnmWOn2awvEv3HQfCNEukhzQl0kdvN/ | ||
+ | </ | ||
+ | |||
+ | Por último para conectarnos al servidor con '' | ||
+ | |||
+ | * Ejemplo con '' | ||
+ | |||
+ | <sxh bash> | ||
+ | ssh -i $HOME/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | * Ejemplo con '' | ||
+ | |||
+ | <sxh bash> | ||
+ | scp -i $HOME/ | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | Si guardamos nuestro par de claves con los nombres de '' | ||
+ | se usarán por defecto al conectarnos a cualquier servidor y no hará falta indicar que las usemos. | ||
+ | |||
+ | Por otro lado en el fichero '' | ||
+ | |||
+ | <sxh text; | ||
+ | Host servidor.ejemplo.com | ||
+ | User usuario | ||
+ | IdentityFile / | ||
+ | </ | ||
+ | |||
+ | Por lo tanto las 3 reglas (en orden de prioridad) | ||
+ | - Se indica en el propio comando '' | ||
+ | - Se indica en el fichero '' | ||
+ | - Se usa '' | ||
+ | - La clave añadida con '' | ||
+ | |||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | El fichero con la clave privada obligatoriamente debe solo puede tener permisos el propio usuario por lo que hay que ejecutar: | ||
+ | |||
+ | <sxh bash> | ||
+ | chmod 600 id_rsa | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Ejercicios ===== | ||
+ | |||
+ | ==== Ejercicio 1.A ==== | ||
+ | Crea un Script en bash llamado " | ||
+ | * Compile el SASS de '' | ||
+ | * Compile el SASS de '' | ||
+ | <sxh > | ||
npm run build | npm run build | ||
+ | </ | ||
+ | Se ejecute el Script " | ||
+ | Haz que se ejecute '' | ||
- | * deploy: Compila y despliega el código. Deja el contenido de '' | + | < |
+ | mvn clean install | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Ejercicio 1.B ==== | ||
+ | Modifica el proyecto anterior , añadiendo un Script en bash llamado " | ||
+ | * Ejecute '' | ||
+ | * Copie el '' | ||
+ | * Ejecute el jar en dicha máquina remota en Linux | ||
+ | <sxh > | ||
npm run deploy | npm run deploy | ||
+ | </ | ||
+ | ==== Ejercicio 1.C ==== | ||
+ | Modifica el proyecto anterior , crean en el script '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
- | * start: Inicia el servidor apache , Compila y despliega el código con cada cambio. En el siguiente apartado se explica como ejecutar un Script cuando hay un cambio en un fichero. | + | <note tip> |
+ | Puedes crear más variables si las necesitas. | ||
+ | </ | ||
- | npm run start | + | Ahora extrae esas variables al fichero '' |
- | === Ejecutar un Script cuando algo cambia === | + | <sxh bash;title:deploy.sh> |
- | [[https://www.npmjs.com/package/ | + | source pruebas.env |
+ | </sxh> | ||
- | * Instalar onchange | + | <note tip> |
+ | Para indicar en Spring el puerto a usar en la aplicación se pasa el valor por la línea de comandos con la opción '' | ||
+ | |||
+ | <sxh bash> | ||
+ | java -Dserver.port=${APP_PORT} -jar mi_app.jar | ||
+ | </ | ||
- | npm install | + | </ |
+ | ==== Ejercicio 1.D ==== | ||
+ | Teniendo 3 servidores distintos donde desplegar: | ||
+ | * pruebas | ||
+ | * preproduccion | ||
+ | * produccion | ||
- | * Mostrar | + | Cada entorno tiene una IP, un usuario y un puerto distinto. |
- | onchange | + | Crea 3 ficheros de variables para cada entorno en la carpeta |
+ | | ||
+ | | ||
+ | | ||
+ | Ahora crea los siguientes scripts en el '' | ||
- | ===== Ejercicios ===== | + | <sxh json> |
+ | { | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | } | ||
+ | } | ||
- | ==== Ejercicio 1 ==== | + | </ |
- | Crea un Script en bash llamado " | + | |
- | Haz que ejecutando: | + | |
- | npm run hola | + | |
- | Se ejecute el Script que acabas de crear. | + | |
- | ¿En que carpeta debería estar el script? | + | Y modifica '' |
- | ==== Ejercicio 2 ==== | + | < |
- | Crea un Script en bash llamado "init.sh" que cree las carpetas que debe tener como mínimo un proyecto | + | source $1 |
- | Haz que ejecutando: | + | </ |
- | npm run init | + | |
- | Se ejecute el Script que acabas de crear. | + | |
- | ¿En que carpeta debería estar el script? | ||
+ | Por último despliega la aplicación en cada uno de los entornos ejecutando | ||
- | ¿Que diferencia hay entre '' | + | * En el entorno de pruebas: |
+ | <sxh bash> | ||
+ | npm run deploy: | ||
+ | </ | ||
- | ==== Ejercicio 3 ==== | + | * En el entorno |
- | Crea un Script en bash llamado " | + | |
- | npm run build | + | |
- | Se ejecute el Script " | + | |
+ | <sxh bash> | ||
+ | npm run deploy: | ||
+ | </ | ||
- | Crea un Script en bash llamado " | + | * En el entorno |
- | npm run deploy | + | |
- | Se ejecute el Script " | + | |
+ | <sxh bash> | ||
+ | npm run deploy: | ||
+ | </ | ||
- | ==== Ejercicio 4 ==== | ||
- | Modifica el proyecto anteriorañadiendo un Script en bash llamado " | ||
- | npm run start | ||
- | Se ejecute el Script " | ||
- | ¿Que diferencia hay entre "npm run deploy" | + | ==== Ejercicio 1.E ==== |
+ | Modifica el script de despliegue de forma que antes de ejecutar '' | ||
+ | ^ Entorno | ||
+ | | Pruebas | ||
+ | | Preproduccion | ||
+ | | Produccion | ||
+ | Para ello modifica los ficheros '' | ||
+ | ==== Ejercicio 1.F ==== | ||
+ | Cambia ahora el script de despliegue para que en la máquina destino se copie tambien el JDK y se use ese JDK de has copiado. | ||
+ | Para ello tendrás que: | ||
+ | * Tener en local el JDK comprimido en la carpeta '' | ||
+ | * Copiar el fichero del JDK en la máquina desino | ||
+ | * Descomprimir el fichero en la máquina desino | ||
+ | * Ejecutar el jar con el jdk que has copiado. | ||
+ | ==== Ejercicio 1.G ==== | ||
+ | Cambia ahora el script de despliegue para que en la máquina destino el cortafuegos abra el puerto que esté usando la app. | ||
+ | ==== Ejercicio 1.H ==== | ||
+ | Crea un par de claves publica/ | ||
+ | Es decir que tanto las órdenes de '' | ||
+ | ==== Ejercicio 1.I ==== | ||
+ | Ahora vamos a separar el proyecto en 2 repositorios. | ||
+ | * El proyecto de Java con todo el código excepto la parte de deploy. Este proyecto lo vamos a llamar '' | ||
+ | * Otro proyecto con solo la parte necesaria para desplegar. Este otro proyecto lo vamos a llamar '' | ||
+ | Ahora deberás hacer lo siguiente: | ||
+ | * Crear 2 repositorios en GitHub para guardar los 2 proyectos. | ||
+ | * '' | ||
+ | * '' | ||
+ | * En el proyecto de desplegar: | ||
+ | * Crea un nuevo fichero de variables de entorno con la URL del proyecto de '' | ||
+ | * En el script de deploy.sh: | ||
+ | * Borrar la carpeta '' | ||
+ | * Descargar el código fuente de la app en '' | ||
+ | * Cambiar a la rama de git adecuada | ||
+ | * Generar el '' | ||
+ | * Copiar los siguientes ficheros en el servidor de despliegue | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * Borrar la carpeta '' | ||
+ | * Ejecutar en el servidor el script '' | ||
+ | * Descomprimir el '' | ||
+ | * Abrir el puerto del cortafuegos | ||
+ | * Crear la variable de entorno '' | ||
+ | * Ejecutar el '' | ||
+ | Con todo ésto lo que hemos conseguido es que descargando únicamente el proyecto '' | ||
+ | |||
+ | Es decir que estará todo totalmente automatizado a excepción de las 2 siguiente órdenes: | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | |||
+ | <note important> | ||
+ | Aunque realmente aun no lo hemos automatizado todo ya que: | ||
+ | * Para ejecutar '' | ||
+ | * Para compilar el código Java nos haría falta Maven | ||
+ | * Para compilar el código Java nos haría falta el JDK | ||
+ | * Para SASS nos haría falta el compilador de SASS | ||
+ | * Para TypeScript nos haría falta ek compilador de TypeScript | ||
+ | * Etc. | ||
+ | </ | ||
+ | |||
+ | Veamos ahora un esquema de como quedarían los directorios más importante de cada máquina. | ||
+ | |||
+ | * Máquina local desde la que se despliega | ||
+ | |||
+ | /Facturas | ||
+ | /src | ||
+ | /main | ||
+ | /java | ||
+ | /resources | ||
+ | /static | ||
+ | index.html | ||
+ | /scss | ||
+ | main.scss | ||
+ | /css | ||
+ | main.css | ||
+ | /scripts | ||
+ | build.sh | ||
+ | / | ||
+ | Facturas-0.0.1-SNAPSHOT | ||
+ | package.json | ||
+ | pom.xml | ||
+ | / | ||
+ | / | ||
+ | id_rsa | ||
+ | id_rsa.pub | ||
+ | /global | ||
+ | app.env | ||
+ | /entornos | ||
+ | pruebas.env | ||
+ | preproduccion.env | ||
+ | produccion.env | ||
+ | / | ||
+ | OpenJDK21U-jdk_x64_linux_hotspot_21.0.5_11.tar.gz | ||
+ | /scripts | ||
+ | deploy.sh | ||
+ | server.sh | ||
+ | package.json | ||
+ | |||
+ | * Maquina remota en la que se despliega | ||
+ | / | ||
+ | /.ssh | ||
+ | authorized_keys | ||
+ | / | ||
+ | /bin | ||
+ | java | ||
+ | server.sh | ||
+ | OpenJDK21U-jdk_x64_linux_hotspot_21.0.5_11.tar.gz | ||
+ | Facturas-0.0.1-SNAPSHOT.jar | ||
+ | | ||
+ | | ||
+ | La solución a estos ejercicio está en: | ||
+ | * [[https:// | ||
+ | * [[https:// | ||