SlideShare une entreprise Scribd logo
1  sur  67
Télécharger pour lire hors ligne
Daniel Brown & Mario Camou
Scala, Docker
and Testing
oh my!
[Road]
Who are we?
Daniel Brown
Software engineer at eBay
Tinkerer and
hacker of electronic devices
Resident mad scientist
@_dlpb / https://github.com/dlpb
Mario Camou
Software engineer at eBay
3D printing enthusiast
and Doctor Who fan
“Do what I do. Hold tight and pretend it’s
a plan!”
—The Doctor, Season 7, Christmas
Special
@thedoc / https://github.com/mcamou/
Agenda
● Introduction to Docker
● Why would you use Docker in tests?
● How do you integrate Docker into a Scala project?
● Lessons learned
Intro to Docker
[Docker]
Virtual Machines
● eBay’s default way of working
● Easy to provision (through a UI)
● In the “cloud”
● Choice of OS’s
Virtual Machines
● Slow to provision internally
● Both API and UI
● Machines can, and do, disappear
● Internal connection latency
Virtual Machines
● Time consuming to set up
● Not possible easily to automate setup
● e.g. databases, web servers,
message queues (even with chef)
Enter Docker
Docker • /ˈdɒkər/
Noun
An open platform for developers and sysadmins
to build, ship and run applications
“
[Docker]
Enter Docker
Dependencies
● Create images of dependencies
[Docker]
Enter Docker
Dependencies
● Create images of dependencies
● Doesn't solve all setup issues
● But only needs to be done once
[Docker]
Enter Docker
Dependencies
● Create images of dependencies
● Doesn't solve all setup issues
● But only needs to be done once
● Less storage overhead than VM
● Databases and webservers = GBs of
data
[Docker]
Enter Docker
Dependencies
WIN!
[Docker]
Welcome to
The
Real World
[Bird]
Background: Our Service
[MFS]
Background: Our Service
[MFS]
Background: Our Goal
Decouple our tests from other services
[MFS]
Dependency Nightmares
Untested
Unreliable
Slow
Fire
Isolation is Key
● Decompose the monolith
● Identify services we are dependent upon
● Stub the contract
● Run your tests
[MFS]
Decompose the Monolith
[Stonehenge]
The Monolith
A common way of working
● Everything is “in the library”
● Antipatterns
● Black Magic
Identify Services we are Dependent Upon
This can be the tricky step when everything is “in the framework”
● May require the use of debuggers, network sniffers etc
● Investment is worth it in the long run
Identify Services we are Dependent Upon
Move configuration of services out to easily controllable (and
versionable) config
● Implement, or update, a client to use the new config
● Decoupling production from tests
Stub the Contract
Here you need to know
● The API mappings
● Expected Responses
Stub the Contract
Golden Rule: Keep it Simple!
● Have one response per stub
● Keep them versioned
● Put them in containers
Run your Tests
Now that we know our dependencies, contracts, and have stubs, we can
write tests
● These are focussed only on testing that our system behaves as
expected when downstream services offer varying responses
● We are NOT testing the downstream services
Run your Tests
● Create a number of different stubs in different docker images
● Spin up the ones you need for your specific test
● When you are done with the test, tear them down and start again
So How do you go about it?So, how do we go about it?
[Hands]
Dockerizing Scala
[Cat]
Normal Docker flow
● Create a Dockerfile
● Build the Docker image
● Push it to the registry
● Pull the image from every server
Normal Docker flow
● No static checking of the Dockerfile
● Artifact build is separate from image build
○ Do you have the right artifacts?
○ Did you run the tests before building?
○ Are the latest bits in the image?
Integrating Docker with sbt
[Construction Kit]
Integrating Docker with sbt
sbt-docker
An sbt plugin that:
● Creates a Dockerfile
● Creates an image based on that file
● Pushes the image to a registry
https://github.com/marcuslonnberg/sbt-docker
Setting the Image Name
imageNames in docker := Seq(
ImageName(
namespace = Some("myOrg"),
repository = name.value,
tag = Some(s"v${version.value}")
),
ImageName(
namespace = Some("myOrg"),
repository = name.value,
tag = Some("latest")
)
)
Some Useful vals
val artifact = (assemblyOutputPath in assembly).value
val baseDir = "/srv"
val preInstall = Seq(
"/usr/bin/apt-get update",
s"/usr/sbin/useradd -r -s /bin/false -d $baseDir myUser"
).mkString(" && ")
Configuring the Dockerfile
dockerfile in docker := {
new Dockerfile {
from("java:openjdk-8-jre")
user("myUser")
entryPoint("bin/run.sh")
runRaw(preInstall)
copy(new File("bin/run-docker.sh"), s"$baseDir/run.sh")
copy(new File("local/etc"), "$baseDir/etc")
copy(artifact, s"$baseDir/app.jar")
runRaw("chown -R myUser $baseDir && chmod 0544 $baseDir/run.sh")
}
}
Integrating with sbt-assembly
Ensure assembly always runs before Docker
docker <<= (docker dependsOn assembly)
Creating and Publishing the Image
sbt> docker
sbt> dockerPush
Caveats and Recommendations
● Create a fat JAR: sbt-assembly or sbt-native-packager
● In non-Linux platforms, start up docker-machine and set up the
environment variables before starting sbt:
$ docker-machine start theMachine
$ eval $(docker-machine env theMachine)
https://velvia.github.io/Docker-Scala-Sbt/
[Explosion]
Integration Testing with Docker
Create Docker image(s) containing stubbed external resources
● Tests always run with clean data
● Resource startup is standardized
● Does not require multiple VMs or network calls
Integration Testing with Docker
Before your tests:
● Start up the stubbed resource containers
● Wait for the containers to start
After your tests:
● Stop the containers
Can we automate all of this?
Container Orchestration during Tests
Orchestration platforms
● Docker Compose
● Kubernetes
● …
Container Orchestration during Tests
Orchestration platforms
● Docker Compose
● Kubernetes
● …
Orchestrate inside the test code
Using the Docker Java API
val config = DockerClientConfig.createDefaultConfigBuilder()
.withServerAddress("tcp://192.168.99.100:2376")
.withDockerCertPath("/path/to/certificates")
.build
val docker = DockerClientBuilder.getInstance(config).build
val callback = new PullImageResultCallback
docker.pullImageCmd("mongo:2.6.12").exec(callback)
callback.awaitSuccess
val container = docker.createContainerCmd("mongo:2.6.12")
.withCmd("mongod", "--nojournal", "--smallfiles", "--syncdelay", "0")
.exec
docker.startContainerCmd(container.getId).exec
docker.stopContainerCmd(container.getId).exec
val exitcode = docker.waitContainerCmd(container.getId).exec
Scala-native Solutions
reactive-docker and tugboat
● Use the Docker REST API directly -> versioning problems
● Unmaintained for > 1 year (not updated to Docker 1.2 API)
● No TLS support
Using reactive-docker
implicit val docker = Docker("192.168.99.100", 2375)
val timeout = 30.seconds
val name = "mongodb-test"
val cmd = Seq("mongod", "--nojournal", "--smallfiles", "--syncdelay",
"0")
val cfg = ContainerConfiguration(Some("mongo:2.6.12"), Some(cmd))
val (containerId, _) = Await.result(
docker.containerCreate("mongo:2.6.5", cfg, Some(name)), timeout)
val started = Await.result(docker.containerStart(containerId), timeout)
val stopped = Await.ready(docker.containerStop(containerId), timeout)
https://github.com/almoehi/reactive-docker
Caveats and Recommendations
● Use beforeAll to ensure containers start up before tests
● Use afterAll to ensure containers stop after tests
Caveats:
● Multiple container start/stops can make tests run much slower
● Need to check when resource (not just container) is up
● Single start/stop means testOnly/testQuick will start up all
resources
● Ctrl+C will not stop the stubbed resource containers
Introducing docker-it-scala
● Uses the (official) docker-java library
● Starts up resource containers in parallel
○ Only when they are needed
○ Once when the tests start
○ Waits for service (not just container) startup
● Automatically shuts down all started stub containers
● Configured via code or via Typesafe Config
https://github.com/whisklabs/docker-it-scala
[Docker-It-Scala]
Defining a Resource Container
● Resources are declared as traits and mixed into tests
● Sample implementations available for Cassandra, ElasticSearch,
Kafka, MongoDB, Neo4j, PostgreSQL, Zookeeper (in the docker-
testkit-samples package)
[Docker-It-Scala]
Defining Resource Container (Neo4j)
trait DockerNeo4jService extends DockerKit {
val neo4jContainer = DockerContainer("whisk/neo4j:2.1.8")
.withPorts(7474 -> None)
.withReadyChecker(
DockerReadyChecker.HttpResponseCode(7474, "/db/data/")
.within(100.millis)
.looped(20, 1250.millis)
))
abstract override def dockerContainers: List[DockerContainer] =
neo4jContainer :: super.dockerContainers
}
[Docker-It-Scala]
Defining Resource Container (PostgreSQL)
docker {
postgres {
image-name = "postgres:9.4.4"
environmental-variables = ["POSTGRES_USER=nph",
"POSTGRES_PASSWORD=suitup"]
ready-checker {
log-line = "database system is ready to accept connections"
}
port-maps {
Default-postgres-port.internal = 5432
}
}
}
[Docker-It-Scala]
Defining Resource Container (PostgreSQL)
trait DockerPostgresService extends DockerKitConfig {
val postgresContainer = configureDockerContainer("docker.postgres")
abstract override def dockerContainers: List[DockerContainer] =
postgresContainer :: super.dockerContainers
}
[Docker-It-Scala]
Writing Your Tests
class MyMongoSpec extends FunSpec with DockerMongodbService {
// Test assumes the MongoDB container is running
}
class MyPostgresSpec extends FunSpec with DockerNeo4jService {
// Test assumes the Neo4j container is running
}
class MyAllSpec extends FunSpec with DockerMongodbService
with DockerNeo4jService with DockerPostgresService{
// Test assumes all 3 containers are running
}
https://github.com/whisklabs/docker-it-scala
[Docker-It-Scala]
What Did We Achieve?
[Space needle]
The Effect
● We cut our end to end testing time
120 minutes -> 10 minutes
[Clock]
The Effect
● We cut our end to end testing time
120 minutes -> 10 minutes
● Confidence
[Clock]
Going Further
● Performance Measurements
● Business Decisions
Performance measurements (from Stubbed Tests)
Create mocks that can simulate (or approximate) real-world conditions
● E.g.
○ Drop every third request
○ Delay 5 seconds before responding
○ Respond instantly for every request
Performance measurements (from Stubbed Tests)
Use these new stubs to gather data about how your system performs
● When it is stressed;
● When downstream services are stressed
Performance measurements (from Stubbed Tests)
Use these new stubs to gather data about how your system performs
● When it is stressed;
● When downstream services are stressed
Gather the metrics!
Performance measurements (from Stubbed Tests)
[MFS]
Going Further
What did we decide from the graph?
Going Further
What did we decide from the graph?
● Technical limitations for our product
Going Further
What did we decide from the graph?
● Technical limitations for our product
● Business policies for the product
Summary
Isolation is key to gathering meaningful test data and keeping testing
strategies sane
Docker can ease the pain of managing stub dependencies during
integration testing
Meaningful tests can tell you a lot about the behaviour of your system
and therefore influence both architecture and UX
Q & A
[Audience]
Acknowledgements & Notes
[Docker] Docker: www.docker.com
Docker and the Docker logo are trademarks or registered trademarks of
Docker, Inc. in the United States and/or other countries. Docker, Inc. and
other parties may also have trademark rights in other terms used herein.
[Fire], Fire image, Creative Commons CC0 License https://www.pexels.
com/photo/fire-orange-emergency-burning-1749/
[Clock], Clock Image, Creative Commons
https://www.flickr.
com/photos/75680924@N08/6830220892/in/photostream/
[Space needle] Space needle, Creative Commons Zero
https://unsplash.com/photos/-48aJfQpFCE
[Explosion] Vehicle and building on fire, Creative Commons Zero
https://unsplash.com/photos/28v9cq7ytNU
[Stonehenge] Stonehenge, Public Domain
[Cat] Firsalar the fluffy cat loves to sit in boxes, CC-BY 2.0
[Construction Kit] Free Universal Construction Kit by F.A.T. Lab and Sy-
Lab http://fffff.at/free-universal-construction-kit/
[MFS] While MFS was released to production for a short time, it was not
released for external customer use.
[Audience] Audience, Creative Commons Zero
https://unsplash.com/photos/bBQ9lhB-wpY
[Bird] Bird Stare, Creative Commons Zero
https://unsplash.com/photos/ig9lRTGT0h8
[Road] Yellow Brick road to Lost Hatch, CC-BY-NC 2.0 https://www.flickr.
com/photos/wvs/352414272
[Hands] Mud Hands, CC-BY-NC 2.0 https://www.flickr.
com/photos/migueltejadaflores/13783685515
[Docker-it-scala] Docker IT Scala, Whisk Labs, MIT https://github.
com/whisklabs/docker-it-scala

