Ejecutar proyecto de Jenkins con Docker y levantar flujo de trabajo de CI/CD desde un repositorio de GitHub.
- GitHub
- Cuenta de GitHub
- Fork
- Docker
- Docker-compose
Se debe crear una cuenta en github.com de la manera habitual que se crea una cuenta en cualquier sitio web.
Fork el repositorio de GitHub en su cuenta personal. (Fork -> Bifurcación) desde el siguiente link
Para instalar docker en Ubuntu
• Actualizar el sistema operativo
sudo apt-get update && upgrade
• Instalar servidor docker-ce y docker-compose
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
• Comprobamos el estado de docker
sudo systemctl status docker
• Para validar que está correctamente instalado se ejecuta:
docker --version;
docker compose version;
Para lanzar Jenkins se debe ejecutar el siguiente comando:
docker run -dit -p 8080:8080 --network=host -v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins-curso docker.io/mguazzardo/pipe-seg
Lunch - Lanzado Jenkins
Usuario y contraseña: admin
URL: http://localhost:8080
Se desea realizar un flujo de trabajo de CI/CD con Jenkins, para ello se debe realizar lo siguiente:
- Seleccionar la opción de "Nueva tarea"
- Poner nombre a la tarea
- Seleccionar la opción de "Pipeline"
- Agregas una descripción
- Seleccionar la opción de "Advanced Project Options"
- Tomar la opción de "Pipeline script from SCM" y seleccionar "Git" y agregar la dirección del git Fork a su usuario de GitHub, en mi caso es github.com/omargo33/PIN1
- Guardar
Volvemos a la pantalla principal de Jenkins y seleccionamos la tarea que acabamos de crear, en la parte izquierda seleccionamos la opción de "Build Now" y esperamos a que se ejecute el flujo de trabajo.
Y esta nos dará el siguiente resultado:
Como la corrida fue errónea, se procede a revisar el log.
Sobre la tarea creada, seleccionamos en la columna de estado de ejecución, nube con lluvia, y seleccionamos la opción de "Console Output" para ver el log de la ejecución.
En la que vemos que la carpeta webapp no existe, por lo que se procede a retirarla del archivo Jenkinsfile del repositorio y se vuelve a ejecutar el flujo de trabajo.
En una segunda ejecución, se procede a ejecutar el flujo de trabajo y se obtiene el siguiente resultado:
Como se puede ver nos acaba de dar un error, en el que nos dice que no se puede ejecutar el comando de npm, por lo que se procede a revisar el log.
En este se describe que no se puede hacer push a un servidor local sobre el puerto 5000, por lo que se procede a ejecutar el comando docker para levantar dicho servidor.
En este momento se ve que hace falta levantar un nuevo contenedor docker con el puerto 5000 activos con el siguiente comando:
docker run --name testOv001 -p 5000:5000 registry:2
Y se realiza una nueva ejecución del flujo de trabajo, en la que se obtiene el siguiente resultado:
Y con eso se da por terminado el flujo de trabajo.
- Seleccionar la opción de "Nueva tarea"
- Poner nombre a la tarea
- Seleccionar la opción de "Pipeline"
- Agregas una descripción
- Seleccionar la opción de "Advanced Project Options"
- Tomar la opción de "Pipeline script from SCM" y seleccionar "Git" y agregar la dirección del git Fork a su usuario de GitHub, en mi caso es github.com/omargo33/PIN1
- Se cambia el nombre del archivo Jenkinsfile.all
- Guardar
Volvemos a la pantalla principal de Jenkins y seleccionamos la tarea que acabamos de crear, en la parte izquierda seleccionamos la opción de "Build Now" y esperamos a que se ejecute el flujo de trabajo.
Y esta nos dará el siguiente resultado:
En este punto nos dimos cuenta de que el apartado "Pass To K8s" no se ejecutaba correctamente porque este hacía mención a un servidor de kubernets que no tenemos aún acceso o instalado por lo que se decidió instalar un servidor de pruebas en nuestro equipo local, y optamos por un servidor minikube. Ver más en minikube
Para lo cual usamos los siguientes comandos:
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube && rm minikube-linux-amd64
Una vez instalado lo iniciamos con el siguiente comando:
minikube start
Luego de esto lanzamos su dashboard con el siguiente comando:
minikube dashboard
Que nos permite visualizar nuestro cluster de kubernets. (de un unico nodo)
El archivo original de la tarea k8s es el siguiente:
stage('Pass To K8s'){
steps {
sh '''
sshpass -p 'master' ssh 172.17.0.1 -l root -o StrictHostKeyChecking=no "kubectl create deployment testapp --image=127.0.0.1:5000/mguazzardo/testapp"
echo "Wait"
sleep 10
sshpass -p 'master' ssh 172.17.0.1 -l root -o StrictHostKeyChecking=no "kubectl expose deployment testapp --port=3000"
sshpass -p 'master' ssh 172.17.0.1 -l root -o StrictHostKeyChecking=no "wget https://raw.githubusercontent.com/tercemundo/platzi-scripts-integracion/master/webapp/nodePort.yml"
sshpass -p 'master' ssh 172.17.0.1 -l root -o StrictHostKeyChecking=no "kubectl apply -f nodePort.yml"
'''
}
}
En la que se puede apreciar que se hace uso de un servidor de kubernets en la ip 172.17.0.1 con el usuario root, cuya clave de acceso es master y para interactuar con el mismo se usa los comandos de kubectl.
Mientras que para nuestra instancia local de minikube se uso el siguiente comando:
minikube kubectl
Dando como resultado el siguiente archivo:
stage('Pass To K8s'){
steps {
sh '''
sshpass -p 12341234s ssh 172.18.5.35 -p 21212 -l colaborador -o StrictHostKeyChecking=no "minikube kubectl -- create deployment testapp --image=127.0.0.1:5000/mguazzardo/testapp"
echo "Wait"
sleep 10
sshpass -p 12341234s ssh 172.18.5.35 -p 21212 -l colaborador -o StrictHostKeyChecking=no "minikube kubectl -- expose deployment testapp --port=3000"
sshpass -p 12341234s ssh 172.18.5.35 -p 21212 -l colaborador -o StrictHostKeyChecking=no "wget https://raw.githubusercontent.com/tercemundo/platzi-scripts-integracion/master/webapp/nodePort.yml"
sshpass -p 12341234s ssh 172.18.5.35 -p 21212 -l colaborador -o StrictHostKeyChecking=no "minikube kubectl -- apply -f nodePort.yml"
'''
}
}
En la que se puede apreciar que se hace uso de un servidor de kubernets en la ip 172.18.5.35 y que el puerto ssh es el 21212, con el usuario colaborador, cuya clave de acceso es 12341234s y para interactuar con el mismo se usa los comandos de minikube kubectl.
Luego de el trabajo de configuración del servidor, revisión de servicio ssh y la configuración de la tarea k8s, se procede a ejecutar el flujo de trabajo y se obtiene el siguiente resultado:
, su correspondiente despliegue en el dashboard de minikube:
Y; el log de la ejecución:
Manuel Tinajero [email protected] Sebastián Peña [email protected] Omar Vélez [email protected] Susy Robalino [email protected] Joel Cittar [email protected]
URl del proyecto: