59
Using Docker for Testing Carlos Sanchez @csanchez

Using Docker for Testing

Embed Size (px)

Citation preview

Page 1: Using Docker for Testing

Using Docker for Testing Carlos Sanchez

@csanchez

Page 2: Using Docker for Testing

About

Senior Software Engineer @ CloudBees Author of Jenkins Kubernetes plugin Long time OSS contributor at Apache Maven, Eclipse, Puppet,…

Page 3: Using Docker for Testing

Containers & micro services

Page 4: Using Docker for Testing

@YourTwitterHandle

Docker

Linux containersUnion File

System

File System Users

Processes Network

Page 5: Using Docker for Testing

But it is not trivial

Page 6: Using Docker for Testing

Docker

Linux required but

Docker Machine (formerly Boot2Docker) to the rescue

OS X Windows

Page 7: Using Docker for Testing

Docker

Build once, run anywhere (kind of) Bare metal Virtual Machines Cloud Docker

Page 9: Using Docker for Testing

developer oriented

Dependency hell installation nightmares “it ran on my machine”

Page 10: Using Docker for Testing

ops oriented

no need to know internals of apps focus on OPs problems

(scale, monitoring,…) clearer deliverables from dev

Page 11: Using Docker for Testing

@YourTwitterHandle

Docker delivery

Docker image

Docker infrastructure

App System

Page 12: Using Docker for Testing
Page 13: Using Docker for Testing
Page 14: Using Docker for Testing

Related projects

Page 15: Using Docker for Testing

Docker Machine

Provision Docker engines VirtualBox, replaces boot2docker ! Amazon EC2 Microsoft Azure Google Compute Engine OpenStack Rackspace VMware …

Page 16: Using Docker for Testing

Docker Swarm

Clustering for Docker containers Using the same API Integrates with Mesos / Mesosphere And planned

Amazon EC2 Container Service (ECS) Google Kubernetes IBM Bluemix Container Service Joyent Smart Data Center Microsoft Azure

Page 17: Using Docker for Testing

Docker Compose

Orchestration of multi-container apps Based on Fig Defined by:

containers configuration links volumes

Page 18: Using Docker for Testing

Apache Mesos

A distributed systems kernel

Docker Containerizer Marathon & Chronos

Page 19: Using Docker for Testing

Docker & Jenkins

Page 20: Using Docker for Testing

What are we trying to solve

Different projects, different requirements languages (Java, Ruby,…) tools (Maven, Ant, …) system libraries (OpenSSL, …) operating systems (Debian, Red Hat,…) external dependencies (MySQL, Postgres)

Page 21: Using Docker for Testing

@YourTwitterHandle

Initial solution

Jenkins masterslave 3

slave 2

slave 1

Page 22: Using Docker for Testing
Page 23: Using Docker for Testing
Page 24: Using Docker for Testing
Page 25: Using Docker for Testing

Dockerfile

# A Debian based imageFROM jenkinsci/jnlp-slave

