SlideShare a Scribd company logo
ROBOT SWEATSHOP
Lightweight, non-opinionated Continuous Integration
WHOAMI
github.com/JScott
WHATAMIDOING
Please send help
Continuous Integration with Robot Sweatshop
Continuous Integration with Robot Sweatshop
JENKINS
…
<builders>
<hudson.tasks.Shell>
<command>cd telus
mkdir -p target
cucumber -p json_report</command>
</hudson.tasks.Shell>
</builders>
…
– a Jenkins user
“I’d rather work around a bad tool than maintain
something new.”
BUILDBOT
from buildbot.process.factory import BuildFactory
from buildbot.steps.source import SVN
from buildbot.steps.shell import ShellCommand
checkout = SVN(baseURL = 'git@myrepos.com:portal-project.git',
mode = "update",
username = "foo",
password = "bar",
haltOnFailure = True )
mkdir = ShellCommand(name = "mkdir -p telus/target",
command = ["mkdir", "-p", "telus/target"],
description = "make the results path")
cucumber = ShellCommand(name = "cucumber -p json_report",
command = ["cucumber", "-p", "json_report"],
description = "run Cucumber tests")
logresults = ShellCommand(name = "log-cucumber telus/target",
command = ["log-cucumber", "telus/target"],
description = "upload results")
factory = BuildFactory()
factory.addStep(checkout)
factory.addStep(mkdir)
factory.addStep(cucumber)
factory.addStep(logresults)
c['builders'] = [
BuilderConfig(name = "portal-project",
slavenames = ['slave1', 'slave2', 'slave3'],
factory = factory)
]
http://docs.buildbot.net/current/tutorial/fiveminutes.html
“Typically, at first sight it looks like a bunch of
complicated concepts that make no sense and whose
relationships with each other are unclear.”
STOP
SUFFERING
BADTOOLS
We can do better
ROBOT SWEATSHOP
jobs/portal-project.yaml
---
branch_whitelist:
- develop
commands:
- mkdir -p telus/target
- cucumber -p json_report
- log-cucumber telus/target
SIDE-BY-SIDE CONFIGS
<?xml version='1.0' encoding='UTF-8'?>
<project>
<actions/>
<description>requires these gems:&#xd;
statsd-ruby&#xd;
selenium-webdriver&#xd;
cucumber&#xd;
json&#xd;
RMagick</description>
<logRotator class="hudson.tasks.LogRotator">
<daysToKeep>10</daysToKeep>
<numToKeep>-1</numToKeep>
<artifactDaysToKeep>-1</artifactDaysToKeep>
<artifactNumToKeep>-1</artifactNumToKeep>
</logRotator>
<keepDependencies>false</keepDependencies>
<properties/>
<scm class="hudson.plugins.git.GitSCM" plugin="git@2.2.1">
<configVersion>2</configVersion>
<userRemoteConfigs>
<hudson.plugins.git.UserRemoteConfig>
<url>git@bitbucket.org:webchannel/uss-cucumber.git</url>
<credentialsId>ad5d9dcc-cb2f-42a4-8e9a-f47b3208ce0c</credentialsId>
</hudson.plugins.git.UserRemoteConfig>
</userRemoteConfigs>
<branches>
<hudson.plugins.git.BranchSpec>
<name>*/develop</name>
</hudson.plugins.git.BranchSpec>
</branches>
<doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations>
<submoduleCfg class="list"/>
<extensions>
<hudson.plugins.git.extensions.impl.CloneOption>
<shallow>true</shallow>
<reference></reference>
</hudson.plugins.git.extensions.impl.CloneOption>
</extensions>
</scm>
<canRoam>true</canRoam>
<disabled>false</disabled>
<blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding>
<blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding>
<triggers>
<hudson.triggers.TimerTrigger>
<spec>H 11 * * *</spec>
</hudson.triggers.TimerTrigger>
</triggers>
<concurrentBuild>false</concurrentBuild>
<builders>
<hudson.tasks.Shell>
<command>cd telus
mkdir -p target
cucumber -p json_report -p remote_ff</command>
</hudson.tasks.Shell>
</builders>
<publishers>
<org.jenkinsci.plugins.cucumber.jsontestsupport.CucumberTestResultArchiver
plugin="cucumber-testresult-plugin@0.4">
<testResults>telus/target/features_report.json</testResults>
</org.jenkinsci.plugins.cucumber.jsontestsupport.CucumberTestResultArchiver>
<hudson.tasks.Mailer plugin="mailer@1.8">
<recipients>krystal.jackson2@telus.com leon.yu@telus.com
jonathan.shin@telus.com Brendan.Brow@telus.com</recipients>
<dontNotifyEveryUnstableBuild>false</dontNotifyEveryUnstableBuild>
<sendToIndividuals>false</sendToIndividuals>
</hudson.tasks.Mailer>
</publishers>
<buildWrapp
from buildbot.process.factory import BuildFactory
from buildbot.steps.source import SVN
from buildbot.steps.shell import ShellCommand
checkout = SVN(baseURL = 'git@myrepos.com:portal-project.git',
mode = "update",
username = "foo",
password = "bar",
haltOnFailure = True )
mkdir = ShellCommand(name = "mkdir -p telus/target",
command = ["mkdir", "-p", "telus/target"],
description = "make the results path")
cucumber = ShellCommand(name = "cucumber -p json_report",
command = ["cucumber", "-p", "json_report"],
description = "run Cucumber tests")
logresults = ShellCommand(name = "log-cucumber telus/target",
command = ["log-cucumber", "telus/target"],
description = "upload results")
factory = BuildFactory()
factory.addStep(checkout)
factory.addStep(mkdir)
factory.addStep(cucumber)
factory.addStep(logresults)
c['builders'] = [
BuilderConfig(name = "portal-project",
slavenames = ['slave1', 'slave2', 'slave3'],
factory = factory)
]
---
branch_whitelist:
- develop
commands:
- mkdir -p telus/target
- cucumber -p json_report
- log-cucumber telus/target
67
33+
8
USAGE DEMO
https://asciinema.org/a/22878
http://localhost:10554
THE FUTURE
Robot Sweatshop
• Output node
• Multiple workers easily
• Implicit job (done!)
• Non-TCP connections
• Worker Docker support
Sweatshop Gears
• Scaffolding scripts
• Custom repos
• Service hub
• Update/uninstall
• List/show
• Docker helper scripts
QUESTIONS?
robotsweat.com
But what about all the crunchy parts…?
UNDERTHE HOOD
overcoming some interesting challenges
DISTRIBUTED ARCHITECTURE
github.com/kostya/eye
JOB REQUEST RESILIENCE
GEARS DEMO
package management tool for non-core bits
https://asciinema.org/a/22878
QUESTIONS?
robotsweat.com

