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 Jenkinsfiledefine 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:

docker-pipeline-jenkins

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:

    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:

    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:
    docker-pipeline-jenkins-unlock
    Haga clic en Siguiente.
  • Cree el primer usuario administrador como se muestra:
    docker-pipeline-jenkins-create-admin-user
    Haga clic en Guardar y terminar.
  • Haga clic en Instalar los plugins sugeridos:
    docker-pipeline-jenkins-install-suggested-plugins
    Se instalan varios plugins por defecto:
    docker-pipeline-jenkins-installing-suggested-plugins
    Me ha sorprendido que Ant y Subversion sean los plugins por defecto.
  • Aparece la pantalla de inicio de sesión.
    docker-pipeline-jenkins-login
    Introduzca el nombre de usuario y la contraseña especificados anteriormente.
  • Por último, Jenkins está listo para su uso:
    docker-pipeline-jenkins-start-using

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.

  1. 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 Maveny especifique la ubicación de Maven.docker-pipeline-jenkins-configure-maven
    Nombra la herramienta como Maven3 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.
  2. Haga clic en Gestionar Jenkins, Gestionar plugins, Disponible busque tubería docker. Seleccione Canalización Docker de CloudBeeshaga clic en Instalar sin reiniciar. docker-pipeline-jenkins-pipeline-plugin
    Haga clic en Instalar sin reiniciar.Plugin Docker Pipeline entiende el archivo Jenkins y ejecuta
    los comandos que allí se enumeran.
  3. La siguiente pantalla muestra la lista de plugins instalados:
    docker-pipeline-jenkins-pipeline-plugin-restart-jenkins
    La última línea muestra que el plugin CloudBees Docker Pipeline se ha instalado correctamente. Seleccione Reiniciar 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.

  1. 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:
    docker-pipeline-jenkins-dashboard
  2. Haga clic en crear nuevos puestos de trabajoindique el nombre como docker-jenkins-pipeline y elija el tipo como Tubería:docker-pipeline-jenkins-create-project
    Pulse OK.
  3. Configure Pipeline como se muestra:
    docker-pipeline-jenkins-configure-pipeline
    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:

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.
docker-pipeline-couchbase-books
Haga clic en Construir ahora y debería ver una salida similar a:
docker-pipeline-jenkins-build-run
¡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 Maven mvn 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 utilizando java -jarCada 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 defecto puente 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 un superponer 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 de pruebe/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:

Más información sobre Couchbase:

No dude en presentar errores en github.com/arun-gupta/docker-jenkins-pipeline/issues o enviar PR.

Autor

Publicado por Arun Gupta, Vicepresidente, Defensa del Desarrollador, Couchbase

Arun Gupta es vicepresidente de promoción de desarrolladores en Couchbase. Ha creado y dirigido comunidades de desarrolladores durante más de 10 años en Sun, Oracle y Red Hat. Tiene una gran experiencia en liderar equipos multidisciplinares para desarrollar y ejecutar estrategias, planificar y ejecutar contenidos, campañas de marketing y programas. Anteriormente dirigió equipos de ingeniería en Sun y es miembro fundador del equipo Java EE. Gupta es autor de más de 2.000 entradas de blog sobre tecnología. Tiene una amplia experiencia como conferenciante en más de 40 países sobre innumerables temas y es una JavaOne Rock Star desde hace tres años consecutivos. Gupta también fundó el capítulo Devoxx4Kids en Estados Unidos y sigue promoviendo la educación tecnológica entre los niños. Autor de varios libros sobre tecnología, ávido corredor, trotamundos, campeón de Java, líder de JUG, miembro del Dream Team de NetBeans y capitán de Docker, es fácilmente accesible en @arungupta.

Dejar una respuesta