Contenu connexe

Tendances

Rapid Development With Docker Compose
Rapid Development With Docker ComposeRapid Development With Docker Compose
Rapid Development With Docker ComposeJustin Crown
 
Docker Distributed application bundle & Stack - Overview
Docker Distributed application bundle & Stack - Overview Docker Distributed application bundle & Stack - Overview
Docker Distributed application bundle & Stack - Overview Thomas Chacko
 
Scaling Next-Generation Internet TV on AWS With Docker, Packer, and Chef
Scaling Next-Generation Internet TV on AWS With Docker, Packer, and ChefScaling Next-Generation Internet TV on AWS With Docker, Packer, and Chef
Scaling Next-Generation Internet TV on AWS With Docker, Packer, and Chefbridgetkromhout
 
Fast C++ Web Servers
Fast C++ Web ServersFast C++ Web Servers
Fast C++ Web ServersTroy Miles
 
Getting Started with Docker
Getting Started with DockerGetting Started with Docker
Getting Started with DockerGeeta Vinnakota
 
Deploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGH
Deploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGHDeploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGH
Deploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGHErica Windisch
 
Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015
Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015
Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015Stephane Manciot
 
Docker summit 2015: 以 Docker Swarm 打造多主機叢集環境
Docker summit 2015: 以 Docker Swarm 打造多主機叢集環境Docker summit 2015: 以 Docker Swarm 打造多主機叢集環境
Docker summit 2015: 以 Docker Swarm 打造多主機叢集環境謝 宗穎
 