RUN apt-get update \ && apt-get install -y mysql \ && rm -rf /var/lib/apt/lists/*

Page 26: Using Docker for Testing

DockerfileFROM centos

RUN yum -y install openjdk-8 mysql

ENV JENKINS_REMOTING_VERSION 2.52ENV HOME /home/jenkins

RUN useradd -c "Jenkins user" -d $HOME -m jenkinsRUN curl --create-dirs -sSLo /usr/share/jenkins/remoting-$JENKINS_REMOTING_VERSION.jar http://repo.jenkins-ci.org/public/org/jenkins-ci/main/remoting/$JENKINS_REMOTING_VERSION/remoting-$JENKINS_REMOTING_VERSION.jar \ && chmod 755 /usr/share/jenkins

COPY jenkins-slave.sh /usr/local/bin/jenkins-slave.sh

USER jenkins

VOLUME /home/jenkins

ENTRYPOINT ["/usr/local/bin/jenkins-slave.sh"]

Page 27: Using Docker for Testing

Docker plugin

Page 28: Using Docker for Testing

Docker plugin

As a plugin on demand slaves

https://github.com/jenkinsci/docker-plugin

Page 29: Using Docker for Testing

@YourTwitterHandle

Jenkins masterslave 3

slave 2

slave 1

Page 30: Using Docker for Testing
Page 31: Using Docker for Testing

CloudBees Docker Custom Build

Environment Plugin

Page 32: Using Docker for Testing

Custom Build Environment

Avoid dependencies in Jenkins Containers are completely isolated Use any executor/slave

Page 33: Using Docker for Testing

@YourTwitterHandle

Jenkins master slave

container

docker exec

Page 34: Using Docker for Testing
Page 35: Using Docker for Testing

DockerfileFROM centos

RUN yum -y install openjdk-8 mysql

ENV JENKINS_REMOTING_VERSION 2.52ENV HOME /home/jenkins

RUN useradd -c "Jenkins user" -d $HOME -m jenkinsRUN curl --create-dirs -sSLo /usr/share/jenkins/remoting-$JENKINS_REMOTING_VERSION.jar http://repo.jenkins-ci.org/public/org/jenkins-ci/main/remoting/$JENKINS_REMOTING_VERSION/remoting-$JENKINS_REMOTING_VERSION.jar \ && chmod 755 /usr/share/jenkins

COPY jenkins-slave.sh /usr/local/bin/jenkins-slave.sh

USER jenkins

VOLUME /home/jenkins

ENTRYPOINT ["/usr/local/bin/jenkins-slave.sh"]

Page 36: Using Docker for Testing

Custom Build Environment

Take advantage of all pre-built Docker images

java, ruby, python, maven,…

Page 37: Using Docker for Testing

Docker images are now a deliverable

Docker images are part of the pipeline Build/test/deploy images Deliver as any other artifact

even if not used to run production systems

Page 38: Using Docker for Testing

More Docker!

Page 39: Using Docker for Testing

@YourTwitterHandle

Jenkins plugins

DockerCloudBees

Docker Custom Build Environment

CloudBees Docker Build and Publish

CloudBees Docker Hub Notification

CloudBees Docker Traceability

docker-build-step

Docker workflow Kubernetes Mesos

Page 40: Using Docker for Testing

Build and Publish

Page 41: Using Docker for Testing

Docker Hub Notification

Page 42: Using Docker for Testing

Docker & Selenium

Page 43: Using Docker for Testing

Selenium

Manage multiple combinations of browsers Any number of them Standalone or Selenium Hub

even with VNC

Page 44: Using Docker for Testing
Page 45: Using Docker for Testing
Page 46: Using Docker for Testing

Selenium Hubhub: image: selenium/hub:2.48.2 ports: - "4444:4444"firefox: image: selenium/node-firefox-debug:2.48.2 links: - hub ports: - "5901:5900"chrome: image: selenium/node-chrome-debug:2.48.1 links: - hub ports: - "5902:5900"

Page 47: Using Docker for Testing

Kubernetes

Page 48: Using Docker for Testing

Kubernetes

Container cluster orchestration Docker containers across multiple hosts

(nodes or minions) Higher level API Enforced state Monitoring of endpoints

Page 49: Using Docker for Testing
Page 50: Using Docker for Testing

Providers

GKE Azure Vmware Rackspace oVirt Vagrant CloudStack Ubuntu

Page 51: Using Docker for Testing

PodGroup of colocated containers Same network namespace/IP Environment variables Shared volumes

host mounted empty volumes GCE data disks AWS EBS volumes nfs glusterfs secrets

Page 52: Using Docker for Testing

@YourTwitterHandle

Pods

Node

client

kubelet

pods

Master

Node

kubelet

podsNode

kubelet

pods

… … …

Page 53: Using Docker for Testing

Pod

kind: "Pod" apiVersion: "v1" metadata: name: "jenkins" labels: name: "jenkins" spec: containers: - name: "jenkins" image: "csanchez/jenkins-swarm:1.625.1-for-volumes" ports: - containerPort: 8080 - containerPort: 50000 volumeMounts: - name: "jenkins-data" mountPath: "/var/jenkins_home" volumes: - name: "jenkins-data" hostPath: path: "/home/docker/jenkins"

Page 54: Using Docker for Testing

Kubernetes Jenkins plugin

Page 55: Using Docker for Testing

Kubernetes Jenkins plugin

As a plugin on demand slaves

https://github.com/jenkinsci/kubernetes-plugin

Page 56: Using Docker for Testing
Page 57: Using Docker for Testing
Page 58: Using Docker for Testing

Danke!

Page 59: Using Docker for Testing