More Related Content

ODP
Chef training Day4
PDF
Lviv 2013 d7 vs d8
PDF
React, Redux and es6/7
PDF
Unity and WebSockets
PDF
Creating ASTTs The painful truth
PDF
Svelte JS introduction
PPTX
2. auto deploy to tomcat on jenkins
PDF
MeaNstack on Docker
Chef training Day4
Lviv 2013 d7 vs d8
React, Redux and es6/7
Unity and WebSockets
Creating ASTTs The painful truth
Svelte JS introduction
2. auto deploy to tomcat on jenkins
MeaNstack on Docker

What's hot (18)

PDF
Modern web applications infrastructure
PDF
Npm scripts
PDF
«От экспериментов с инфраструктурой до внедрения в продакшен»​
KEY
Write php deploy everywhere
PDF
第1回名古屋Grails/Groogy勉強会「Grailsを始めてみよう!」
PDF
Redux for ReactJS Programmers
PDF
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)
PDF
Get Grulping with JavaScript Task Runners (Matt Gifford)
PDF
Grooscript and Grails 3
ZIP
Zenoss: Buildout
PDF
COSCUP 2020 Google 技術 x 公共參與 x 開源 口罩地圖技術開源
PDF
Bfg Ploneconf Oct2008
PDF
UA Testing with Selenium and PHPUnit - ZendCon 2013
PDF
Big query - Command line tools and Tips - (MOSG)
PDF
Using Test Kitchen for testing Chef cookbooks
PDF
Ansible loves Python, Python Philadelphia meetup
PPTX
Getting Started With ReactJS
Modern web applications infrastructure
Npm scripts
«От экспериментов с инфраструктурой до внедрения в продакшен»​
Write php deploy everywhere
第1回名古屋Grails/Groogy勉強会「Grailsを始めてみよう!」
Redux for ReactJS Programmers
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)
Get Grulping with JavaScript Task Runners (Matt Gifford)
Grooscript and Grails 3
Zenoss: Buildout
COSCUP 2020 Google 技術 x 公共參與 x 開源 口罩地圖技術開源
Bfg Ploneconf Oct2008
UA Testing with Selenium and PHPUnit - ZendCon 2013
Big query - Command line tools and Tips - (MOSG)
Using Test Kitchen for testing Chef cookbooks
Ansible loves Python, Python Philadelphia meetup
Getting Started With ReactJS
Ad

