Se va a usar la imagen de Jenkins en Docker, se va a extender con Maven para su funcionamiento con una aplicación Java y se va a extenedor con Docker Engine para construir imagenes. El Docker file fue actualizado para poder realizar esto. Otra alternativa es instalar manualmente Docker Engine como lo muestra Problemas > Mensaje 1 > Alternativa > Procedimiento.
- DockerFile en: 11-jenkins-en-docker/Dockerfile
- Buscar en DockerHub la imagen de Jenkins jenkins/jenkins
- Nombre Imagen: jenkins/jenkins
- Paquete de instalación de Maven
- Ruta: 'https://downloads.apache.org/maven/maven-3/3.9.0/binaries/'
- Ruta del binario: 'https://downloads.apache.org/maven/maven-3/3.9.0/binaries/apache-maven-3.9.0-bin.tar.gz'
- Version: 3.9.0
- Hacer la instalación con comandos apt ya que la imagen en derivada de ubuntu
- Hacer configuración de maven en el sistema
- Contruir imagen y nombrarla jenkins-cicd:
docker build -t jenkins-cicd --no-cache . - Verficar imagen jenkins-cicd:
docker image ls - levantar contenedor:
docker run -d -p 8080:8080 -p 50000:50000 --name jenkinsCont jenkins-cicd- puertos en documentación de jenkins docker: Usage
- nombre del contenedor: jenkinsCont
- nombre de la imagen: jenkins-cicd
- Verificar contenedor jenkinsCont:
docker ps -a - Entrar a jenkins
- Saber contraseña del portal Jenkins en los logs de instalación:
docker logs id-de-imagen - Buscar mensaje: Jenkins initial setup is required. An admin user has been created and a password generated...
- Copiar contraseña: en este caso es 5c557d5481294776aa408ddc72b2b7bf
- Entrar a web jenkins: 'http://localhost:8080/' y usar contraseña
- Usar Install sugged plugins esperar algunos minutos
- En Create First Admin User crear el usuario
- en este caso usar admin en todo y email: admin@admin.com
- el email es a donde llegan las notificaciones CI/CD
- ahora la contraseña es admin
- listo para crear con Pipelines
- Saber contraseña del portal Jenkins en los logs de instalación:
- Se debe tener un token de acceso para usar en las credenciales de git en jenkins
- Crea una cuenta
- Descargar el binario de: 'https://dashboard.ngrok.com/get-started/setup'
- Descomprimir
- Conectar la cuenta con el token de la pagina de gnrok
./ngrok config add-authtoken token-de-la-pagina-de-ngrok
- Configurar el servicio
- El servidor CI/CD esta por el puerto 8080
./ngrok http 8080
- Crear Webhook
- toma la url que dice Forwarding: 'https://bbc8-201-244-248-50.ngrok.io'
- Ir al repositorio de github > configuracion
- webhooks > add webhooks
- Payload url: pegar la url + /github-webhook/ 'https://bbc8-201-244-248-50.ngrok.io/github-webhook/'
- Content type: application/json
- Eventos: usar solamente Just the push event
- Active: enable
- Verificar que este funcionando
- webhooks > selecionar > recent Deliveries
- en evento ping debe estar en verde
- Cuando se hace un push en la consola de ngrok sale POST /github-webhook/ 200 OK
- IMPORANTE! Terminar el proceso cuando se terminen las pruebas
- instalacion plugin
- jenkins > administrar > jenkins > plugins >> CloudBees Docker Build and Publish
- instalar sin reiniciar
- luego reiniciar manualmente
- Configuracion de la pipeline
- jenkins > pipeline > configurar > build steps
- añadir nuevo paso > Docker Build and Publish
- Repository Name: reposiotrio dockerhub + / + Nombre de la imagen que se va a publicar
- tag: numero tag de la imagen que se va a publicar
- Docker Host URI: ubicación de instalación de docker (debe ser accesible desde jenkins)
- Si jenkins y docker estan instalados en la misma red no se debe hacer nada mas
- Si jenkins y docker estan en redes diferentes
- Se deben aplicar los dos procedimientos siguientes para que funcione
- [ESTA NO FUNCIONA] se debe crear una red compartida Ver creación de red puente Jenkins y Docker
- [ESTA FUNCIONA] se debe instalar docker en el contenedjor de jenkins, ir a Problemas > Mensaje 1 > Alternativa > Procedimiento
- Agregar URL: 'tcp://172.17.0.1:2375'
- Server credential: ninguna, no tenemos docker con seguridad
- Docker registry url: aca va la url de dockerhub por defecto, si se usa otro repositorio de imagenes se debe colocar la url aca
- Registry credentials
- Crear Credenciales de dockerhub
- add > jenkis
- Kind: username with password
- U: usuario en dockerhub
- P: contraseña de dockerhub
- Marcar treat username as secret
- ID: docker-hub
- Registry credentials > docker-hub
- Crear Credenciales de dockerhub
- Advance
- Build Context: billing/
- Additional Build Arguments: --build-arg JAR_FILE=target/*.jar
- Apply
- Save
- añadir nuevo paso > Docker Build and Publish
- jenkins > pipeline > configurar > build steps
En esta instalación, Jenkis esta dentro de un contenedor de Docker y Docker Engine esta localmente, así que se debe crear un puente entre la red local que y la del contenedor de Jenkins.
- Crear red puente entre la red local y la de un contenedor
- crear puente:
ip route show default | awk '/default/ {print $3}' - ver configuración IP (addr) y se saca el segmento de red (inet):
ip aaca se busca la interfaz de interes -> '172.17.0.1' - armar direccion/url: tcp://+{ip inet}+:2375 ej: 'tcp://172.17.0.1:2375'
- crear puente:
- Exponer Docker
- Editar para exponer recurso Docker en:
sudo gedit /lib/systemd/system/docker.service - Exponer, en [service] reemplazar --containerd=/run/containerd/containerd.sock por -H=tcp://0.0.0.0:2375
- Reulstado: ExecStart=/usr/bin/dockerd -H fd:// -H=tcp://0.0.0.0:2375
- recargar docker:
sudo systemctl daemon-reload ; sudo service docker restart ; docker stop $(docker ps -a -q) - probar, la dirección debe ser accesible:
curl http://localhost:2375/images/json// ambien se puede probar desde el navegador
- Editar para exponer recurso Docker en:
Error cuando se ejecuta la pipeline:
ERROR: Cannot run program "docker" (in directory "/var/jenkins_home/workspace/pipeline_ejercicio_16"): error=2, No such file or directory
No se puede conectar el contenedor al daemon de Docker de la maquina local, configuración realizada en Ver creación de red puente Jenkins y Docker.
No existe solución facil de implementar, puede ser un bug de la version de docker actual = Docker version 23.0.1, build a5ee5b1.
Instalar en el contenedor Docker y realizar Ver creación de red puente Jenkins y Docker para que funcione. En el curso alguien escribio el procedimiento realizando nuevamente la creación de la imagen y usa la version = Docker version 18.03.1-ce, build 9ee9f40 / fedora 37.
# conectarse como root
docker exec -it -u root id-contenedor /bin/bash
# realizar instalacion y configuracion
DOCKERVERSION=18.03.1-ce
mkdir tmp2 && cd tmp2
curl -fsSLO https://download.docker.com/linux/static/stable/x86_64/docker-${DOCKERVERSION}.tgz
tar xzvf docker-${DOCKERVERSION}.tgz
rm tar xzvf docker-${DOCKERVERSION}.tgz
cp docker/docker /usr/local/bin
cd .. && rm -r tmp2
# verficar
docker --versionInstalación y configuración de plunging de Kubernetes en Jenkins para despliegues automatizados. \
Es necesario tener instalado kubectl en el contenedor de Jenkis antes de instalar el Plugin en Jenkins. \
La Pipeline se configura automaticamente con el archivo Jenkinsfile. \
Esta configuración es usada para la practica 18 PRACTICA - Despligue automatizado con Jenkins y Kuberneste en Z-2-Practicas-Kubernetes.md
- conectarse como root:
docker exec -it --user=root jenkinsCont /bin/bash - Instalación
mkdir tmp2 && cd tmp2
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl
mv ./kubectl /usr/local/bin/kubectl
cd .. && rm -r tmp2- Verificar instalación:
kubectl version --client
Conectar contenedor de Jenkins a la misma red donde esta minikube.
- Verificar redes existentes:
docker network ls- La de interes es la red de minicube: minikube
- Conectar a la red:
docker network connect minikube jenkinsCont- Verificar:
docker container inspect jenkinsCont - debe estar la red minikube
- Verificar:
- AL FINALIZAR SE RECOMIENDA desconectar de la red porque puede provocar que el contenedor no inicie si no esta disponible la red
- desconectar de la red:
docker network disconnect minikube jenkinsCont
- desconectar de la red:
- Jenkins > administrar jenkins > admnistrar plugins > buscar >> Kubernetes
- Install whitout restar
- Luego reiniciar manualmente
docker restart jenkinsCont
Generar el token y la url del cluster de kubernetes asociados al servicio definido en jenkins-account.yaml*.
# aplicar configuracion
kubectl apply -f jenkins-account.yaml
# aplicar configuración para token
kubectl apply -f jenkins-token.yml
# ver ubicacion del certificado
kubectl config view | grep -i certificate-authority
# ver url del cluster
kubectl config view | grep -i server
# consultar token
kubectl describe secret/jenkins-token-rk2mgDatos obtenidos:
- certificate-authority: '/home/user/.minikube/ca.crt'
- server: 'https://192.168.49.2:8443'
- Token con nombre jenkins-token-rk2mg
Agregar token cluster kubernetes a Jenkins y configurarlo.
- Jenkins > Administrar > Security > Manage credentials > Stores from parent >> System
- En Global credentials (unrestricted) > Add credentials
- Kind: Secret text
- Secret: aca va el token de kubernetes
- ID: kubernete-jenkis-server-account (este nombre es el que usa el pipeline creado en Jenkinsfile.yml)
- Jenkins > Administrar > Manage nodes and clouds
- Configure Clouds > añadir nueva nuve >> kubernetes
- name: kubernetes-cloud
- Kubernetes cloud details
- Kubernetes URL: 'https://192.168.49.2:8443' (es la url del cluster de kubernetes)
- Kubernetes server certificate key: es el contenido de '/home/user/.minikube/ca.crt' (es la ubicacion del certificado)
- Copiar contenido y usar:
gedit /home/user/.minikube/ca.crt - Copiar inlucyendo -----BEGIN CERTIFICATE----- y -----END CERTIFICATE-----
- Copiar contenido y usar:
- Credentials: kubernete-jenkis-server-account
- Test connection: debe salir Connected to Kubernetes v1.26.1
- Configure Clouds > añadir nueva nuve >> kubernetes
- Jenkins > Dashboard > Nueva tarea
- Nombre: deploy-kubernetes
- Tipo: Pipeline (ya no es estilo libre)
- Configuraciones de la Pipeline:
- GitHub project: 'https://github.com/Repositorios-de-Estudio/18-despliegue-kubernetes-jenkins'
- url del repositorio, sin el .git
- Pipeline > Pipeline script from SCM
- SCM: Git
- Repository
- URL: 'https://github.com/Repositorios-de-Estudio/18-despliegue-kubernetes-jenkins.git'
- url de descarga del repositorio, con el .git
- URL: 'https://github.com/Repositorios-de-Estudio/18-despliegue-kubernetes-jenkins.git'
- Credentials: github-token-jenkins
- Branches to build: */main
- Script Path: Jenkinsfile
- es es el nombre del archivo que crea el pipeline y debe estar subido en el repositorio
- GitHub project: 'https://github.com/Repositorios-de-Estudio/18-despliegue-kubernetes-jenkins'
- Apply
- Save
- Ejecutar pipeline
- Consoleoutput debe tener Finished: SUCCESS
- En la pipeline de tuvo que haber crado la sección: Stage View
- En el dashboard de kubernetes debe hjaber un nuevo deploymen
- Se debe poder acceder a la aplicación en el anvegador
- Para el ejercicio se usa swagger: 'http://192.168.49.2:31780/swagger-ui/index.html'
Al ejecutar kubectl --namespace default get serviceaccount no se vio un secret creado (SECRETS default 0). En los comentarios de la clase alguien indico la creación de jenkins-token.yml y posterior ejecución.
Ejecutar lo que se indica en 4 Configuración kubernetes > Generar datos de cluster de kubernetes.
- En Jenkins limpiar el espacio de trabajo para evitar errrores con git cuando se cambia de proyecto, otra alternativa es conectarse con docker exce y eliminar los espacios de trabajo manualmente