Este blog explica cómo crear un Deployment Pipeline usando Jenkins y Docker para una aplicación Java que habla con una base de datos.
Jenkins soporta la creación de pipelines. Se construyen con simples scripts de texto que utilizan un DSL (lenguaje específico del dominio) de Pipeline basado en el lenguaje de programación Groovy. El script, normalmente llamado Jenkinsfile
define múltiples
pasos para ejecutar tareas tanto sencillas como complejas según los parámetros que establezcas. Una vez creados, los pipelines pueden construir código y orquestar el trabajo necesario para impulsar las aplicaciones desde el commit hasta la entrega.
Una tubería consta de pasos, nodo y escenario. Un pipeline se ejecuta en un nodo - un ordenador que forma parte de la instalación de Jenkins. Un pipeline a menudo consiste en múltiples etapas. Una etapa consiste en múltiples pasos. Leer
Primeros pasos con Pipeline para más detalles.
Para nuestra aplicación, éste es el flujo básico:
El código fuente completo de la aplicación utilizada se encuentra en github.com/arun-gupta/docker-jenkins-pipeline.
La aplicación se define en el aplicación web
directorio. Abre una conexión con el Couchbase y almacena un simple documento JSON utilizando SDK Java de Couchbase.
La aplicación también tiene una prueba que verifica que la base de datos contiene efectivamente el documento que se persistió.
Muchas gracias a @alexsotob por ayudarme con la configuración de Jenkins.
Empecemos.
Descargar e instalar Jenkins
- Descargar Jenkins desde jenkins.io. Esto se comprobó con Jenkins 2.21.
- Empieza Jenkins:
1JENKINS_HOME=~/.jenkins java -tarro ~/Descargas/jenkins-2.21.guerra --httpPort=9090
Este comando inicia Jenkins especificando el directorio de inicio donde se almacena toda la información de configuración. También define el puerto en el que Jenkins
está escuchando,9090
en este caso. - El primer arranque de Jenkins muestra el siguiente mensaje en la consola:
1234567891011121314***************************************************************************************************************************************************************************************Jenkins inicial configuración es obligatorio. En admin usuario tiene ha sido creado y a contraseña generado.Por favor, utilice el siguiente contraseña a proceda a instalación:3521fbc3d40448efa8942f8e464b2dd9Este mayo también sea encontrado en: /Usuarios/arungupta/.jenkins/secretos/contraseña inicialAdminPassword***************************************************************************************************************************************************************************************
Copie la contraseña que se muestra aquí. Esta se utilizará para desbloquear Jenkins. - Acceda a la consola de Jenkins en localhost:9090 y pegue la contraseña:
Haga clic enSiguiente
. - Cree el primer usuario administrador como se muestra:
Haga clic enGuardar y terminar
. - Haga clic en
Instalar los plugins sugeridos
:
Se instalan varios plugins por defecto:
Me ha sorprendido que Ant y Subversion sean los plugins por defecto. - Aparece la pantalla de inicio de sesión.
Introduzca el nombre de usuario y la contraseña especificados anteriormente. - Por último, Jenkins está listo para su uso:
Son bastantes pasos para empezar con Jenkins básico. ¿Realmente tengo que pasar por todos estos aros para empezar con Jenkins? ¿Existe una manera más fácil, simple, tonta y perezosa de comenzar con Jenkins? Sigue Convención-sobre-Configuración
y darme una instalación preconfigurada con un solo clic.
Instalar plugins de Jenkins
Instale los plugins necesarios en Jenkins.
- Si tu proyecto Java está construido usando Maven, entonces necesitas configurar Maven en Jenkins. Haga clic en
Gestionar Jenkins
,Configuración global de la herramienta
,Instalaciones de Maven
y especifique la ubicación de Maven.
Nombra la herramienta comoMaven3
ya que es el nombre utilizado en la configuración posterior.De nuevo un poco cojo, ¿por qué no puede Jenkins recoger la ubicación predeterminada de Maven en lugar de esperar que el usuario especifique una ubicación. - Haga clic en
Gestionar Jenkins
,Gestionar plugins
,Disponible
busquetubería docker
. SeleccioneCanalización Docker de CloudBees
haga clic enInstalar sin reiniciar
.
Haga clic enInstalar sin reiniciar
.Plugin Docker Pipeline entiende el archivo Jenkins y ejecuta
los comandos que allí se enumeran. - La siguiente pantalla muestra la lista de plugins instalados:
La última línea muestra que el plugin CloudBees Docker Pipeline se ha instalado correctamente. SeleccioneReiniciar Jenkins
casilla de verificación. Esto instalará reiniciar Jenkins también.
Crear trabajo Jenkins
Vamos a crear un trabajo en Jenkins que ejecutará la tubería.
- Después de que Jenkins se reinicie, mostrará la pantalla de inicio de sesión. Introduzca el nombre de usuario y la contraseña creados anteriormente. Esto le devuelve a
Instalación de plugins/actualizaciones
página. Haga clic en el icono Jenkins de la esquina superior izquierda para ver el panel principal:
- Haga clic en
crear nuevos puestos de trabajo
indique el nombre comodocker-jenkins-pipeline
y elija el tipo como Tubería:
Pulse OK. - Configure Pipeline como se muestra:
En este caso se utiliza un repositorio git local. Puedes elegir un repositorio alojado en github. Además, este repositorio se puede configurar con un gancho git o sondear a un intervalo constante para activar la tubería. Haga clic en
Guardar
para guardar la configuración.
Ejecutar Jenkins Build
Antes de iniciar el trabajo, la base de datos Couchbase debe iniciarse explícitamente como:
1 |
docker ejecute -d --nombre db -p 8091-8093:8091-8093 -p 11210:11210 arungupta/oreilly-couchbase:última |
Esto se resolverá después de #9 está arreglado. Asegúrese de que puede acceder a Couchbase en http://localhost:8091, utilice Administrador
como nombre de usuario y contraseña
como contraseña. Haga clic en Cubos de datos
y ver el libros
cubo creado.
Haga clic en Construir ahora
y debería ver una salida similar a:
¡Todo lo verde es bueno!
Intentemos comprender lo que ocurrió entre bastidores. Jenkinsfile describe cómo se construye la canalización. En el nivel superior, consta de cuatro etapas: empaquetar, crear
Imagen Docker, Ejecutar Aplicación y Ejecutar Pruebas. Cada etapa se muestra como un cuadro en el panel de Jenkins. El tiempo total empleado en cada etapa se muestra en el recuadro.
Entendamos lo que ocurre en cada etapa.
- Paquete - El código fuente de la aplicación se encuentra en
aplicación web
directorio. Comando Mavenmvn clean paquete -DskipTests
se utiliza para crear un archivo JAR de la aplicación. Tenga en cuenta que el proyecto maven también incluye
las pruebas y se omiten explícitamente mediante-DskipTests
. Normalmente, las pruebas se realizarían en un proyecto derivado independienteEl proyecto Maven crea un archivo JAR lejano
de la aplicación e incluye todas las dependencias. - Crear imagen Docker - La imagen Docker de la aplicación se construye utilizando el módulo Dockerfile en el
aplicación web
directorio.
La imagen simplemente incluye el JAR gordo y lo ejecuta utilizandojava -jar
Cada imagen se etiqueta con el número de compilación utilizando${env.BUILD_NUMBER}
. - Ejecutar aplicación - Ejecutar la aplicación implica ejecutar el contenedor Docker de la aplicación.La dirección IP del contenedor de la base de datos se identifica utilizando la etiqueta
docker inspeccionar
El contenedor de la base de datos y la aplicación
se ejecutan en el contenedor por defectopuente
red. Esto permite que los dos contenedores se comuniquen entre sí. Otra mejora sería ejecutar la tubería en un clúster en modo enjambre. Esto requeriría crear
y utilizar unsuperponer
red. - Ejecutar pruebas - Las pruebas se ejecutan contra el contenedor utilizando la función
prueba mvn
. Si se superan las pruebas, la imagen se envía a Docker Hub. Los resultados de las pruebas se capturan de cualquier manera.Esta etapa también muestra el uso depruebe
/captura
/finalmente
en Jenkinsfile. Si se superan las pruebas, la imagen se envía a Docker Hub. En este caso, está disponible en hub.docker.com/r/arungupta/docker-jenkins-pipeline/tags/.
Algunas tareas pendientes ...
- Trasladar las pruebas a un proyecto posterior (#7)
- Utilizar Git hook o poll para activar el pipeline (#8)
- Automatizar el inicio/apagado de la base de datos (#9)
- Ejecutar pipeline en un cluster de Docker Engines con modo Swarm (#10)
- Mostrar configuración alternativa para enviar la imagen a bintray (#11)
Otro punto doloroso es que la sintaxis de las variables globales no parece estar documentada en ninguna parte. Sólo está disponible en :/job/docker-jenkins-pipeline/pipeline-syntax/globals. De nuevo, ¡esto es un poco cutre!
”
no es imposible, sólo que aún no se ha puesto en práctica" #sadpanda
Algunas referencias adicionales para leer:
- Primeros pasos con el archivo Jenkins
- Plugin CloudBees Docker Pipeline
- Guía del usuario del plugin CloudBees Docker Pipeline
- Referencia DSL Jenkinsfile
- Charla sobre tuberías Jenkins de JavaZone 2016
Más información sobre Couchbase:
No dude en presentar errores en github.com/arun-gupta/docker-jenkins-pipeline/issues o enviar PR.