Adventures in docker compose
Adventures in docker composeAdventures in docker compose
Adventures in docker composeLinkMe Srl
 
Introduction to docker swarm
Introduction to docker swarmIntroduction to docker swarm
Introduction to docker swarmWalid Ashraf
 
Kubernetes #4 volume &amp; stateful set
Kubernetes #4   volume &amp; stateful setKubernetes #4   volume &amp; stateful set
Kubernetes #4 volume &amp; stateful setTerry Cho
 
Red Hat Satellite 6 - Automation with Puppet
Red Hat Satellite 6 - Automation with PuppetRed Hat Satellite 6 - Automation with Puppet
Red Hat Satellite 6 - Automation with PuppetMichael Lessard
 
Consul - service discovery and others
Consul - service discovery and othersConsul - service discovery and others
Consul - service discovery and othersWalter Liu
 

Tendances (20)

Rapid Development With Docker Compose
Rapid Development With Docker ComposeRapid Development With Docker Compose
Rapid Development With Docker Compose
 
JavaCro'15 - Docker, Kubernetes and Jube - a new cloud architecture - Aleš Ju...
JavaCro'15 - Docker, Kubernetes and Jube - a new cloud architecture - Aleš Ju...JavaCro'15 - Docker, Kubernetes and Jube - a new cloud architecture - Aleš Ju...
JavaCro'15 - Docker, Kubernetes and Jube - a new cloud architecture - Aleš Ju...
 
The state of the swarm
The state of the swarmThe state of the swarm
The state of the swarm
 
Docker Distributed application bundle & Stack - Overview
Docker Distributed application bundle & Stack - Overview Docker Distributed application bundle & Stack - Overview
Docker Distributed application bundle & Stack - Overview
 
From zero to Docker
From zero to DockerFrom zero to Docker
From zero to Docker
 
Scaling Next-Generation Internet TV on AWS With Docker, Packer, and Chef
Scaling Next-Generation Internet TV on AWS With Docker, Packer, and ChefScaling Next-Generation Internet TV on AWS With Docker, Packer, and Chef
Scaling Next-Generation Internet TV on AWS With Docker, Packer, and Chef
 
Fast C++ Web Servers
Fast C++ Web ServersFast C++ Web Servers
Fast C++ Web Servers
 
Getting Started with Docker
Getting Started with DockerGetting Started with Docker
Getting Started with Docker
 
Deploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGH
Deploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGHDeploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGH
Deploying Docker (Provisioning /w Docker + Chef/Puppet) - DevopsDaysPGH
 
Docker orchestration
Docker orchestrationDocker orchestration
Docker orchestration
 
Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015
Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015
Packaging et déploiement d'une application avec Docker et Ansible @DevoxxFR 2015
 
Docker summit 2015: 以 Docker Swarm 打造多主機叢集環境
Docker summit 2015: 以 Docker Swarm 打造多主機叢集環境Docker summit 2015: 以 Docker Swarm 打造多主機叢集環境
Docker summit 2015: 以 Docker Swarm 打造多主機叢集環境
 
Docker up and running
Docker up and runningDocker up and running
Docker up and running
 
Adventures in docker compose
Adventures in docker composeAdventures in docker compose
Adventures in docker compose
 
Introduction to docker swarm
Introduction to docker swarmIntroduction to docker swarm
Introduction to docker swarm
 
Kubernetes #4 volume &amp; stateful set
Kubernetes #4   volume &amp; stateful setKubernetes #4   volume &amp; stateful set
Kubernetes #4 volume &amp; stateful set
 
Red Hat Satellite 6 - Automation with Puppet
Red Hat Satellite 6 - Automation with PuppetRed Hat Satellite 6 - Automation with Puppet
Red Hat Satellite 6 - Automation with Puppet
 
CoreOS Overview
CoreOS OverviewCoreOS Overview
CoreOS Overview
 
Consul - service discovery and others
Consul - service discovery and othersConsul - service discovery and others
Consul - service discovery and others
 
Fabric8 CI/CD
Fabric8 CI/CDFabric8 CI/CD
Fabric8 CI/CD
 

En vedette

Ship your Scala code often and easy with Docker
Ship your Scala code often and easy with DockerShip your Scala code often and easy with Docker
Ship your Scala code often and easy with DockerMarcus Lönnberg
 
Custom deployments with sbt-native-packager
Custom deployments with sbt-native-packagerCustom deployments with sbt-native-packager
Custom deployments with sbt-native-packagerGaryCoady
 
Unsucking Error Handling with Futures
Unsucking Error Handling with FuturesUnsucking Error Handling with Futures
Unsucking Error Handling with FuturesGaryCoady
 
Continous delivery - lad koden flyde 2014
Continous delivery - lad koden flyde 2014Continous delivery - lad koden flyde 2014
Continous delivery - lad koden flyde 2014BestBrains
 
Continous delivery with sbt
Continous delivery with sbtContinous delivery with sbt
Continous delivery with sbtWojciech Pituła
 
Automated Performance Testing With J Meter And Maven
Automated  Performance  Testing With  J Meter And  MavenAutomated  Performance  Testing With  J Meter And  Maven
Automated Performance Testing With J Meter And MavenPerconaPerformance
 
JoJo Pymes - Plan De Marketing Online Para Pequeñas Y Medianas Empresas
JoJo Pymes - Plan De Marketing Online Para Pequeñas Y Medianas EmpresasJoJo Pymes - Plan De Marketing Online Para Pequeñas Y Medianas Empresas
JoJo Pymes - Plan De Marketing Online Para Pequeñas Y Medianas EmpresasJoJo Digital
 
Panamá 2
Panamá 2Panamá 2
Panamá 2LATIPAT
 
Taller redes sociales antequera
Taller redes sociales antequeraTaller redes sociales antequera
Taller redes sociales antequeraJuan José de Haro
 
Vendome Resources Corporate Presentation
Vendome Resources Corporate PresentationVendome Resources Corporate Presentation
Vendome Resources Corporate PresentationHelmut Pollinger
 
CRM: GESTIÓN DEL CONOCIMIENTO
CRM: GESTIÓN DEL CONOCIMIENTOCRM: GESTIÓN DEL CONOCIMIENTO
CRM: GESTIÓN DEL CONOCIMIENTOIrene Muñoz
 
