Efficient Parallel Testing with Docker by Laura Frank

62
Efficient Parallel Testing with Docker Laura Frank Engineer, Codeship

Transcript of Efficient Parallel Testing with Docker by Laura Frank

Page 1: Efficient Parallel Testing with Docker by Laura Frank

Efficient Parallel Testing with Docker

LauraFrankEngineer, Codeship

Page 2: Efficient Parallel Testing with Docker by Laura Frank
Page 3: Efficient Parallel Testing with Docker by Laura Frank
Page 4: Efficient Parallel Testing with Docker by Laura Frank

1. Parallel Testing: Goals and Benefits2. DIY with LXC

3. Using Docker and the Docker Ecosystem

Agenda

Page 5: Efficient Parallel Testing with Docker by Laura Frank

Parallel Testing

Page 6: Efficient Parallel Testing with Docker by Laura Frank

Create a customizable, flexible test environment that enables us to run

tests in parallel

GOAL

Page 7: Efficient Parallel Testing with Docker by Laura Frank

• Deploy new code faster• Find out quickly when automated steps fail

If you’re still not sure why testing is important, please talk to me at the Codeship booth.

Why?

Page 8: Efficient Parallel Testing with Docker by Laura Frank

• For local testing, e.g. unit and integration tests run by a development team

• On internal CI/CD systems• As part of a hosted CI/CD solution (like Codeship)

Where?

Page 9: Efficient Parallel Testing with Docker by Laura Frank

• Performance optimization for serial testing tasks is limited

• Split up testing tasks• Use containers to run multiple tests at once

How?

Page 10: Efficient Parallel Testing with Docker by Laura Frank

Run tasks across multiple processors in parallel

computing environments

TASK PARALLELISM

Page 11: Efficient Parallel Testing with Docker by Laura Frank

Distributed Task ParallelismA distributed system of containerized computing environments takes the place of a single multiprocessor machine

A container is a process, not a small VM

Page 12: Efficient Parallel Testing with Docker by Laura Frank
Page 13: Efficient Parallel Testing with Docker by Laura Frank
Page 14: Efficient Parallel Testing with Docker by Laura Frank

Spend less time waiting around for your builds to finish.

• Ship newest code to production faster• Be alerted sooner when tests fail

Goal: Shorter Feedback Cycles

Page 15: Efficient Parallel Testing with Docker by Laura Frank

Developers should have full autonomy over testing environments, and the way tests are executed.

• Move testing commands to separate pipelines• Designate commands to be run serially or in parallel• Declare specific dependencies for each service

Goal: More User Control

Page 16: Efficient Parallel Testing with Docker by Laura Frank

Why not VMs?• Isolation of running builds on infrastructure• Challenges with dependency management• No clean interface for imposing resource limits• Infrastructure is underutilized which makes it expensive

Page 17: Efficient Parallel Testing with Docker by Laura Frank

Containers, duh!• Impose resource limits and utilize infrastructure at higher

capacity• Run customer code in isolation• Provide consistent build environment across many build runs

• Run testing tasks in parallel 👍

Page 18: Efficient Parallel Testing with Docker by Laura Frank

DIY with LXC

Page 19: Efficient Parallel Testing with Docker by Laura Frank

Codeship has been powered by containers since the very beginning

Page 20: Efficient Parallel Testing with Docker by Laura Frank

Flowing salty water on MarsInternational Year of Forests

Preparations ahead of 12.04 Precise release shipped to support LXC improvements

Codeship was foundedGreen Bay Packers won Super Bowl XLV

2011: A Brief History Lesson

Page 21: Efficient Parallel Testing with Docker by Laura Frank

I should use LXC…

Page 22: Efficient Parallel Testing with Docker by Laura Frank

Why LXC?• Impose resource limits and utilize infrastructure at

higher capacity• Run customer code in isolation• Provide consistent build environment across many build runs• Enable parallel testing jobs

• Can programmatically automate creation and deletion

