introduccion - despliegue continuo con jenkins
jenkins introduccion (3)
El uso de SSH compromete la seguridad en su entorno
y es bastante difícil de solucionar.
Es mejor instalar un Jenkins-Slave en la máquina remota
y ejecuta las pruebas allí ejecutando un trabajo en el esclavo.
El esclavo es monitoreado por el servidor, lo que le ahorra muchos problemas
manejando la conexión.
Puede activar el trabajo remoto al final de una compilación exitosa
y pasarle el artefacto de esa construcción.
(También puede hacer que el primer Job almacene los artefactos en una unidad compartida
y pasar la ubicación de esos artefactos a la siguiente tarea).
Mira aquí:
- Jenkins - compilaciones distribuidas
- Jenkins - Plugin de disparador parametrizado
- Jenkins - Copy Artifact Plugin
Quiero implementar con jenkins en el entorno de prueba y en el entorno de producción. Para hacerlo, necesito conectarme al servidor del entorno deseado, algo así como ssh / scp.
Me gustaría saber cuál es la mejor manera.
Encontré algunos complementos para hacer esto, como Jenkins-Deploy-Plug-in o Jenkins Publish over SSH Plugin. El primero tiene muchos problemas, que no es realmente confiable para implementar en la producción y, en el segundo, debe cambiar la configuración global, que es un trabajo manual para cada implementación.
¿Alguna idea de como resolver esto? ¿Tal vez con algunos scripts o complementos?
La única idea actual que tengo es conectar con jenkins a un servidor (quizás con el complemento SSH) y ejecutar allí un script que se conecte al entorno deseado. Pero esas son dos conexiones. ¿Es eso realmente necesario? Espero una manera más directa para esto.
gracias por cualquier pista.
Lo ideal sería utilizar algo como Fabric o Capistrano para implementaciones y llamar a esas secuencias de comandos de Jenkins. También utilicé Capistrano extensivamente para las aplicaciones Ruby On Rails y Non-Ruby. La mayor ventaja que veo son:
- La inteligencia incorporada para deshacer la implementación en caso de que haya errores durante las implementaciones.
- Hooks proporciona para ejecutar un conjunto de scripts como la migración de base de datos, reinicios de servicio, etc.
- Retroceso manual en caso de que lo necesite.
Sugiero el siguiente procedimiento:
un solo script de shell (almacenado en algún lugar en el servidor jenkins) hace todo. Básicamente, el script hace scp del artefacto de construcción y luego se conecta al servidor (ssh) y realiza todas las tareas necesarias para implementar (página de mantenimiento de instalación, copia de seguridad de la aplicación actual, implementación de la nueva aplicación, ...).
En el servidor jenkins, hay al menos 2 trabajos:
- el primero simplemente hace la construcción (usando maven o cualquier otro script de compilación)
- el segundo trabajo lo implementa: por lo tanto, este trabajo solo ejecuta el script de shell. (Sugiero un trabajo de implementación para cada entorno objetivo: pruebas, producción, ...)
No requiere ningún complemento "especial" de jenkins para lograr este "despliegue de un clic". Solo requiere que el usuario de jenkins tenga acceso ssh al servidor de destino.
EDITAR
Aquí hay un script de shell de muestra para ilustrar mi publicación
#This script will copy the last artifact build by the job "MyApp" to test.myserver.com
#and remotely execute the deployment script.
#copy the war to the server
#(the job "MyApp" is using maven, that''s why the war can be found at this location)
scp -i <HOME_DIR>/.ssh/id_dsa $HUDSON_HOME/jobs/MyApp_Build/workspace/myapp/target/myapp.war [email protected]:/tmp/
#connect to the server and execute the deployment script
ssh -i <HOME_DIR>/.ssh/id_dsa [email protected]
#The following is just an example of what a deployment script can be.
#of course you must adapt it to your needs and environment
"cd <TOMCAT_DIR>;
#first copy the current war to a backup directory (additionaly, I have a cron task deleting old undeployed apps)
cp -rf myapp-apps/myapp* undeployed/myapp-apps/;
#execute a script (stored on the server) to properly stop the app
sh bin/myapp.sh stop;
#delete current app
rm -rf myapp-apps/myapp;
rm -rf myapp-apps/myapp.war;
#copy the uploaded war in tomcat app directory
cp /tmp/myapp.war myapp-apps/;
#execute a script (stored on the server) to start the app
sh bin/myapp.sh start"