¿Por qué Google? - Diego Antista
¿Por qué Google? - Diego Antista¿Por qué Google? - Diego Antista
¿Por qué Google? - Diego AntistaPablo Capurro
 
Updated cdc recommendations for the management of hepatitis b virus–infected ...
Updated cdc recommendations for the management of hepatitis b virus–infected ...Updated cdc recommendations for the management of hepatitis b virus–infected ...
Updated cdc recommendations for the management of hepatitis b virus–infected ...Masbelle Opencel
 
Generación de transfectomas
Generación de transfectomasGeneración de transfectomas
Generación de transfectomasGuillermo Garibay
 
Akka Http , Routes, Streams with Scala
Akka Http , Routes, Streams with ScalaAkka Http , Routes, Streams with Scala
Akka Http , Routes, Streams with ScalaJerry Kuru
 
C-uppsats, Hållbar utveckling i praktiken, Sebastian Edholm. sistavers docx
C-uppsats, Hållbar utveckling i praktiken, Sebastian Edholm. sistavers docxC-uppsats, Hållbar utveckling i praktiken, Sebastian Edholm. sistavers docx
C-uppsats, Hållbar utveckling i praktiken, Sebastian Edholm. sistavers docxSebastian Edholm
 
Improving and Scaling SCADA Systems: Is WinCC OA Right for Me?
Improving and Scaling SCADA Systems: Is WinCC OA Right for Me?Improving and Scaling SCADA Systems: Is WinCC OA Right for Me?
Improving and Scaling SCADA Systems: Is WinCC OA Right for Me?DMC, Inc.
 

En vedette (20)

Ship your Scala code often and easy with Docker
Ship your Scala code often and easy with DockerShip your Scala code often and easy with Docker
Ship your Scala code often and easy with Docker
 
Custom deployments with sbt-native-packager
Custom deployments with sbt-native-packagerCustom deployments with sbt-native-packager
Custom deployments with sbt-native-packager
 
Unsucking Error Handling with Futures
Unsucking Error Handling with FuturesUnsucking Error Handling with Futures
Unsucking Error Handling with Futures
 
Continous delivery - lad koden flyde 2014
Continous delivery - lad koden flyde 2014Continous delivery - lad koden flyde 2014
Continous delivery - lad koden flyde 2014
 
Continous delivery with sbt
Continous delivery with sbtContinous delivery with sbt
Continous delivery with sbt
 
Automated Performance Testing With J Meter And Maven
Automated  Performance  Testing With  J Meter And  MavenAutomated  Performance  Testing With  J Meter And  Maven
Automated Performance Testing With J Meter And Maven
 
JoJo Pymes - Plan De Marketing Online Para Pequeñas Y Medianas Empresas
JoJo Pymes - Plan De Marketing Online Para Pequeñas Y Medianas EmpresasJoJo Pymes - Plan De Marketing Online Para Pequeñas Y Medianas Empresas
JoJo Pymes - Plan De Marketing Online Para Pequeñas Y Medianas Empresas
 
Panamá 2
Panamá 2Panamá 2
Panamá 2
 
Taller redes sociales antequera
Taller redes sociales antequeraTaller redes sociales antequera
Taller redes sociales antequera
 
Folleto metodología eca 10032014
Folleto metodología eca 10032014Folleto metodología eca 10032014
Folleto metodología eca 10032014
 
Vendome Resources Corporate Presentation
Vendome Resources Corporate PresentationVendome Resources Corporate Presentation
Vendome Resources Corporate Presentation
 
CRM: GESTIÓN DEL CONOCIMIENTO
CRM: GESTIÓN DEL CONOCIMIENTOCRM: GESTIÓN DEL CONOCIMIENTO
CRM: GESTIÓN DEL CONOCIMIENTO
 
¿Por qué Google? - Diego Antista
¿Por qué Google? - Diego Antista¿Por qué Google? - Diego Antista
¿Por qué Google? - Diego Antista
 
Reorockstar Ebook
Reorockstar EbookReorockstar Ebook
Reorockstar Ebook
 
Updated cdc recommendations for the management of hepatitis b virus–infected ...
Updated cdc recommendations for the management of hepatitis b virus–infected ...Updated cdc recommendations for the management of hepatitis b virus–infected ...
Updated cdc recommendations for the management of hepatitis b virus–infected ...
 
Ubicación CBTA 20
Ubicación CBTA 20Ubicación CBTA 20
Ubicación CBTA 20
 
Generación de transfectomas
Generación de transfectomasGeneración de transfectomas
Generación de transfectomas
 
Akka Http , Routes, Streams with Scala
Akka Http , Routes, Streams with ScalaAkka Http , Routes, Streams with Scala
Akka Http , Routes, Streams with Scala
 
C-uppsats, Hållbar utveckling i praktiken, Sebastian Edholm. sistavers docx
C-uppsats, Hållbar utveckling i praktiken, Sebastian Edholm. sistavers docxC-uppsats, Hållbar utveckling i praktiken, Sebastian Edholm. sistavers docx
C-uppsats, Hållbar utveckling i praktiken, Sebastian Edholm. sistavers docx
 
Improving and Scaling SCADA Systems: Is WinCC OA Right for Me?
Improving and Scaling SCADA Systems: Is WinCC OA Right for Me?Improving and Scaling SCADA Systems: Is WinCC OA Right for Me?
Improving and Scaling SCADA Systems: Is WinCC OA Right for Me?
 

Similaire à Scala, docker and testing, oh my! mario camou

DCSF 19 Building Your Development Pipeline
DCSF 19 Building Your Development Pipeline  DCSF 19 Building Your Development Pipeline
DCSF 19 Building Your Development Pipeline Docker, Inc.
 
PDXPortland - Dockerize Django
PDXPortland - Dockerize DjangoPDXPortland - Dockerize Django
PDXPortland - Dockerize DjangoHannes Hapke
 
ContainerDayVietnam2016: Dockerize a small business
ContainerDayVietnam2016: Dockerize a small businessContainerDayVietnam2016: Dockerize a small business
ContainerDayVietnam2016: Dockerize a small businessDocker-Hanoi
 
Up and running with docker
Up and running with dockerUp and running with docker
Up and running with dockerMichelle Liu
 
Docker and Puppet for Continuous Integration
Docker and Puppet for Continuous IntegrationDocker and Puppet for Continuous Integration
Docker and Puppet for Continuous IntegrationGiacomo Vacca
 
Docker primer and tips
Docker primer and tipsDocker primer and tips
Docker primer and tipsSamuel Chow
 
The Future of Security and Productivity in Our Newly Remote World
The Future of Security and Productivity in Our Newly Remote WorldThe Future of Security and Productivity in Our Newly Remote World
The Future of Security and Productivity in Our Newly Remote WorldDevOps.com
 
[@NaukriEngineering] Docker 101
[@NaukriEngineering] Docker 101[@NaukriEngineering] Docker 101
[@NaukriEngineering] Docker 101Naukri.com
 