Viewers also liked (9)

DOCX
JW_June_2015
PPT
All A'Board!!!
PDF
OSYPKA _EP-Products
PDF
UM_International_Strategy_2014_FINAL_September_2014
PDF
Ultraseal LAA
PDF
Osypka Electrophysiology Products
PPTX
Jurisdiction in disputes on trademarks infringement in Internet
PPTX
Tomarov Jurisdiction in Online IP Infringement Cases: Ukraine & EU 2016
PPTX
Meet John Doe 2016
JW_June_2015
All A'Board!!!
OSYPKA _EP-Products
UM_International_Strategy_2014_FINAL_September_2014
Ultraseal LAA
Osypka Electrophysiology Products
Jurisdiction in disputes on trademarks infringement in Internet
Tomarov Jurisdiction in Online IP Infringement Cases: Ukraine & EU 2016
Meet John Doe 2016
Ad

Similar to Continuous Integration with Robot Sweatshop (6)

PPTX
Meet Jenkins
PDF
Integration Test Cucumber + Webrat + Selenium
 
PDF
454976614-Jenkins-Cheat-Sheet-pdf.pdf hoja de ayuda
PDF
JUC Europe 2015: Hey! What Did We Just Release?
PPTX
Moving from Jenkins 1 to 2 declarative pipeline adventures
PPTX
Test automation
Meet Jenkins
Integration Test Cucumber + Webrat + Selenium
 
454976614-Jenkins-Cheat-Sheet-pdf.pdf hoja de ayuda
JUC Europe 2015: Hey! What Did We Just Release?
Moving from Jenkins 1 to 2 declarative pipeline adventures
Test automation

Recently uploaded (20)

PDF
Electronic commerce courselecture one. Pdf
PPTX
A Presentation on Artificial Intelligence
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
KodekX | Application Modernization Development
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Machine learning based COVID-19 study performance prediction
PDF
Modernizing your data center with Dell and AMD
PPTX
Cloud computing and distributed systems.
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PPT
Teaching material agriculture food technology
PDF
NewMind AI Monthly Chronicles - July 2025
Electronic commerce courselecture one. Pdf
A Presentation on Artificial Intelligence
CIFDAQ's Market Insight: SEC Turns Pro Crypto
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
KodekX | Application Modernization Development
Chapter 3 Spatial Domain Image Processing.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing
Understanding_Digital_Forensics_Presentation.pptx
Machine learning based COVID-19 study performance prediction
Modernizing your data center with Dell and AMD
Cloud computing and distributed systems.
Digital-Transformation-Roadmap-for-Companies.pptx
20250228 LYD VKU AI Blended-Learning.pptx
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Mobile App Security Testing_ A Comprehensive Guide.pdf
Spectral efficient network and resource selection model in 5G networks
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Teaching material agriculture food technology
NewMind AI Monthly Chronicles - July 2025