Page 23: Efficient Parallel Testing with Docker by Laura Frank

Checkbot (Codeship Classic)• Still running in production as our classic infrastructure• Well-suited for users who want 1-click test environments without

much customization• Compromise flexibility for ease of use

Page 24: Efficient Parallel Testing with Docker by Laura Frank

Checkbot

39K builds per day7.8M builds per year

Page 25: Efficient Parallel Testing with Docker by Laura Frank

Architecture• Universal Container with provided dependencies• Run builds in isolation from one another• Implement parallel testing pattern using pipelines with

ParallelCI• Users can have N pipelines running in isolation during a

build

Page 26: Efficient Parallel Testing with Docker by Laura Frank

User Commands

Universal Container

Pipeline

User Commands

Universal Container

Pipeline

Heroku

Deployment Provider

Capistrano

AppEngine

Elastic Beanstalk

etc…

Page 27: Efficient Parallel Testing with Docker by Laura Frank

Limitations• Parity between dev and test• Can’t really debug locally• No useable interface between user and container• Resource consumption is too high

Page 28: Efficient Parallel Testing with Docker by Laura Frank

While using straight-up LXC solved some of our technical problems, it didn’t solve any of

our workflow problems

Page 29: Efficient Parallel Testing with Docker by Laura Frank

We weren’t able to provide the best, most efficient product to our customers (or ourselves)

Page 30: Efficient Parallel Testing with Docker by Laura Frank

Using Docker and the Docker Ecosystem

Page 31: Efficient Parallel Testing with Docker by Laura Frank

Create a customizable, flexible test environment that enables us to run

tests in parallel

GOAL

Page 32: Efficient Parallel Testing with Docker by Laura Frank

Big Wins with DockerEven before 1.0, Docker was a clear choice

• Support and tooling• Standardization• Community of motivated developers

Page 33: Efficient Parallel Testing with Docker by Laura Frank

Using Docker allowed us to build a much better testing platform

than with LXC alone

Page 34: Efficient Parallel Testing with Docker by Laura Frank

Codeship Jet

Page 35: Efficient Parallel Testing with Docker by Laura Frank

A Docker-based Testing Platform• Development started in 2014• First beta in 2015• Official launch February 2016

Page 36: Efficient Parallel Testing with Docker by Laura Frank

A Docker-based Testing Platform

Built with Docker

in order to support Docker workflows

Page 37: Efficient Parallel Testing with Docker by Laura Frank

Codeship Jet

2.3K builds per day~250K total builds

Page 38: Efficient Parallel Testing with Docker by Laura Frank

Why Docker?• Docker Compose: service and step definition syntax• Docker Registry: storage for images; remote caching*• Docker for Mac and Windows: give users ability to reproduce

CI environments locally

*not for long!

Page 39: Efficient Parallel Testing with Docker by Laura Frank
Page 40: Efficient Parallel Testing with Docker by Laura Frank

Docker Compose• Provides simplicity and a straightforward interface• Developers can use existing docker-compose.yml files

with Codeship• Ensure parity in dev, test, and production• Use similar syntax for testing step definitions to get users up

and running faster

Page 41: Efficient Parallel Testing with Docker by Laura Frank

The workflow tools provided by Docker are indispensable

Page 42: Efficient Parallel Testing with Docker by Laura Frank

Parallel Testing with Docker

Page 43: Efficient Parallel Testing with Docker by Laura Frank

Managing containers with Docker allowed us to improve our

parallel testing workflow

Page 44: Efficient Parallel Testing with Docker by Laura Frank

A New Parallel Workflow• Introducing services adds additional layer of flexibility• Loosen coupling between steps and services — execute N

steps against M services• Parallel and serial steps can be grouped and ordered in any

way

Page 45: Efficient Parallel Testing with Docker by Laura Frank

Services• Pull image from any registry or build from Dockerfile• Optimize service for testing tasks• Fully customizable by the user