DCEU 18: Building Your Development Pipeline
DCEU 18: Building Your Development PipelineDCEU 18: Building Your Development Pipeline
DCEU 18: Building Your Development PipelineDocker, Inc.
 
Настройка окружения для кросскомпиляции проектов на основе docker'a
Настройка окружения для кросскомпиляции проектов на основе docker'aНастройка окружения для кросскомпиляции проектов на основе docker'a
Настройка окружения для кросскомпиляции проектов на основе docker'acorehard_by
 
Powercoders · Docker · Fall 2021.pptx
Powercoders · Docker · Fall 2021.pptxPowercoders · Docker · Fall 2021.pptx
Powercoders · Docker · Fall 2021.pptxIgnacioTamayo2
 
Aug penguin16
Aug penguin16Aug penguin16
Aug penguin16alhino
 
PuppetConf 2017: What’s in the Box?!- Leveraging Puppet Enterprise & Docker- ...
PuppetConf 2017: What’s in the Box?!- Leveraging Puppet Enterprise & Docker- ...PuppetConf 2017: What’s in the Box?!- Leveraging Puppet Enterprise & Docker- ...
PuppetConf 2017: What’s in the Box?!- Leveraging Puppet Enterprise & Docker- ...Puppet
 
Introduction to Docker at the Azure Meet-up in New York
Introduction to Docker at the Azure Meet-up in New YorkIntroduction to Docker at the Azure Meet-up in New York
Introduction to Docker at the Azure Meet-up in New YorkJérôme Petazzoni
 
Kubernetes: training micro-dragons for a serious battle
Kubernetes: training micro-dragons for a serious battleKubernetes: training micro-dragons for a serious battle
Kubernetes: training micro-dragons for a serious battleAmir Moghimi
 
Workshop : 45 minutes pour comprendre Docker avec Jérôme Petazzoni
Workshop : 45 minutes pour comprendre Docker avec Jérôme PetazzoniWorkshop : 45 minutes pour comprendre Docker avec Jérôme Petazzoni
Workshop : 45 minutes pour comprendre Docker avec Jérôme PetazzoniTheFamily
 
Introduction to Docker, December 2014 "Tour de France" Edition
Introduction to Docker, December 2014 "Tour de France" EditionIntroduction to Docker, December 2014 "Tour de France" Edition
Introduction to Docker, December 2014 "Tour de France" EditionJérôme Petazzoni
 
DevAssistant, Docker and You
DevAssistant, Docker and YouDevAssistant, Docker and You
DevAssistant, Docker and YouBalaBit
 

Similaire à Scala, docker and testing, oh my! mario camou (20)

DCSF 19 Building Your Development Pipeline
DCSF 19 Building Your Development Pipeline  DCSF 19 Building Your Development Pipeline
DCSF 19 Building Your Development Pipeline
 
PDXPortland - Dockerize Django
PDXPortland - Dockerize DjangoPDXPortland - Dockerize Django
PDXPortland - Dockerize Django
 
ContainerDayVietnam2016: Dockerize a small business
ContainerDayVietnam2016: Dockerize a small businessContainerDayVietnam2016: Dockerize a small business
ContainerDayVietnam2016: Dockerize a small business
 
Up and running with docker
Up and running with dockerUp and running with docker
Up and running with docker
 
Docker and Puppet for Continuous Integration
Docker and Puppet for Continuous IntegrationDocker and Puppet for Continuous Integration
Docker and Puppet for Continuous Integration
 
Docker primer and tips
Docker primer and tipsDocker primer and tips
Docker primer and tips
 
The Future of Security and Productivity in Our Newly Remote World
The Future of Security and Productivity in Our Newly Remote WorldThe Future of Security and Productivity in Our Newly Remote World
The Future of Security and Productivity in Our Newly Remote World
 
Docker presentation
Docker presentationDocker presentation
Docker presentation
 
[@NaukriEngineering] Docker 101
[@NaukriEngineering] Docker 101[@NaukriEngineering] Docker 101
[@NaukriEngineering] Docker 101
 
Docker
DockerDocker
Docker
 
DCEU 18: Building Your Development Pipeline
DCEU 18: Building Your Development PipelineDCEU 18: Building Your Development Pipeline
DCEU 18: Building Your Development Pipeline
 
Настройка окружения для кросскомпиляции проектов на основе docker'a
Настройка окружения для кросскомпиляции проектов на основе docker'aНастройка окружения для кросскомпиляции проектов на основе docker'a
Настройка окружения для кросскомпиляции проектов на основе docker'a
 
Powercoders · Docker · Fall 2021.pptx
Powercoders · Docker · Fall 2021.pptxPowercoders · Docker · Fall 2021.pptx
Powercoders · Docker · Fall 2021.pptx
 
Aug penguin16
Aug penguin16Aug penguin16
Aug penguin16
 
PuppetConf 2017: What’s in the Box?!- Leveraging Puppet Enterprise & Docker- ...
PuppetConf 2017: What’s in the Box?!- Leveraging Puppet Enterprise & Docker- ...PuppetConf 2017: What’s in the Box?!- Leveraging Puppet Enterprise & Docker- ...
PuppetConf 2017: What’s in the Box?!- Leveraging Puppet Enterprise & Docker- ...
 
Introduction to Docker at the Azure Meet-up in New York
Introduction to Docker at the Azure Meet-up in New YorkIntroduction to Docker at the Azure Meet-up in New York
Introduction to Docker at the Azure Meet-up in New York
 
Kubernetes: training micro-dragons for a serious battle
Kubernetes: training micro-dragons for a serious battleKubernetes: training micro-dragons for a serious battle
Kubernetes: training micro-dragons for a serious battle
 
Workshop : 45 minutes pour comprendre Docker avec Jérôme Petazzoni
Workshop : 45 minutes pour comprendre Docker avec Jérôme PetazzoniWorkshop : 45 minutes pour comprendre Docker avec Jérôme Petazzoni
Workshop : 45 minutes pour comprendre Docker avec Jérôme Petazzoni
 
Introduction to Docker, December 2014 "Tour de France" Edition
Introduction to Docker, December 2014 "Tour de France" EditionIntroduction to Docker, December 2014 "Tour de France" Edition
Introduction to Docker, December 2014 "Tour de France" Edition
 
DevAssistant, Docker and You
DevAssistant, Docker and YouDevAssistant, Docker and You
DevAssistant, Docker and You
 

Plus de J On The Beach

Massively scalable ETL in real world applications: the hard way
Massively scalable ETL in real world applications: the hard wayMassively scalable ETL in real world applications: the hard way
Massively scalable ETL in real world applications: the hard wayJ On The Beach
 
Big Data On Data You Don’t Have
Big Data On Data You Don’t HaveBig Data On Data You Don’t Have
Big Data On Data You Don’t HaveJ On The Beach
 