Continuous Integration with Robot Sweatshop

  • 6. JENKINS … <builders> <hudson.tasks.Shell> <command>cd telus mkdir -p target cucumber -p json_report</command> </hudson.tasks.Shell> </builders> …
  • 7. – a Jenkins user “I’d rather work around a bad tool than maintain something new.”
  • 8. BUILDBOT from buildbot.process.factory import BuildFactory from buildbot.steps.source import SVN from buildbot.steps.shell import ShellCommand checkout = SVN(baseURL = 'git@myrepos.com:portal-project.git', mode = "update", username = "foo", password = "bar", haltOnFailure = True ) mkdir = ShellCommand(name = "mkdir -p telus/target", command = ["mkdir", "-p", "telus/target"], description = "make the results path") cucumber = ShellCommand(name = "cucumber -p json_report", command = ["cucumber", "-p", "json_report"], description = "run Cucumber tests") logresults = ShellCommand(name = "log-cucumber telus/target", command = ["log-cucumber", "telus/target"], description = "upload results") factory = BuildFactory() factory.addStep(checkout) factory.addStep(mkdir) factory.addStep(cucumber) factory.addStep(logresults) c['builders'] = [ BuilderConfig(name = "portal-project", slavenames = ['slave1', 'slave2', 'slave3'], factory = factory) ]
  • 9. http://docs.buildbot.net/current/tutorial/fiveminutes.html “Typically, at first sight it looks like a bunch of complicated concepts that make no sense and whose relationships with each other are unclear.”
  • 11. ROBOT SWEATSHOP jobs/portal-project.yaml --- branch_whitelist: - develop commands: - mkdir -p telus/target - cucumber -p json_report - log-cucumber telus/target
  • 12. SIDE-BY-SIDE CONFIGS <?xml version='1.0' encoding='UTF-8'?> <project> <actions/> <description>requires these gems:&#xd; statsd-ruby&#xd; selenium-webdriver&#xd; cucumber&#xd; json&#xd; RMagick</description> <logRotator class="hudson.tasks.LogRotator"> <daysToKeep>10</daysToKeep> <numToKeep>-1</numToKeep> <artifactDaysToKeep>-1</artifactDaysToKeep> <artifactNumToKeep>-1</artifactNumToKeep> </logRotator> <keepDependencies>false</keepDependencies> <properties/> <scm class="hudson.plugins.git.GitSCM" plugin="git@2.2.1"> <configVersion>2</configVersion> <userRemoteConfigs> <hudson.plugins.git.UserRemoteConfig> <url>git@bitbucket.org:webchannel/uss-cucumber.git</url> <credentialsId>ad5d9dcc-cb2f-42a4-8e9a-f47b3208ce0c</credentialsId> </hudson.plugins.git.UserRemoteConfig> </userRemoteConfigs> <branches> <hudson.plugins.git.BranchSpec> <name>*/develop</name> </hudson.plugins.git.BranchSpec> </branches> <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations> <submoduleCfg class="list"/> <extensions> <hudson.plugins.git.extensions.impl.CloneOption> <shallow>true</shallow> <reference></reference> </hudson.plugins.git.extensions.impl.CloneOption> </extensions> </scm> <canRoam>true</canRoam> <disabled>false</disabled> <blockBuildWhenDownstreamBuilding>false</blockBuildWhenDownstreamBuilding> <blockBuildWhenUpstreamBuilding>false</blockBuildWhenUpstreamBuilding> <triggers> <hudson.triggers.TimerTrigger> <spec>H 11 * * *</spec> </hudson.triggers.TimerTrigger> </triggers> <concurrentBuild>false</concurrentBuild> <builders> <hudson.tasks.Shell> <command>cd telus mkdir -p target cucumber -p json_report -p remote_ff</command> </hudson.tasks.Shell> </builders> <publishers> <org.jenkinsci.plugins.cucumber.jsontestsupport.CucumberTestResultArchiver plugin="cucumber-testresult-plugin@0.4"> <testResults>telus/target/features_report.json</testResults> </org.jenkinsci.plugins.cucumber.jsontestsupport.CucumberTestResultArchiver> <hudson.tasks.Mailer plugin="mailer@1.8"> <recipients>krystal.jackson2@telus.com leon.yu@telus.com jonathan.shin@telus.com Brendan.Brow@telus.com</recipients> <dontNotifyEveryUnstableBuild>false</dontNotifyEveryUnstableBuild> <sendToIndividuals>false</sendToIndividuals> </hudson.tasks.Mailer> </publishers> <buildWrapp from buildbot.process.factory import BuildFactory from buildbot.steps.source import SVN from buildbot.steps.shell import ShellCommand checkout = SVN(baseURL = 'git@myrepos.com:portal-project.git', mode = "update", username = "foo", password = "bar", haltOnFailure = True ) mkdir = ShellCommand(name = "mkdir -p telus/target", command = ["mkdir", "-p", "telus/target"], description = "make the results path") cucumber = ShellCommand(name = "cucumber -p json_report", command = ["cucumber", "-p", "json_report"], description = "run Cucumber tests") logresults = ShellCommand(name = "log-cucumber telus/target", command = ["log-cucumber", "telus/target"], description = "upload results") factory = BuildFactory() factory.addStep(checkout) factory.addStep(mkdir) factory.addStep(cucumber) factory.addStep(logresults) c['builders'] = [ BuilderConfig(name = "portal-project", slavenames = ['slave1', 'slave2', 'slave3'], factory = factory) ] --- branch_whitelist: - develop commands: - mkdir -p telus/target - cucumber -p json_report - log-cucumber telus/target 67 33+ 8
  • 14. THE FUTURE Robot Sweatshop • Output node • Multiple workers easily • Implicit job (done!) • Non-TCP connections • Worker Docker support Sweatshop Gears • Scaffolding scripts • Custom repos • Service hub • Update/uninstall • List/show • Docker helper scripts
  • 15. QUESTIONS? robotsweat.com But what about all the crunchy parts…?
  • 16. UNDERTHE HOOD overcoming some interesting challenges
  • 19. GEARS DEMO package management tool for non-core bits https://asciinema.org/a/22878