Skip to content

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

  1. Crear un nuevo proyecto en .net
dotnet new console -o App -n DotNet.Docker
  1. Probar el funcionamiento del aplicativo base.

    cd App
    dotnet run
    Hello World!
    

  2. 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));
    }
    

  3. Publicar la imagen con el siguiente comando.

    dotnet publish -c Release
    

  4. Validar que se crearon los archivos para su publicacion.

    ls bin/Release/net9.0/publish
    

  5. 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"]
    

  6. 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

  1. Ingresar al servidor de laboratorio con la llave proporcionada.

    export LAB=X
    ssh student@lab-${LAB}-aio 
    

  2. Cambiar al usuario root

    sudo -i
    

  3. 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
    

  4. Extraer su contenido y copiarlo a la carpeta de /bin

    tar xvfz nerdctl-2.1.3-linux-amd64.tar.gz
    mv nerdctl /bin
    

  5. Exportar la siguiente variable

    export CONTAINERD_ADDRESS=/run/k3s/containerd/containerd.sock
    

JAVA

  1. Desde una terminal descargue los siguientes repositorios
    git clone https://gitlab.com/cicd4212034/api-demo.git java-demo
    
  2. Acceda a la carpeta java-demo y verifique el contenido del archivo pom.xml
    cd java-demo
    cat pom.xml
    
  3. Haga pull de la siguiente imagen
    nerdctl pull maven:3.8.5-openjdk-18
    
  4. 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
    
  5. Verifique la versión de Maven y del JDK
    mvn -v
    
  6. Acceda a la carpeta que se monto dentro del contenedor
    cd /usr/src/app
    
  7. Instale las librerías
    mvn install -Dmaven.repo.local=$PWD/.m2/repository -DskipTests
    
  8. Empaquete la aplicación
    mvn package -Dmaven.repo.local=$PWD/.m2/repository -DskipTests
    
  9. Verifique el contenido de la carpeta target y salga del contenedor
    ls -l target
    exit
    
  10. Agregue todos los pasos anteriores dentro de un archivo llamado build-package.sh con 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
    
  11. Asigne permisos de ejecución al archivo
    chmod +x ./build-package.sh
    
  12. 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
    
  13. 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"
    
  14. 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
    
  15. Agregue una variable de ambiente llamada APP_PATH que 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"
    
  16. 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
    
  17. 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"
    
  18. Asigne la variable APP_PATH desde su terminal y ejecute el script
    nerdctl 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
    
  19. Reemplace el parametro -DskipTests de los comandos de mvn y escriba la variable MVN_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"
    
  20. Asigne las variables APP_PATH y MVN_ARGS desde su terminal y ejecute el script
    nerdctl 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

  1. Desde una terminal descargue los siguientes repositorios
    git clone https://gitlab.com/cicd4212034/sample-angular-app.git angular-demo 
    
  2. Acceda a la carpeta angular-demo y verifique el archivo package.json.
  3. 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
    
  4. Acceda a la carpeta que se monto dentro del contenedor
    cd /usr/src/app
    
  5. Configure npm para tener un repositorio local
    npm ci --cache ./cache/npm.repository --prefer-offline
    
  6. Instale las dependencias
    npm install
    
  7. Construya la aplicacion
    npm run build
    
  8. Verifique que en la carpeta actual tenga la carpeta dist
    ls -l dist
    exit
    
  9. Cree un script llamado install-build.sh con 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
    
  10. Asigne permisos de ejecucion
    chmod +x ./install-build.sh
    
  11. Ejecute el script
    nerdctl run -it --rm -v $PWD:/usr/src/app node:14.15.5 /usr/src/app/install-build.sh
    
  12. 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"
    
  13. Ejecute el script
    nerdctl run -it --rm -v $PWD:/usr/src/app node:14.15.5 /usr/src/app/install-build.sh
    
  14. 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"
    
  15. 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
    
  16. Edite el script reemplazando los parametros del comando npm ci por $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"
    
  17. 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
    
  18. Salga del contenedor temporal
    exit