bookmark_borderConfigurar un pipeline Jenkins para una aplicación Angular

Vamos a configurar un pipeline de Jenkins para desplegar una aplicación Angular en un contenedor Docker. Como casi siempre vamos a utilizar versiones LTS (Long Term Service). En el momento de escribir este articulo las versiones LTS que tenemos son las siguientes:

En que lo vamos a utilizar

  • Ubuntu server 22.04 LTS.
  • Jenkins Server 2 LTS
  • OpenJDK 17
  • Node 18 LTS
  • Angular 15
  • Docker 20.10

    Instalación Angular en el servidor

    Lo primero que vamos a hacer es instalar node en el servidor de Jenkins

    • Agrega la llave de Nodejs, y ejecuta el instalador de paquetes apt. Siempre consulta la llave correcta tomada de la pagina oficial de node.
    $ curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - &&\
    sudo apt-get install -y nodejs
    • Verifica que se haya instalado correctamente node
    $ node -v
    v18.16.0
    • Ahora instalamos Angular 15, y verificamos su instalación. (si no le pones la versión instalas la ultima versión que tenga en el npm)
    $ sudo npm install -g @angular/cli@15.2.8
    ...
    $ ng version
         _                      _                 ____ _     ___
        / \   _ __   __ _ _   _| | __ _ _ __     / ___| |   |_ _|
       / △ \ | '_ \ / _` | | | | |/ _` | '__|   | |   | |    | |
      / ___ \| | | | (_| | |_| | | (_| | |      | |___| |___ | |
     /_/   \_\_| |_|\__, |\__,_|_|\__,_|_|       \____|_____|___|
                    |___/
        
    Angular CLI: 15.2.8
    Node: 18.16.0
    Package Manager: npm 9.6.6
    OS: linux x64
    
    Angular: 16.0.1
    ... animations, common, compiler, compiler-cli, core, forms
    ... platform-browser, platform-browser-dynamic, router
    
    Package                         Version
    ---------------------------------------------------------
    @angular-devkit/architect       0.1600.1
    @angular-devkit/build-angular   16.0.1
    @angular-devkit/core            16.0.1
    @angular-devkit/schematics      15.2.8 (cli-only)
    @schematics/angular             15.2.8 (cli-only)
    rxjs                            7.8.1
    typescript                      5.0.4
    
    • Para este articulo vamos crear una app de prueba, y la vamos a subir a un repositorio para que de alli lo tome Jenkins.
    $ ng new angular-app-jenkins
    ...
    Successfully initialized git.
    
    $ cd angular-app-jenkins
    $ git init 
    $ git add .
    $ git commit -am "Version inicial"
    $ git remote add origin https://gitlab.com/luidasa/angular-app-jenkins
    • Creamos el archivo Dockerfile en el proyecto de Angular, para tener las instrucciones de empaquetamiento.
    ### STAGE 1:BUILD ###
    # Defining a node image to be used as giving it an alias of "build"
    # Which version of Node image to use depends on project dependencies 
    # This is needed to build and compile our code 
    # while generating the docker image
    FROM node:18.16-alpine AS build
    # Create a Virtual directory inside the docker image
    WORKDIR /dist/src/app
    # Copy files to virtual directory
    # COPY package.json package-lock.json ./
    # Run command in Virtual directory
    # Install npm 9.6.6 que es al momento de escribir este articulo la versión mas reciente.
    RUN npm install -g npm@9.6.6
    RUN npm cache clean --force
    # Copy files from local machine to virtual directory in docker image
    COPY . .
    RUN npm install
    RUN npm run build --omit=dev
    
    
    ### STAGE 2:RUN ###
    # Defining nginx image to be used
    FROM nginx:latest AS ngi
    # Copying compiled code and nginx config to different folder
    # NOTE: This path may change according to your project's output folder 
    COPY --from=build /dist/src/app/dist/domain-app-name /usr/share/nginx/html
    COPY ./nginx.conf /etc/nginx/conf.d/default.conf
    # Exposing a port, here it means that inside the container 
    # the app will be using Port 80 while running
    EXPOSE 80
    • Creamos el archivo Jenkinsfile en el proyecto de Angular
    /* Requires the Docker Pipeline plugin */
    pipeline {
        agent any
        environment {
          VERSION = '1.0'
        }    
        stages {
          stage('build') {
            steps {
              git url: 'https://gitlab.com/luidasa/angular-app-jenkins.git', branch: 'master', credentialsId: 'gitlab-luidasa'
              sh '/usr/bin/ng build --prod'
            }
          }
          stage('build image') {
            steps {
              sh 'docker build -t luidasa/angular-app-jenkins:${VERSION}.${BUILD_NUMBER} .'
            }
          }
          stage('push image to hub') {
            steps {
              withDockerRegistry([credentialsId: "dockerhub", url: ""]) {
                sh 'docker push luidasa/angular-app-jenkins:${VERSION}.${BUILD_NUMBER}'
              }
            }
          }
        }
    }
    • Por ultimo, configuramos jenkins

    bookmark_borderCambiar el nombre del server Ubuntu 22.04 lts

    Para cambiar el nombre del servidor en ubuntu 22.04 lts, se requiere realizar los siguientes pasos.

    Con hostnamectl

    Esta es una utilidad que casi siempre esta presente, sino instalala.

    • Verifica el nombre del servidor
    $ sudo hostnamectl
    • Cambia el nombre de forma permanente. Requiere que seas sudo
    $ sudo hostnamectl set-hostname pruebas.midominio.com

    Cambiando con comando hostname y archivos de configuración

    • Para cambiarlo de forma temporal y vuelve a su nombre cuando se cierra la sesión.
    $ hostname
    $ hostname pruebas.midominio.com
    • Para cambiarlo de forma permanente, requiere que tengas permisos de sudo. Edita el archivo hostname.
    $ sudo vi /etc/hostname
    
    ***
    pruebas.midominio.com
    
    • Modifica el archivo hosts
    $ sudo vi /etc/hosts
    
    ***
    
    127.0.0.1       localhost
    127.0.0.1       pruebas.midominio.com
    
    • Por ultimo, si es estas en un ambiente virtualizado es posible que tengas el archivo de configuración de la nube. Cambia la bandera para preservar el nombre en la maquina virtual
    $ sudo vi /etc/cloud/cloud.cfg
    
    ***
    
    .....
    
    preserve_hostname: true
    
    .....
    
    • Por ultimo reinicia el servidor, y vuelve a conectarte para validar los cambios.
    $ sudo reboot
    $ ssh pruebas.midominio.com
    usuario@pruebas: ~$ 

    bookmark_borderInstalar Jenkins 2 LTS en ubuntu 22.04 LTS

    Vamos a instalar Jenkins 2 LTS para producción. Nota siempre ocupamos para producción las versiones LTS (Long Term Service) para los ambientes de producción.

    En una consola de ingresa los siguientes comandos

    • Instalación de Java JDK 17 LTS
    sudo apt update
    sudo apt install openjdk-17-jdk
    java -version
    javac -version
    sudo update-alternatives --config java
    • Instala Maven, en el Filesystem recomendado.
    curl https://dlcdn.apache.org/maven/maven-3/3.9.0/binaries/apache-maven-3.9.0-bin.tar.gz --output apache-maven-3.9.0-bin.tar.gz
    tar xzvf apache-maven-3.9.0-bin.tar.gz
    sudo chown root:root -R /usr/bin/apache-maven-3.9.0
    
    • Instala GIT
    sudo apt update
    sudo apt install git
    • Instala Jenkins

    Descarga la llave para mantener la versión actualizada.

    $ curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
        /usr/share/keyrings/jenkins-keyring.asc > /dev/null
    $ echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
        https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
        /etc/apt/sources.list.d/jenkins.list > /dev/null
    $ sudo apt install jenkins
    • Instala CertBot

    • Configura Jenkins con CertBot