Professional Documents
Culture Documents
Automation and Developer Infrastructure: Empowering Engineers To Move From Idea To Production
Automation and Developer Infrastructure: Empowering Engineers To Move From Idea To Production
Automation and Developer Infrastructure: Empowering Engineers To Move From Idea To Production
Infrastructure
Empowering Engineers to Move from Idea to Production
Alex Thurlow
Engineering Manager
I help
peopl
e
get
jobs.
Unique Visitors (millions) Indeed is the #1
Million unique visitors external source of hire
180 64% of US job searchers search
180 M on indeed each month
160
180
140 million
120 unique users
80.2M
100
unique US visitors per month
80
16M
60 jobs
40 60+
countries
20
0 28
2009 2010 2011 2012 2013 2014 2015 languages
Alex Thurlow
Plus many more!
What should we build?
What’s best for the jobseeker?
How do we know?
Data-Driven Product Design
go.indeed.com/ddpd
Lean Startup Cycle
Build
Learn Measure
Deliver
Learn Measure
Data driven product design requires
quick feedback
Engineering Velocity
go.indeed.com/evtt
Engineering Velocity
go.indeed.com/evtt
Quickl
y!
Learn Measure
Deliver
Learn Measure
Engineering Velocity
go.indeed.com/evtt
Learn Measure
1:1 Mentorship
Setup = 2-3 Days
1-2 days left to get to production
Team Rotation
Helps new developer understand Indeed
Rotate every 4 weeks through 3 teams
Rotate every 4 weeks through 3 teams and face the
same setup challenges in each team.
Frustration!!!
Experienced devs face a similar
problem working on multiple projects
or switching projects
Service-Oriented Architecture
Search Webapp
Job Database
Search Webapp
Search
Webapp
Resume Location
Vagrantfi Job Service
service Service
le
Reproducible environments
Our Solution—The Good
Search
Webapp
Resume Location
Vagrantfi Job Service
service Service
le
Search Employer
Webapp Webapp
Job Job
Resume GeoIP Resume GeoIP
Search Search
Database Database Database Database
Index Index
Our Solution—The Bad
2 Quick startup
3 OS X support
2 Quick startup
3 OS X support
2 Quick startup
3 OS X support
2 Quick startup
3 OS X support
2 Quick startup
3 OS X support
2 Quick startup
3 OS X support
Container 2
Container 3
Container 1
Bins & Bins &
VM VM
Libs Libs
Guest Guest
OS OS
Host OS Host OS
Server with Virtual Server with Docker
Machines Containers
Docker terminology
Image
An OS filesystem
Docker terminology
Container
A running instance of an image
Docker terminology
Registry
A server for storing images
Hobo goals
2 Quick startup
3 OS X support
2 Quick startup
3 OS X support
2 Quick startup
3 OS X support
CentOS
Java
Publish hobo-
CentOS java
Docker allows “Inheriting” Images
Tomcat
Java
CentOS
Tomcat
Publish hobo-
hobo-java tomcat
Ready to use Hobo Images
TOMCAT
Hobo goals
2 Quick startup
3 OS X support
Search Webapp
[HOBO-SETTINGS]
depends = user-service search-service location-service
[job-service]
type = application
[job-service-mysql]
type = resource
[job-service-mongo]
type = resource
Hobo Config File
[HOBO-SETTINGS]
depends = user-service search-service location-service
[job-service]
type = application
[job-service-mysql]
type = resource
[job-service-mongo]
type = resource
Hobo Config File
[HOBO-SETTINGS]
depends = user-service search-service location-service
[job-service]
type = application
[job-service-mysql]
type = resource
[job-service-mongo]
type = resource
Hobo Config File
user-service
[HOBO-SETTINGS]
depends =
[user-service]
type = application
[user-service-mysql]
type = resource
Hobo goals
2 Quick startup
3 OS X support
2 Quick startup
3 OS X support
test
README
build.xm
l
hobo
src
test
README
build.xm
l
hobo
job-service
job-service-mysql
job-service-mongo
hobo_config
hobo
job-service
config
Dockerfile
run.sh
Dockerfile
FROM dockerreg.indeed.net/hobo/hobo-tomcat
hobo
job-service
config
tomcat.xm
l
mysql-
conn.properties
job-
service.properties
hobo
job-service
config
tomcat.xm
l
mysql-
conn.properties
job-
service.properties
myconfig
job-
service.properties
hobo
job-service
config
Dockerfile
run.sh
run.sh
Start/Stop commands
run.sh
Environment variables
run.sh
Volume mounts
What are volume mounts?
They mount parts of the host filesystem
into the container
What are volume mounts?
They mount parts of the host filesystem
into the container
What do we mount?
What do we mount?
Built code
What do we mount?
Configuration files
What do we mount?
Log directories
What do we mount?
Data directories
Hobo goals
2 Quick startup
3 OS X support
2014 Apr Jul Oct 2015 Apr Jul Oct 2016 Apr
330
Projects Configured For Hobo
“Sometimes I need to run apps from
other teams and the first thing I look
for is ‘Is this hobo’d?’. If so I’m happy!”
- Indeed Developer
15 minutes 30 seconds
10 times per week means
120 hours per year for each developer
Lessons Learned and Takeaways
Lessons Learned and Takeaways
Jenkins
Send bugs Delete
Create Code Mark Issue Check Git branch deploys in
Push to origin back to feature
Review as Resolved merge status QA
developer branches
environment
Yes
Merge
Take Code Check dependent Test release
Update issue Developer release to
Review issues of each in QA
statuses fixes bugs integration
Feedback feature environment
branch
Check Merge
Does the feature Merge
with feature
Creates Pull meet all release Are there release to
develope Create fix version branch to
Request criteria? bugs? production
r release
branch
Yes branch
Link other
Release fix
Create release dependent issues
version
branch to deploy ticket
Complex and manual
Goals of Our Release Process
Jenkins
Send bugs Delete
Create Code Mark Issue Check Git branch deploys in
Push to origin back to feature
Review as Resolved merge status QA
developer branches
environment
Yes
Merge
Take Code Check dependent Test release
Update issue Developer release to
Review issues of each in QA
statuses fixes bugs integration
Feedback feature environment
branch
Check Merge
Does the feature Merge
with feature
Creates Pull meet all release Are there release to
develope Create fix version branch to
Request criteria? bugs? production
r release
branch
Yes branch
Link other
Release fix
Create release dependent issues
version
branch to deploy ticket
The life of a feature
Develop Define Test Deploy
Feature Release & Record
We use standard development and
project management tools
&
Git: with great power comes
great complexity
Git flow
master
jira/IND-
123
master
jira/IND-
123
master
Develop Features
Local
development
Creates Pull
Request
Feature code can also be in libraries
Search Webapp
common-
common-webapp jobservice-api
database
Develop Features
Local
development
Creates Pull
Request
Release Managers Execute Releases
Goals of Our Release Process
Jenkins
Send bugs Delete
Create Code Mark Issue Check Git branch deploys in
Push to origin back to feature
Review as Resolved merge status QA
developer branches
environment
Yes
Merge
Take Code Check dependent Test release
Update issue Developer release to
Review issues of each in QA
statuses fixes bugs integration
Feedback feature environment
branch
Check Merge
Does the feature Merge
with feature
Creates Pull meet all release Are there release to
develope Create fix version branch to
Request criteria? bugs? production
r release
branch
Yes branch
Link other
Release fix
Create release dependent issues
version
branch to deploy ticket
Record
Develop Features Define Release Test Release
Release
Local Merge desired Build
Check Issue
developmen features to Release in Tag Release
Statuses
t release Jenkins
Jenkins
Send bugs Delete
Create Code Mark Issue Check Git branch deploys in
Push to origin back to feature
Review as Resolved merge status QA
developer branches
environment
Yes
Merge
Take Code Check dependent Test release
Update issue Developer release to
Review issues of each in QA
statuses fixes bugs integration
Feedback feature environment
branch
Check Merge
Does the feature Merge
with feature
Creates Pull meet all release Are there release to
develope Create fix version branch to
Request criteria? bugs? production
r release
branch
Yes branch
Link other
Release fix
Create release dependent issues
version
branch to deploy ticket
master
releas
e
Search Webapp
common-
common-webapp jobservice-api
database
Search Webapp
common-
common-webapp jobservice-api
database
1.2.6 1.0.1
3.1.5
Build Run Tests Deploy to QA
Goals of Our Release Process
Other App
Feature
Deploy
Fix Version
Ticket
Depends
upon
Other App
Feature
Deploy
Fix Version
Ticket
Other App
Feature
Test
Goals of Our Release Process
Jenkins
Send bugs Delete
Create Code Mark Issue Check Git branch deploys in
Push to origin back to feature
Review as Resolved merge status QA
developer branches
environment
Yes
Merge
Take Code Check dependent Test release
Update issue Developer release to
Review issues of each in QA
statuses fixes bugs integration
Feedback feature environment
branch
Check Merge
Does the feature Merge
with feature
Creates Pull meet all release Are there release to
develope Create fix version branch to
Request criteria? bugs? production
r release
branch
Yes branch
Link other
Release fix
Create release dependent issues
version
branch to deploy ticket
Deploy!
Goals of Our Release Process
Jenkins
Send bugs Delete
Create Code Mark Issue Check Git branch deploys in
Push to origin back to feature
Review as Resolved merge status QA
developer branches
environment
Yes
Merge
Take Code Check dependent Test release
Update issue Developer release to
Review issues of each in QA
statuses fixes bugs integration
Feedback feature environment
branch
Check Merge
Does the feature Merge
with feature
Creates Pull meet all release Are there release to
develope Create fix version branch to
Request criteria? bugs? production
r release
branch
Yes branch
Link other
Release fix
Create release dependent issues
version
branch to deploy ticket
jira/IND-
123
master
release
jira/IND-
123
master
deploy/2016-06-
22
jira/IND-
123
master
deploy/2016-06-
22
master
deploy/2016-06-
22
JIRA updates
Close released issues
JIRA updates
Close deploy ticket
JIRA updates
Mark Fix Version as “Released”
Record
Develop Features Define Release Test Release Release
Local Merge desired Build
Check Issue
developmen features to Release in Tag Release
Statuses
t release Jenkins
Jenkins
Send bugs Delete
Create Code Mark Issue Check Git branch deploys in
Push to origin back to feature
Review as Resolved merge status QA
developer branches
environment
Yes
Merge
Take Code Check dependent Test release
Update issue Developer release to
Review issues of each in QA
statuses fixes bugs integration
Feedback feature environment
branch
Check Merge
Does the feature Merge
with feature
Creates Pull meet all release Are there release to
develope Create fix version branch to
Request criteria? bugs? production
r release
branch
Yes branch
Link other
Release fix
Create release dependent issues
version
branch to deploy ticket
Goals of Our Release Process
>100
Clicks and Git Commands
~13
Extra Actions Per Feature
Total Developers Producing Code By Month
common-
common-webapp jobservice-api
database
1.2.6 1.0.1
3.1.5
Goals of Our Release Process
Jenkins
Send bugs Delete
Create Code Mark Issue Check Git branch deploys in
Push to origin back to feature
Review as Resolved merge status QA
developer branches
environment
Yes
Merge
Take Code Check dependent Test release
Update issue Developer release to
Review issues of each in QA
statuses fixes bugs integration
Feedback feature environment
branch
Check Merge
Does the feature Merge
with feature
Creates Pull meet all release Are there release to
develope Create fix version branch to
Request criteria? bugs? production
r release
branch
Yes branch
Link other
Release fix
Create release dependent issues
version
branch to deploy ticket
Record
Develop Features Define Release Test Release
Release
Local Merge desired Build
Check Issue
developmen features to Release in Tag Release
Statuses
t release Jenkins
Jenkins
Send bugs Delete
Create Code Mark Issue Check Git branch deploys in
Push to origin back to feature
Review as Resolved merge status QA
developer branches
environment
Yes
Merge
Take Code Check dependent Test release
Update issue Developer release to
Review issues of each in QA
statuses fixes bugs integration
Feedback feature environment
branch
Check Merge
Does the feature Merge
with feature
Creates Pull meet all release Are there release to
develope Create fix version branch to
Request criteria? bugs? production
r release
branch
Yes branch
Link other
Release fix
Create release dependent issues
version
branch to deploy ticket
Goals of Our Release Process
Jenkins
Send bugs Delete
Create Code Mark Issue Check Git branch deploys in
Push to origin back to feature
Review as Resolved merge status QA
developer branches
environment
Yes
Merge
Take Code Check dependent Test release
Update issue Developer release to
Review issues of each in QA
statuses fixes bugs integration
Feedback feature environment
branch
Check Merge
Does the feature Merge
with feature
Creates Pull meet all release Are there release to
develope Create fix version branch to
Request criteria? bugs? production
r release
branch
Yes branch
Link other
Release fix
Create release dependent issues
version
branch to deploy ticket
jira/IND-123
master
release
IND-123 commits In release IND-123 commit Not in release
jira/IND-123
master
release
jira/IND-123
master
release
Goals of Our Release Process
Jenkins
Send bugs Delete
Create Code Mark Issue Check Git branch deploys in
Push to origin back to feature
Review as Resolved merge status QA
developer branches
environment
Yes
Merge
Take Code Check dependent Test release
Update issue Developer release to
Review issues of each in QA
statuses fixes bugs integration
Feedback feature environment
branch
Check Merge
Does the feature Merge
with feature
Creates Pull meet all release Are there release to
develope Create fix version branch to
Request criteria? bugs? production
r release
branch
Yes branch
Link other
Release fix
Create release dependent issues
version
branch to deploy ticket
Record
Develop Features Define Release Test Release Release
Local Merge desired Build
Check Issue
developmen features to Release in Tag Release
Statuses
t release Jenkins
Jenkins
Send bugs Delete
Create Code Mark Issue Check Git branch deploys in
Push to origin back to feature
Review as Resolved merge status QA
developer branches
environment
Yes
Merge
Take Code Check dependent Test release
Update issue Developer release to
Review issues of each in QA
statuses fixes bugs integration
Feedback feature environment
branch
Check Merge
Does the feature Merge
with feature
Creates Pull meet all release Are there release to
develope Create fix version branch to
Request criteria? bugs? production
r release
branch
Yes branch
Link other
Release fix
Create release dependent issues
version
branch to deploy ticket
Record
Develop Features Define Release Test Release Release
Local Merge desired Build
Check Issue
developmen features to Release in Tag Release
Statuses
t release Jenkins
Jenkins
Send bugs Delete
Create Code Mark Issue Check Git branch deploys in
Push to origin back to feature
Review as Resolved merge status QA
developer branches
environment
Yes
Merge
Take Code Check dependent Test release
Update issue Developer release to
Review issues of each in QA
statuses fixes bugs integration
Feedback feature environment
branch
Check Merge
Does the feature Merge
with feature
Creates Pull meet all release Are there release to
develope Create fix version branch to
Request criteria? bugs? production
r release
branch
Yes branch
Link other
Release fix
Create release dependent issues
version
branch to deploy ticket
Develop Define Test Deploy
Feature Release
Results
Problems
>100
Clicks and Git Commands
Release with 4 features
<15
Control Tower Clicks
~13
Extra Actions Per Feature
0
Extra Actions Per Feature
Deploys per month
Open Source -
opensource.indeedeng.io
Careers - indeed.jobs
Twitter - @IndeedEng