Tema:
Empaquetado de aplicaciones
Introducción
En esta guía aprenderemos como crear los compilables de aplicaciones que nos serviran para poder desplegar nuestros aplicativos en ambientes cloud native como kubernetes
Objetivo
Objetivo General:
- Compilar aplicativos de diferentes lenguajes de programacion.
Desarrollo del Tema
El primer nivel de automatización que se debe abordar es en el empaquetado, que es el proceso con el cual preparamos solo los archivos necesarios para que neustra aplicación pueda correr en un sistema de servicios. Esto toma en cuenta la cantidad de librerías necesarias, los archivos estáticos necesarios, la configuración definida para el proyecto y resulta ya sea en un archivo ejecutable o una carpeta con estructura de sitio web lista para ser usada en un servidor web.
Demostracion
Empaquetado de aplicativo .net
En esta demostracion vamos a llevar a cabo el empaquetado de un proyecto en .net, posteriormente el laboratorio se trata de un empaquetado de un aplicativo java y node, esto con la intencion de que podamos ver que el proceso es el mismo, lo unico que cambia es la manera en la que se hace la compilacion.
Inicio de demostracion
- Crear un nuevo proyecto en .net
dotnet new console -o App -n DotNet.Docker
-
Probar el funcionamiento del aplicativo base.
cd App dotnet run Hello World! -
Reemplazar el contenido del archivo Program.cs con el siguiente contenido.
var counter = 0; var max = args.Length is not 0 ? Convert.ToInt32(args[0]) : -1; while (max is -1 || counter < max) { Console.WriteLine($"Counter: {++counter}"); await Task.Delay(TimeSpan.FromMilliseconds(1_000)); } -
Publicar la imagen con el siguiente comando.
dotnet publish -c Release -
Validar que se crearon los archivos para su publicacion.
ls bin/Release/net9.0/publish -
Crear un archivo Dockerfile con el siguiente contenido.
FROM mcr.microsoft.com/dotnet/sdk:9.0@sha256:3fcf6f1e809c0553f9feb222369f58749af314af6f063f389cbd2f913b4ad556 AS build WORKDIR /App # Copy everything COPY . ./ # Restore as distinct layers RUN dotnet restore # Build and publish a release RUN dotnet publish -o out # Build runtime image FROM mcr.microsoft.com/dotnet/aspnet:9.0@sha256:b4bea3a52a0a77317fa93c5bbdb076623f81e3e2f201078d89914da71318b5d8 WORKDIR /App COPY --from=build /App/out . ENTRYPOINT ["dotnet", "DotNet.Docker.dll"] -
Crear la imagen con el siguiente comando
buildah build .
Laboratorio: Empaquetado de aplicaciones
Descripción
La presente guía aborda la automatización de la fase de empaquetado del ciclo de vida de la aplicación.
Objetivos
- Preparar el código para ser empaquetado con la información correcta
- Realizar el empaquetado de una aplicación y sus subsecuentes mejoras
Antes de comenzar
- Contar con el acceso al ambiente del laboratorio
Inicio de laboratorio
-
Ingresar al servidor de laboratorio con la llave proporcionada.
export LAB=X ssh student@lab-${LAB}-aio -
Cambiar al usuario root
sudo -i -
Descargar la cli de nerdctl, una alternativa a docker que funciona con containerd, rke2 utiliza containerd como su runtinme.
curl -LO https://github.com/containerd/nerdctl/releases/download/v2.1.3/nerdctl-2.1.3-linux-amd64.tar.gz -
Extraer su contenido y copiarlo a la carpeta de /bin
tar xvfz nerdctl-2.1.3-linux-amd64.tar.gz mv nerdctl /bin -
Exportar la siguiente variable
export CONTAINERD_ADDRESS=/run/k3s/containerd/containerd.sock
JAVA
- Desde una terminal descargue los siguientes repositorios
git clone https://gitlab.com/cicd4212034/api-demo.git java-demo - Acceda a la carpeta
java-demoy verifique el contenido del archivopom.xmlcd java-demo cat pom.xml - Haga pull de la siguiente imagen
nerdctl pull maven:3.8.5-openjdk-18 - Corra un contenedor con una terminal activa usando la imagen de openjdk y un volumen montando la carpeta actual
nerdctl run -it --rm -v $PWD:/usr/src/app maven:3.8.5-openjdk-18 bash - Verifique la versión de Maven y del JDK
mvn -v - Acceda a la carpeta que se monto dentro del contenedor
cd /usr/src/app - Instale las librerías
mvn install -Dmaven.repo.local=$PWD/.m2/repository -DskipTests - Empaquete la aplicación
mvn package -Dmaven.repo.local=$PWD/.m2/repository -DskipTests - Verifique el contenido de la carpeta
targety salga del contenedorls -l target exit - Agregue todos los pasos anteriores dentro de un archivo llamado
build-package.shcon el siguiente contenido#!/bin/bash cd /usr/src/app echo $PWD mvn verify -Dmaven.repo.local=$PWD/.m2/repository -DskipTests mvn package -Dmaven.repo.local=$PWD/.m2/repository -DskipTests ls -l target - Asigne permisos de ejecución al archivo
chmod +x ./build-package.sh - Corra el script desde el contenedor
nerdctl run -it --rm -v $PWD:/usr/src/app maven:3.8.5-openjdk-18 /usr/src/app/build-package.sh - Edite el script agregando notas de información
#!/bin/bash echo "[INFO] Accediendo a la carpeta de la aplicacion" cd /usr/src/app echo $PWD echo "[INFO] Verificando e instalando librerias" mvn verify -Dmaven.repo.local=$PWD/.m2/repository -DskipTests echo "[INFO] Empaquetando en .jar" mvn package -Dmaven.repo.local=$PWD/.m2/repository -DskipTests echo "[INFO] Package Exitoso!" ls -l target echo "Fin" - Pruebe nuevamente ejecutando el script
nerdctl run -it --rm -v $PWD:/usr/src/app maven:3.8.5-openjdk-18 /usr/src/app/build-package.sh - Agregue una variable de ambiente llamada
APP_PATHque reemplace el path del comando cd#!/bin/bash # Env variables export APP_PATH=/usr/src/app echo "[INFO] Accediendo a la carpeta de la aplicacion" cd $APP_PATH echo $PWD echo "[INFO] Verificando e instalando librerias" mvn verify -Dmaven.repo.local=$PWD/.m2/repository -DskipTests echo "[INFO] Empaquetando en .jar" mvn package -Dmaven.repo.local=$PWD/.m2/repository -DskipTests echo "[INFO] Package Exitoso!" ls -l target echo "Fin" - Pruebe nuevamente ejecutando el script
nerdctl run -it --rm -v $PWD:/usr/src/app maven:3.8.5-openjdk-18 /usr/src/app/build-package.sh - Elimine el export de la variable
APP_PATH#!/bin/bash echo "[INFO] Accediendo a la carpeta de la aplicacion" cd $APP_PATH echo $PWD echo "[INFO] Verificando e instalando librerias" mvn verify -Dmaven.repo.local=$PWD/.m2/repository -DskipTests echo "[INFO] Empaquetando en .jar" mvn package -Dmaven.repo.local=$PWD/.m2/repository -DskipTests echo "[INFO] Package Exitoso!" ls -l target echo "Fin" - Asigne la variable
APP_PATHdesde su terminal y ejecute el scriptnerdctl run -it --rm -v $PWD:/usr/src/app \ -e APP_PATH=/usr/src/app \ maven:3.8.5-openjdk-18 /usr/src/app/build-package.sh - Reemplace el parametro
-DskipTestsde los comandos de mvn y escriba la variableMVN_ARGS#!/bin/bash echo "[INFO] Accediendo a la carpeta de la aplicacion" cd $APP_PATH echo "[INFO] Verificando e instalando librerias" mvn verify $MVN_ARGS echo "[INFO] Empaquetando en .jar" mvn package $MVN_ARGS echo "[INFO] Package Exitoso!" ls -l target echo "Fin" - Asigne las variables
APP_PATHyMVN_ARGSdesde su terminal y ejecute el scriptnerdctl run -it --rm -v $PWD:/usr/src/app \ -e APP_PATH=/usr/src/app \ -e MVN_ARGS='-Dmaven.repo.local=/usr/src/app/.m2/repository -DskipTests' \ maven:3.8.5-openjdk-18 /usr/src/app/build-package.sh
NODE
- Desde una terminal descargue los siguientes repositorios
git clone https://gitlab.com/cicd4212034/sample-angular-app.git angular-demo - Acceda a la carpeta angular-demo y verifique el archivo
package.json. - Corra un contenedor con la siguiente imagen y montando la carpeta actual
nerdctl run -it --rm -v $PWD:/usr/src/app node:14.15.5 bash - Acceda a la carpeta que se monto dentro del contenedor
cd /usr/src/app - Configure npm para tener un repositorio local
npm ci --cache ./cache/npm.repository --prefer-offline - Instale las dependencias
npm install - Construya la aplicacion
npm run build - Verifique que en la carpeta actual tenga la carpeta
distls -l dist exit - Cree un script llamado
install-build.shcon el siguiente contenido#!/bin/bash cd /usr/src/app echo $PWD echo N | npm ci --cache ./cache/npm.repository --prefer-offline npm install npm run build ls -l dist - Asigne permisos de ejecucion
chmod +x ./install-build.sh - Ejecute el script
nerdctl run -it --rm -v $PWD:/usr/src/app node:14.15.5 /usr/src/app/install-build.sh - Edite el script agregando el log de informacion a la terminal
#!/bin/bash echo "[INFO] Accediendo a la carpeta de la aplicacion" cd /usr/src/app echo $PWD echo "[INFO] Agregando el cache local" echo N | npm ci --cache ./cache/npm.repository --prefer-offline echo "[INFO] Verificando e instalando librerias" npm install echo "[INFO] Empaquetando en archivos web" npm run build echo "[INFO] Package Exitoso!" ls -l dist echo "Fin" - Ejecute el script
nerdctl run -it --rm -v $PWD:/usr/src/app node:14.15.5 /usr/src/app/install-build.sh - Edite el script reemplazando el path a ingresar por
APP_PATH#!/bin/bash echo "[INFO] Accediendo a la carpeta de la aplicacion" cd $APP_PATH echo $PWD echo "[INFO] Agregando el cache local" echo N | npm ci --cache ./cache/npm.repository --prefer-offline echo "[INFO] Verificando e instalando librerias" npm install echo "[INFO] Empaquetando en archivos web" npm run build echo "[INFO] Package Exitoso!" ls -l dist echo "Fin" - Ejecute el script con la variable asignada
nerdctl run -it --rm -v $PWD:/usr/src/app -e APP_PATH=/usr/src/app node:14.15.5 /usr/src/app/install-build.sh - Edite el script reemplazando los parametros del comando
npm cipor$NPM_CI_ARGS#!/bin/bash echo "[INFO] Accediendo a la carpeta de la aplicacion" cd $APP_PATH echo $PWD echo "[INFO] Agregando el cache local" echo N | npm ci $NPM_CI_ARGS echo "[INFO] Verificando e instalando librerias" npm install echo "[INFO] Empaquetando en archivos web" npm run build echo "[INFO] Package Exitoso!" ls -l dist echo "Fin" - Ejecute el script con la variable asignada
nerdctl run -it --rm -v $PWD:/usr/src/app -e APP_PATH=/usr/src/app \ -e NPM_CI_ARGS='--cache ./cache/npm.repository --prefer-offline' \ node:14.15.5 /usr/src/app/install-build.sh - Salga del contenedor temporal
exit