Acoustic Time Series in Industry 4.0: Improved Reliability and Cyber-Security...
Acoustic Time Series in Industry 4.0: Improved Reliability and Cyber-Security...Acoustic Time Series in Industry 4.0: Improved Reliability and Cyber-Security...
Acoustic Time Series in Industry 4.0: Improved Reliability and Cyber-Security...J On The Beach
 
Pushing it to the edge in IoT
Pushing it to the edge in IoTPushing it to the edge in IoT
Pushing it to the edge in IoTJ On The Beach
 
Drinking from the firehose, with virtual streams and virtual actors
Drinking from the firehose, with virtual streams and virtual actorsDrinking from the firehose, with virtual streams and virtual actors
Drinking from the firehose, with virtual streams and virtual actorsJ On The Beach
 
How do we deploy? From Punched cards to Immutable server pattern
How do we deploy? From Punched cards to Immutable server patternHow do we deploy? From Punched cards to Immutable server pattern
How do we deploy? From Punched cards to Immutable server patternJ On The Beach
 
When Cloud Native meets the Financial Sector
When Cloud Native meets the Financial SectorWhen Cloud Native meets the Financial Sector
When Cloud Native meets the Financial SectorJ On The Beach
 
The big data Universe. Literally.
The big data Universe. Literally.The big data Universe. Literally.
The big data Universe. Literally.J On The Beach
 
Streaming to a New Jakarta EE
Streaming to a New Jakarta EEStreaming to a New Jakarta EE
Streaming to a New Jakarta EEJ On The Beach
 
The TIPPSS Imperative for IoT - Ensuring Trust, Identity, Privacy, Protection...
The TIPPSS Imperative for IoT - Ensuring Trust, Identity, Privacy, Protection...The TIPPSS Imperative for IoT - Ensuring Trust, Identity, Privacy, Protection...
The TIPPSS Imperative for IoT - Ensuring Trust, Identity, Privacy, Protection...J On The Beach
 
Pushing AI to the Client with WebAssembly and Blazor
Pushing AI to the Client with WebAssembly and BlazorPushing AI to the Client with WebAssembly and Blazor
Pushing AI to the Client with WebAssembly and BlazorJ On The Beach
 
Axon Server went RAFTing
Axon Server went RAFTingAxon Server went RAFTing
Axon Server went RAFTingJ On The Beach
 