Page 46: Efficient Parallel Testing with Docker by Laura Frank

Steps• Each step is executed in an independent environment• Can be nested in serial and parallel groups• Two functions

• Run: execute a command against a service• Push: push image to registry

• Tag regex matching to run steps on certain branches or tagged releases

Page 47: Efficient Parallel Testing with Docker by Laura Frank

User Commands

Universal Container

Pipeline

User Commands

Universal Container

Pipeline

User Commands

Universal Container

Pipeline

T1 T1 T1

Page 48: Efficient Parallel Testing with Docker by Laura Frank

Step

post

gres

redi

s

command

web

Steppo

stgr

es

redi

scommand

web

Step

command

ruby Step

post

gres

redi

s

command

web

T1 T2 T3

Page 49: Efficient Parallel Testing with Docker by Laura Frank

codeship-services.yml

db: image: postgres:9.5

app: encrypted_dockercfg_path: dockercfg.encrypted build: image: user/some-image dockerfile: Dockerfile.test cached: true links: - db deploy: encrypted_dockercfg_path: dockercfg.encrypted build: dockerfile: Dockerfile.deploy

Page 50: Efficient Parallel Testing with Docker by Laura Frank

codeship-steps.yml

- type: serial steps: - type: parallel steps: - name: rspec service: app command: bin/ci spec - name: rubocop service: app command: rubocop - name: haml-lint service: app command: haml-lint app/views - name: rails_best_practices service: app command: bin/railsbp

- service: deploy type: push image_name: rheinwein/notes-app tag: ^master$ registry: https://index.docker.io/v1/ encrypted_dockercfg_path: dockercfg.encrypted

Page 51: Efficient Parallel Testing with Docker by Laura Frank

ProTip: Your push or deploy step should never be part of a parallel step group

Page 52: Efficient Parallel Testing with Docker by Laura Frank

Demo!

Page 53: Efficient Parallel Testing with Docker by Laura Frank

Docker for Mac and Windows• All users can test locally• Jet CLI is available at http://bit.ly/codeship-jet-tool• Don’t have a Docker for Mac/Windows invitation yet? Totally

cool, Docker Toolbox also rocks• HUGE advantage over our previous LXC implementation

Page 54: Efficient Parallel Testing with Docker by Laura Frank

EngineeringChallenges

Page 55: Efficient Parallel Testing with Docker by Laura Frank

InfrastructureBuild allocation

• Customers can choose specs for their build machines• Machine provisioning used to be part of

the build process• Now we pool build machines• Allocation time is ~1 second!

Page 56: Efficient Parallel Testing with Docker by Laura Frank

PerformanceImage Caching

• Old way: rely on the registry for caching• A pull gave us access to each parent layer; rebuilding the

image used the local cache• 1.10 content addressable breaking change

Page 57: Efficient Parallel Testing with Docker by Laura Frank

PerformanceImage Caching

• Great news: 1.11 restores parent/child relationship when you save the images via docker save

• ETA: 1 month• Double-edged sword of relying on external tools¯\_( )_/¯

Page 58: Efficient Parallel Testing with Docker by Laura Frank

What’s Next?

Page 59: Efficient Parallel Testing with Docker by Laura Frank

Docker Swarm• Jet was born pre-Swarm• We manage build machines on AWS via our

own service• Previous concerns about security — single tenancy• Swarm (and services like Carina) are

promising for the future

Page 60: Efficient Parallel Testing with Docker by Laura Frank

libcompose• Currently use APIs directly for container-level operations (Jet

was also born before Fig was popular)• Minimal change for our users and builds, but much

easier for our engineers• Preliminary work has been completed

(thanks Brendan!)

Page 61: Efficient Parallel Testing with Docker by Laura Frank

You can create a highly efficient parallel testing platform with LXC

alone, but using Docker tools makes it better

TL;DR

Page 62: Efficient Parallel Testing with Docker by Laura Frank

Thank you!