a per-build basis ▪ Not tryable ◦ Requires master restart to change • Iron-fisted RPC control of the slave ◦ Restarting master kills all running jobs. • Callback-passing style (twistd) ◦ Difficult to debug ◦ Difficult to test Problems?
the slave ◦ recipes.py --recipe chromium.py • The recipe executes and generates commands to build/test your project ◦ git clone ◦ python compile.py ◦ ... • Recipe framework executes them and sends logs back to master • Master will parse the logs and extract annotations to generate steps ◦ @@@SEED_STEP@setup_build@@@ ◦ @@@STEP_STARTED@@@
api.chromium.runtest('v8/test262').json.failed_tests def RunSteps(api): api.gclient.set_config('chromium_with_v8_tot') api.gclient.checkout() api.tryserver.apply_patch() failed_tests_with_patch = compile_and_test() if not failed_tests_with_patch: return # patch is OK api.tryserver.deapply_patch() failed_tests_without_patch = compile_and_test() # patch is OK iff failed_tests_with_patch == failed_tests_without_patch Try a Test With and Without a Patch
of micro-services that work in Cloud to provide a scalable CI system. • Most services are implemented in Go • Yet, all build/test logic is still implemented as recipes! ◦ And works seamlessly with a completely different underlying architecture. • Mature and reliable system ◦ Tested on dozens of projects ◦ Users wrote hundreds of recipes It’s fully open source! Try it out for your projects.