The Six Pitfalls of building a Microservices Architecture (and how to avoid t...
The Six Pitfalls of building a Microservices Architecture (and how to avoid t...The Six Pitfalls of building a Microservices Architecture (and how to avoid t...
The Six Pitfalls of building a Microservices Architecture (and how to avoid t...J On The Beach
 
Madaari : Ordering For The Monkeys
Madaari : Ordering For The MonkeysMadaari : Ordering For The Monkeys
Madaari : Ordering For The MonkeysJ On The Beach
 
Servers are doomed to fail
Servers are doomed to failServers are doomed to fail
Servers are doomed to failJ On The Beach
 
Interaction Protocols: It's all about good manners
Interaction Protocols: It's all about good mannersInteraction Protocols: It's all about good manners
Interaction Protocols: It's all about good mannersJ On The Beach
 
A race of two compilers: GraalVM JIT versus HotSpot JIT C2. Which one offers ...
A race of two compilers: GraalVM JIT versus HotSpot JIT C2. Which one offers ...A race of two compilers: GraalVM JIT versus HotSpot JIT C2. Which one offers ...
A race of two compilers: GraalVM JIT versus HotSpot JIT C2. Which one offers ...J On The Beach
 
Leadership at every level
Leadership at every levelLeadership at every level
Leadership at every levelJ On The Beach
 
Machine Learning: The Bare Math Behind Libraries
Machine Learning: The Bare Math Behind LibrariesMachine Learning: The Bare Math Behind Libraries
Machine Learning: The Bare Math Behind LibrariesJ On The Beach
 

Plus de J On The Beach (20)

Massively scalable ETL in real world applications: the hard way
Massively scalable ETL in real world applications: the hard wayMassively scalable ETL in real world applications: the hard way
Massively scalable ETL in real world applications: the hard way
 
Big Data On Data You Don’t Have
Big Data On Data You Don’t HaveBig Data On Data You Don’t Have
Big Data On Data You Don’t Have
 
Acoustic Time Series in Industry 4.0: Improved Reliability and Cyber-Security...
Acoustic Time Series in Industry 4.0: Improved Reliability and Cyber-Security...Acoustic Time Series in Industry 4.0: Improved Reliability and Cyber-Security...
Acoustic Time Series in Industry 4.0: Improved Reliability and Cyber-Security...
 
Pushing it to the edge in IoT
Pushing it to the edge in IoTPushing it to the edge in IoT
Pushing it to the edge in IoT
 
Drinking from the firehose, with virtual streams and virtual actors
Drinking from the firehose, with virtual streams and virtual actorsDrinking from the firehose, with virtual streams and virtual actors
Drinking from the firehose, with virtual streams and virtual actors
 
How do we deploy? From Punched cards to Immutable server pattern
How do we deploy? From Punched cards to Immutable server patternHow do we deploy? From Punched cards to Immutable server pattern
How do we deploy? From Punched cards to Immutable server pattern
 
Java, Turbocharged
Java, TurbochargedJava, Turbocharged
Java, Turbocharged
 
When Cloud Native meets the Financial Sector
When Cloud Native meets the Financial SectorWhen Cloud Native meets the Financial Sector
When Cloud Native meets the Financial Sector
 
The big data Universe. Literally.
The big data Universe. Literally.The big data Universe. Literally.
The big data Universe. Literally.
 
Streaming to a New Jakarta EE
Streaming to a New Jakarta EEStreaming to a New Jakarta EE
Streaming to a New Jakarta EE
 
The TIPPSS Imperative for IoT - Ensuring Trust, Identity, Privacy, Protection...
The TIPPSS Imperative for IoT - Ensuring Trust, Identity, Privacy, Protection...The TIPPSS Imperative for IoT - Ensuring Trust, Identity, Privacy, Protection...
The TIPPSS Imperative for IoT - Ensuring Trust, Identity, Privacy, Protection...
 
Pushing AI to the Client with WebAssembly and Blazor
Pushing AI to the Client with WebAssembly and BlazorPushing AI to the Client with WebAssembly and Blazor
Pushing AI to the Client with WebAssembly and Blazor
 
Axon Server went RAFTing
Axon Server went RAFTingAxon Server went RAFTing
Axon Server went RAFTing
 
The Six Pitfalls of building a Microservices Architecture (and how to avoid t...
The Six Pitfalls of building a Microservices Architecture (and how to avoid t...The Six Pitfalls of building a Microservices Architecture (and how to avoid t...
The Six Pitfalls of building a Microservices Architecture (and how to avoid t...
 
Madaari : Ordering For The Monkeys
Madaari : Ordering For The MonkeysMadaari : Ordering For The Monkeys
Madaari : Ordering For The Monkeys
 
Servers are doomed to fail
Servers are doomed to failServers are doomed to fail
Servers are doomed to fail
 
Interaction Protocols: It's all about good manners
Interaction Protocols: It's all about good mannersInteraction Protocols: It's all about good manners
Interaction Protocols: It's all about good manners
 
A race of two compilers: GraalVM JIT versus HotSpot JIT C2. Which one offers ...
A race of two compilers: GraalVM JIT versus HotSpot JIT C2. Which one offers ...A race of two compilers: GraalVM JIT versus HotSpot JIT C2. Which one offers ...
A race of two compilers: GraalVM JIT versus HotSpot JIT C2. Which one offers ...
 
Leadership at every level
Leadership at every levelLeadership at every level
Leadership at every level
 
Machine Learning: The Bare Math Behind Libraries
Machine Learning: The Bare Math Behind LibrariesMachine Learning: The Bare Math Behind Libraries
Machine Learning: The Bare Math Behind Libraries
 

Dernier

DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 

Dernier (20)

DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 

Scala, docker and testing, oh my! mario camou

  • 1. Daniel Brown & Mario Camou Scala, Docker and Testing oh my! [Road]
  • 2. Who are we? Daniel Brown Software engineer at eBay Tinkerer and hacker of electronic devices Resident mad scientist @_dlpb / https://github.com/dlpb Mario Camou Software engineer at eBay 3D printing enthusiast and Doctor Who fan “Do what I do. Hold tight and pretend it’s a plan!” —The Doctor, Season 7, Christmas Special @thedoc / https://github.com/mcamou/
  • 3. Agenda ● Introduction to Docker ● Why would you use Docker in tests? ● How do you integrate Docker into a Scala project? ● Lessons learned
  • 5. Virtual Machines ● eBay’s default way of working ● Easy to provision (through a UI) ● In the “cloud” ● Choice of OS’s
  • 6. Virtual Machines ● Slow to provision internally ● Both API and UI ● Machines can, and do, disappear ● Internal connection latency
  • 7. Virtual Machines ● Time consuming to set up ● Not possible easily to automate setup ● e.g. databases, web servers, message queues (even with chef)
  • 8. Enter Docker Docker • /ˈdɒkər/ Noun An open platform for developers and sysadmins to build, ship and run applications “ [Docker]
  • 9. Enter Docker Dependencies ● Create images of dependencies [Docker]
  • 10. Enter Docker Dependencies ● Create images of dependencies ● Doesn't solve all setup issues ● But only needs to be done once [Docker]
  • 11. Enter Docker Dependencies ● Create images of dependencies ● Doesn't solve all setup issues ● But only needs to be done once ● Less storage overhead than VM ● Databases and webservers = GBs of data [Docker]
  • 16. Background: Our Goal Decouple our tests from other services [MFS]
  • 18. Isolation is Key ● Decompose the monolith ● Identify services we are dependent upon ● Stub the contract ● Run your tests [MFS]
  • 20. The Monolith A common way of working ● Everything is “in the library” ● Antipatterns ● Black Magic
  • 21. Identify Services we are Dependent Upon This can be the tricky step when everything is “in the framework” ● May require the use of debuggers, network sniffers etc ● Investment is worth it in the long run
  • 22. Identify Services we are Dependent Upon Move configuration of services out to easily controllable (and versionable) config ● Implement, or update, a client to use the new config ● Decoupling production from tests
  • 23. Stub the Contract Here you need to know ● The API mappings ● Expected Responses
  • 24. Stub the Contract Golden Rule: Keep it Simple! ● Have one response per stub ● Keep them versioned ● Put them in containers
  • 25. Run your Tests Now that we know our dependencies, contracts, and have stubs, we can write tests ● These are focussed only on testing that our system behaves as expected when downstream services offer varying responses ● We are NOT testing the downstream services
  • 26. Run your Tests ● Create a number of different stubs in different docker images ● Spin up the ones you need for your specific test ● When you are done with the test, tear them down and start again
  • 27. So How do you go about it?So, how do we go about it? [Hands]
  • 29. Normal Docker flow ● Create a Dockerfile ● Build the Docker image ● Push it to the registry ● Pull the image from every server
  • 30. Normal Docker flow ● No static checking of the Dockerfile ● Artifact build is separate from image build ○ Do you have the right artifacts? ○ Did you run the tests before building? ○ Are the latest bits in the image?
  • 31. Integrating Docker with sbt [Construction Kit]
  • 32. Integrating Docker with sbt sbt-docker An sbt plugin that: ● Creates a Dockerfile ● Creates an image based on that file ● Pushes the image to a registry https://github.com/marcuslonnberg/sbt-docker
  • 33. Setting the Image Name imageNames in docker := Seq( ImageName( namespace = Some("myOrg"), repository = name.value, tag = Some(s"v${version.value}") ), ImageName( namespace = Some("myOrg"), repository = name.value, tag = Some("latest") ) )
  • 34. Some Useful vals val artifact = (assemblyOutputPath in assembly).value val baseDir = "/srv" val preInstall = Seq( "/usr/bin/apt-get update", s"/usr/sbin/useradd -r -s /bin/false -d $baseDir myUser" ).mkString(" && ")
  • 35. Configuring the Dockerfile dockerfile in docker := { new Dockerfile { from("java:openjdk-8-jre") user("myUser") entryPoint("bin/run.sh") runRaw(preInstall) copy(new File("bin/run-docker.sh"), s"$baseDir/run.sh") copy(new File("local/etc"), "$baseDir/etc") copy(artifact, s"$baseDir/app.jar") runRaw("chown -R myUser $baseDir && chmod 0544 $baseDir/run.sh") } }
  • 36. Integrating with sbt-assembly Ensure assembly always runs before Docker docker <<= (docker dependsOn assembly)
  • 37. Creating and Publishing the Image sbt> docker sbt> dockerPush
  • 38. Caveats and Recommendations ● Create a fat JAR: sbt-assembly or sbt-native-packager ● In non-Linux platforms, start up docker-machine and set up the environment variables before starting sbt: $ docker-machine start theMachine $ eval $(docker-machine env theMachine) https://velvia.github.io/Docker-Scala-Sbt/
  • 40. Integration Testing with Docker Create Docker image(s) containing stubbed external resources ● Tests always run with clean data ● Resource startup is standardized ● Does not require multiple VMs or network calls
  • 41. Integration Testing with Docker Before your tests: ● Start up the stubbed resource containers ● Wait for the containers to start After your tests: ● Stop the containers Can we automate all of this?
  • 42. Container Orchestration during Tests Orchestration platforms ● Docker Compose ● Kubernetes ● …
  • 43. Container Orchestration during Tests Orchestration platforms ● Docker Compose ● Kubernetes ● … Orchestrate inside the test code
  • 44. Using the Docker Java API val config = DockerClientConfig.createDefaultConfigBuilder() .withServerAddress("tcp://192.168.99.100:2376") .withDockerCertPath("/path/to/certificates") .build val docker = DockerClientBuilder.getInstance(config).build val callback = new PullImageResultCallback docker.pullImageCmd("mongo:2.6.12").exec(callback) callback.awaitSuccess val container = docker.createContainerCmd("mongo:2.6.12") .withCmd("mongod", "--nojournal", "--smallfiles", "--syncdelay", "0") .exec docker.startContainerCmd(container.getId).exec docker.stopContainerCmd(container.getId).exec val exitcode = docker.waitContainerCmd(container.getId).exec
  • 45. Scala-native Solutions reactive-docker and tugboat ● Use the Docker REST API directly -> versioning problems ● Unmaintained for > 1 year (not updated to Docker 1.2 API) ● No TLS support
  • 46. Using reactive-docker implicit val docker = Docker("192.168.99.100", 2375) val timeout = 30.seconds val name = "mongodb-test" val cmd = Seq("mongod", "--nojournal", "--smallfiles", "--syncdelay", "0") val cfg = ContainerConfiguration(Some("mongo:2.6.12"), Some(cmd)) val (containerId, _) = Await.result( docker.containerCreate("mongo:2.6.5", cfg, Some(name)), timeout) val started = Await.result(docker.containerStart(containerId), timeout) val stopped = Await.ready(docker.containerStop(containerId), timeout) https://github.com/almoehi/reactive-docker
  • 47. Caveats and Recommendations ● Use beforeAll to ensure containers start up before tests ● Use afterAll to ensure containers stop after tests Caveats: ● Multiple container start/stops can make tests run much slower ● Need to check when resource (not just container) is up ● Single start/stop means testOnly/testQuick will start up all resources ● Ctrl+C will not stop the stubbed resource containers
  • 48. Introducing docker-it-scala ● Uses the (official) docker-java library ● Starts up resource containers in parallel ○ Only when they are needed ○ Once when the tests start ○ Waits for service (not just container) startup ● Automatically shuts down all started stub containers ● Configured via code or via Typesafe Config https://github.com/whisklabs/docker-it-scala [Docker-It-Scala]
  • 49. Defining a Resource Container ● Resources are declared as traits and mixed into tests ● Sample implementations available for Cassandra, ElasticSearch, Kafka, MongoDB, Neo4j, PostgreSQL, Zookeeper (in the docker- testkit-samples package) [Docker-It-Scala]
  • 50. Defining Resource Container (Neo4j) trait DockerNeo4jService extends DockerKit { val neo4jContainer = DockerContainer("whisk/neo4j:2.1.8") .withPorts(7474 -> None) .withReadyChecker( DockerReadyChecker.HttpResponseCode(7474, "/db/data/") .within(100.millis) .looped(20, 1250.millis) )) abstract override def dockerContainers: List[DockerContainer] = neo4jContainer :: super.dockerContainers } [Docker-It-Scala]
  • 51. Defining Resource Container (PostgreSQL) docker { postgres { image-name = "postgres:9.4.4" environmental-variables = ["POSTGRES_USER=nph", "POSTGRES_PASSWORD=suitup"] ready-checker { log-line = "database system is ready to accept connections" } port-maps { Default-postgres-port.internal = 5432 } } } [Docker-It-Scala]
  • 52. Defining Resource Container (PostgreSQL) trait DockerPostgresService extends DockerKitConfig { val postgresContainer = configureDockerContainer("docker.postgres") abstract override def dockerContainers: List[DockerContainer] = postgresContainer :: super.dockerContainers } [Docker-It-Scala]
  • 53. Writing Your Tests class MyMongoSpec extends FunSpec with DockerMongodbService { // Test assumes the MongoDB container is running } class MyPostgresSpec extends FunSpec with DockerNeo4jService { // Test assumes the Neo4j container is running } class MyAllSpec extends FunSpec with DockerMongodbService with DockerNeo4jService with DockerPostgresService{ // Test assumes all 3 containers are running } https://github.com/whisklabs/docker-it-scala [Docker-It-Scala]
  • 54. What Did We Achieve? [Space needle]
  • 55. The Effect ● We cut our end to end testing time 120 minutes -> 10 minutes [Clock]
  • 56. The Effect ● We cut our end to end testing time 120 minutes -> 10 minutes ● Confidence [Clock]
  • 57. Going Further ● Performance Measurements ● Business Decisions
  • 58. Performance measurements (from Stubbed Tests) Create mocks that can simulate (or approximate) real-world conditions ● E.g. ○ Drop every third request ○ Delay 5 seconds before responding ○ Respond instantly for every request
  • 59. Performance measurements (from Stubbed Tests) Use these new stubs to gather data about how your system performs ● When it is stressed; ● When downstream services are stressed
  • 60. Performance measurements (from Stubbed Tests) Use these new stubs to gather data about how your system performs ● When it is stressed; ● When downstream services are stressed Gather the metrics!
  • 61. Performance measurements (from Stubbed Tests) [MFS]
  • 62. Going Further What did we decide from the graph?
  • 63. Going Further What did we decide from the graph? ● Technical limitations for our product
  • 64. Going Further What did we decide from the graph? ● Technical limitations for our product ● Business policies for the product
  • 65. Summary Isolation is key to gathering meaningful test data and keeping testing strategies sane Docker can ease the pain of managing stub dependencies during integration testing Meaningful tests can tell you a lot about the behaviour of your system and therefore influence both architecture and UX
  • 67. Acknowledgements & Notes [Docker] Docker: www.docker.com Docker and the Docker logo are trademarks or registered trademarks of Docker, Inc. in the United States and/or other countries. Docker, Inc. and other parties may also have trademark rights in other terms used herein. [Fire], Fire image, Creative Commons CC0 License https://www.pexels. com/photo/fire-orange-emergency-burning-1749/ [Clock], Clock Image, Creative Commons https://www.flickr. com/photos/75680924@N08/6830220892/in/photostream/ [Space needle] Space needle, Creative Commons Zero https://unsplash.com/photos/-48aJfQpFCE [Explosion] Vehicle and building on fire, Creative Commons Zero https://unsplash.com/photos/28v9cq7ytNU [Stonehenge] Stonehenge, Public Domain [Cat] Firsalar the fluffy cat loves to sit in boxes, CC-BY 2.0 [Construction Kit] Free Universal Construction Kit by F.A.T. Lab and Sy- Lab http://fffff.at/free-universal-construction-kit/ [MFS] While MFS was released to production for a short time, it was not released for external customer use. [Audience] Audience, Creative Commons Zero https://unsplash.com/photos/bBQ9lhB-wpY [Bird] Bird Stare, Creative Commons Zero https://unsplash.com/photos/ig9lRTGT0h8 [Road] Yellow Brick road to Lost Hatch, CC-BY-NC 2.0 https://www.flickr. com/photos/wvs/352414272 [Hands] Mud Hands, CC-BY-NC 2.0 https://www.flickr. com/photos/migueltejadaflores/13783685515 [Docker-it-scala] Docker IT Scala, Whisk Labs, MIT https://github. com/whisklabs/docker-it-scala