JavaCro'14 - Continuous delivery of Java EE applications with Jenkins and Docker – Johan Janssen

Post on 28-Jan-2015

113 views 5 download

Tags:

description

Continuous delivery is a powerful concept, but hard to achieve. One of the challenges is automating the setup of environments and the deployment of the Java EE applications. We have looked at and used quite some tools like for instance Chef, Puppet, Vagrant and Nolio. All tools had one thing in common: we had never used them. Why should we invest time in mastering those tools? There is a perfect alternative in Jenkins, a tool most developers are familiar with. Besides the basic Jenkins buildserver capabilities it offers quite some useful plugins like the Build Pipeline plugin. To setup environments the popular Docker project is used. Docker allows you to create containers from any application. Only some knowledge is required for the setup of the containers. The rest of the configuration is done through commands most people are quite familiar with.

Transcript of JavaCro'14 - Continuous delivery of Java EE applications with Jenkins and Docker – Johan Janssen

Johan Janssen, Info Support

Continuous Delivery

DockerDocker

Jenkins build pipeline

Questions

Automate everything

Software quality

Continuous improvement

Regular deployments

Anyone can deploy

DevOps End users

Automate environment provisioning

Automate application deployment

Simple general commandsNo Domain Specific Language (DSL)Configuration with operating system commands

Disk space efficiencyMemory efficiencySpeedCompatibility (run anywhere)Isolation

Since March 2013Soon: 1.0 production ready releaseAround 400 contributorsAround 400 contributors1.2M+ container downloads

Docker on Ubuntu 14.04

apt-get install docker.io

docker.io run -i -t ubuntu:saucy/bin/bash

FROM ubuntu:saucy

# Add oracle java 7 repository

RUN apt-get -y install software-properties-common

RUN add-apt-repository ppa:webupd8team/java

RUN apt-get update && apt-get -y upgradeRUN apt-get update && apt-get -y upgrade

# Accept the Oracle Java license

RUN echo "oracle-java7-installer shared/accepted-oracle-license-v1-1 boolean true" | debconf-set-selections

# Install Oracle Java

RUN apt-get -y install oracle-java7-installer

ENV JAVA_HOME /usr/lib/jvm/java-7-oracle

FROM GeneralBase

RUN apt-get install -y wget unzip

RUN wgethttp://dist.sonar.codehaus.org/sonarqube-http://dist.sonar.codehaus.org/sonarqube-4.2.zip

RUN unzip sonarqube-4.2.zip -d /opt

RUN rm sonarqube-4.2.zip

EXPOSE 9000

EXPOSE 9092

CMD ["/opt/sonarqube-4.2/bin/linux-x86-64/sonar.sh", "console", "/bin/bash"]

Create ‘Dockerfile’

Build the containers:Build the containers:docker.io build -t GeneralBase .docker.io build -t Sonar .

Start proces:docker.io run -p 9000:9000

–p 9092:9092 -d Sonar

# docker.io ps –a

CONTAINER ID: ecbecf77461b

IMAGE: Sonar:latest

COMMAND: /opt/sonarqube-4.2/b COMMAND: /opt/sonarqube-4.2/b

CREATED: 32 minutes ago

STATUS: Up 32 minutes

PORTS: 0.0.0.0:9000->9000/tcp, 0.0.0.0:9092->9092/tcp

NAMES: sick_nobel

Start / stop / restartdocker.io [start / stop / restart] containerid

Show processes running in containerdocker.io top containerid

Create image from container

docker.io commit containeriddocker.io commit containeridusername/imagename

docker.io push username/imagename

GeneralBaseGeneralBaseGeneralBaseGeneralBase

AppServerBaseAppServerBaseAppServerBaseAppServerBase JenkinsJenkinsJenkinsJenkins SonarSonarSonarSonar GitblitGitblitGitblitGitblit NexusNexusNexusNexus

Environment DEnvironment DEnvironment DEnvironment D

Environment TEnvironment TEnvironment TEnvironment T

Environment AEnvironment AEnvironment AEnvironment A

Environment PEnvironment PEnvironment PEnvironment P

JenkinsDataContainerJenkinsDataContainerJenkinsDataContainerJenkinsDataContainer

DockerfileENV JENKINS_HOME /var/JenkinsData

Docker commandsDocker commandsdocker.io run -v /var/JenkinsData –name

JenkinsDataContainer ubuntu:saucy true

docker.io run -p 8080:8080 --volumes-from

JenkinsDataContainer -d Jenkins

# docker.io images --tree└─ 179.9 MB Tags: ubuntu:saucy

└─253.6 MB└─741.8 MB Tags: GeneralBase:latest

└─763.6 MB Tags: AppServerBase:latest└─763.6 MB Tags: AppServerBase:latest├─763.6 MB Tags: EnvironmentP:latest├─763.6 MB Tags: EnvironmentA:latest├─763.6 MB Tags: EnvironmentT:latest└─763.6 MB Tags: EnvironmentD:latest

└─865.6 MB Tags: Nexus:latest└─808.3 MB Tags: Gitblit:latest└─901.5 MB Tags: Sonar:latest└─805.4 MB Tags: Jenkins:latest

Stop containersdocker.io stop $(docker.io ps -a -q)

Remove containersRemove containersdocker.io rm $(docker.io ps -a -q)

Remove imagesdocker.io rmi $(docker.io images -q)

real 4m11.729sreal 4m11.729s

user 0m3.329s

sys 0m10.054s

Simple to useReally popular

Used in many organizationsRegular updatesRegular updatesBig community creating plugins etc.

Most developers already use it

Continuous delivery

Continuous deployment

1

25

34

5

6

7

8

Execute job after several (parallel) jobs are finished.

FirstJobParallelJob1ParallelJob2

LastJob

Good looking joinComplex workflowEtceteraEtcetera

Advantage: Jenkins jobs are the basis and can be reused.Try to keep it simple!

Build Flow PluginoDomain Specific LanguageoFeatures like retry, parallel, oFeatures like retry, parallel, guard/rescue (similar to try/finally)Multijob PluginDelivery Pipeline Plugin

johan.janssen@infosupport.com