TDD with Chef

TDD with Chef

A brief introduction to test-driven development with Chef. This was given for the Infracoders London meetup group.

F820550e0c386dcc73b3ca0565a8bfff?s=128

Nathen Harvey

February 05, 2014
Tweet

Transcript

  1. 2.

    Hello! • Nathen Harvey • Director Community & #learnchef •

    @nathenharvey • nharvey@getchef.com 2 Thursday, February 6, 14
  2. 3.

    Who are you? • Developer? • System Administrator? • DevOp?

    • Experienced with Chef? • Test-driven development? (any flavor) • Ruby developer? 3 Thursday, February 6, 14
  3. 6.

    Developers Care • It’s great when developers care about •

    uptime! • scaling! • deployment! • Put them on call! etc. etc. etc. Thursday, February 6, 14
  4. 7.

    Operations cares, too! • Systems Administrators also have as much

    or more to learn from developers as well! Thursday, February 6, 14
  5. 8.

    Source Code Compiler Artifact Test Typical Development Workflow • Typical

    Software Development Workflow: • Write Source • Compile Source • Deploy Artifacts • Write Tests • Run Tests Thursday, February 6, 14
  6. 9.

    Source Code Compiler Artifact Test Typical Development Workflow • Source

    Code • The recipe for a computer program • Edited directly • Managed via Source Control Software Thursday, February 6, 14
  7. 10.

    Source Code Compiler Artifact Test Typical Development Workflow • Compiler

    • Takes source code and converts it into executable programs Thursday, February 6, 14
  8. 11.

    Source Code Compiler Artifact Test Typical Development Workflow • Artifact

    • Artifacts are executable programs created by compilers. • Compiled artifacts cannot be edited directly. Source code must be changed and re-compiled to produce a new build artifact. Thursday, February 6, 14
  9. 12.

    Source Code Compiler Artifact Test Typical Development Workflow • Testing

    • Write tests to verify that code works as intended • Run tests at different stages of the code lifecycle to ensure correctness Thursday, February 6, 14
  10. 13.

    Source Code Compiler Artifact Test Typical Development Workflow • When

    developing software, most time isn’t actually spent coding • 10-second changes to source code can take minutes to vet • Compiling code • Deploying code • Writing & Running tests Thursday, February 6, 14
  11. 15.

    Source Code Compiler Artifact Test Typical Development Workflow Fun! Boring!

    • Things that are fun: • Designing programs! • Writing source code! • Things that are boring: • Compiling code • Deploying artifacts • Running tests Thursday, February 6, 14
  12. 16.

    Cookbooks Are Source Code • Chef Cookbook source code is

    just like the source code for other programs. • Changes are tracked and versioned with source control software such as git • Code is inert until it has been deployed • Code can be used to re-create the desired system configuration from scratch Source' Code' Compiler' Ar/fact' Test' Thursday, February 6, 14
  13. 17.

    Cookbooks Aren’t Pre-Compiled • Because Ruby is an interpreted language,

    Chef code is not compiled until it is executed by the Chef-Client • There is no lengthy compilation step between committing Chef Cookbooks and deploying them Source' Code' Compiler' Ar/fact' Test' X Thursday, February 6, 14
  14. 18.

    Cookbooks Are Artifacts • Chef Cookbook artifacts are just like

    the artifacts for other programs. • Cookbooks are deployed • Cookbooks are released with versions • Cookbooks are immutable once deployed • Cookbooks are packaged for distribution • Cookbooks can depend on one another Source' Code' Compiler' Ar/fact' Test' X Thursday, February 6, 14
  15. 19.

    Cookbooks Are Artifacts Close Encounters of the Third Kind, copyright

    1977, Columbia Pictures “This means something! This is important!” Thursday, February 6, 14
  16. 20.

    Cookbooks Are Artifacts • Depending entirely on context, Chef Cookbooks

    can be either source code OR artifacts. Close Encounters of the Third Kind, copyright 1977, Columbia Pictures “This means something! This is important!” Thursday, February 6, 14
  17. 21.

    Cookbooks Are Artifacts • This sounds obvious, but it’s easy

    to overlook: Treating cookbooks only as source code or only as artifacts will lead to long-term problems when using Chef cookbooks to manage infrastructure. • Because Chef cookbooks are source code and artifacts, depending on the context, they have all the properties of each. Source' Code' Ar+fact' Thursday, February 6, 14
  18. 22.

    Cookbooks Are Artifacts • Cookbooks are source! • Versioned •

    Stored in a source repository • Inert while in development Source' Code' Ar+fact' A good Chef workflow treats cookbooks appropriately depending on context • Cookbooks are artifacts! • Versioned • Deployed to a Chef Server • Executable by Chef-client once deployed Thursday, February 6, 14
  19. 23.

    Keeping Repos in Sync • Common question: “How do I

    automatically keep my Chef Code Repository and my Chef Server Artifact Repository in sync?” • Answer: The same way that one would automatically keep a code repo and an artifact repo in sync with any other software released to production. Deploy with care! Source' Code' Ar+fact' A brief aside about deploying cookbook artifacts: Thursday, February 6, 14
  20. 24.

    • Cookbooks are Source! • knife cookbook create • Code:

    recipes/default.rb • Version & dependencies: metadata.rb • git commit • git tag Cookbooks as Source Code Source Code Compiler Artifact Test X Thursday, February 6, 14
  21. 25.

    Cookbooks as Artifacts • Cookbooks are Artifacts! • knife cookbook

    upload • Immutable once deployed, can only be replaced • Version & dependencies: metadata.rb • chef-client Source Code Compiler Artifact Test Thursday, February 6, 14
  22. 27.

    Testing Cookbooks • Three things necessary to test a Chef

    cookbook: Source' Code' Compiler' Ar/fact' Test' X Thursday, February 6, 14
  23. 28.

    Testing Cookbooks • Three things necessary to test a Chef

    cookbook: 1) A place to store the cookbook artifact. Source' Code' Compiler' Ar/fact' Test' X Thursday, February 6, 14
  24. 29.

    Testing Cookbooks • Three things necessary to test a Chef

    cookbook: 1) A place to store the cookbook artifact. 2) A Chef-client with access to the cookbook. Source' Code' Compiler' Ar/fact' Test' X Thursday, February 6, 14
  25. 30.

    Testing Cookbooks • Three things necessary to test a Chef

    cookbook: 1) A place to store the cookbook artifact. 2) A Chef-client with access to the cookbook. 3) A target server running the same OS as production. Source' Code' Compiler' Ar/fact' Test' X Thursday, February 6, 14
  26. 31.

    Worksta(on:+ Knife+cookbook+ create+ Worksta(on:+ Edit+cookbook+ Worksta(on:+ Knife+cookbook+ upload+ Provision+target+ Bootstrap+

    target+ Worksta(on:+ Edit+target+run+ list+ ssh+target+ Target:+Run+ chef>client+ Traditional Cookbook Development: First Chef Run Thursday, February 6, 14
  27. 33.

    Source'Code' Compiler' Ar/fact' Test' Boooooooring • Too much time doing

    “paperwork” •vi recipes/something.rb •knife cookbook upload •sudo pkill -USR1 chef- client • #%$#%$ something broke, let me do that all again • Not enough time doing fun stuff! • Writing recipes Less Fun! More Boring! X Thursday, February 6, 14
  28. 34.

    Source'Code' Compiler' Ar/fact' Test' Boooooooring • Too much time doing

    “paperwork” •vi recipes/something.rb •knife cookbook upload •sudo pkill -USR1 chef- client • #%$#%$ something broke, let me do that all again • Not enough time doing fun stuff! • Writing recipes Less Fun! More Boring! X TH IS SUCKS! Thursday, February 6, 14
  29. 35.

    Source'Code' Compiler' Ar/fact' Test' Developing for Chef: Rapid Iteration •

    Less time waiting around for cookbook deploys and Chef runs • More frequent testing • Better code • Business needs met more quickly More Fun! Less Boring! X Thursday, February 6, 14
  30. 38.

    The Toolchain • You’re becoming a developer! • Reasonably powerful

    computer • Good editor Thursday, February 6, 14
  31. 39.

    Have a Good Computer • Virtualization is used to run

    acceptance tests • Running on a real virtualized “node” • Lots of memory (4GB+, 8GB recommended) • Fast disk (SSD) • Good processor (Intel i5+) • Modern OS X Thursday, February 6, 14
  32. 40.

    Tools • Chef • Virtualization provider • Virtualization automation •

    Testing frameworks Code Can (Help) Thursday, February 6, 14
  33. 42.

    Requirements • We need a web server configured to serve

    up our home page. • Yes, • it’s super-simple • it’s not a “real-life” example • it will allow us to see lots of testing tools 36 Thursday, February 6, 14
  34. 45.

    Rubocop • A robust Ruby code analyzer, based on the

    community Ruby style guide. Thursday, February 6, 14
  35. 46.

    $ rubocop . Exercise: Run Foodcritic Inspecting 3 files CCC

    Offences: metadata.rb:1:1: C: Missing utf-8 encoding comment. name 'apache' ^ Thursday, February 6, 14
  36. 47.

    $ rubocop --auto-gen-config Rubocop Workflow ... 3 files inspected, 5

    offences detected Created rubocop-todo.yml. Run rubocop with --config rubocop-todo.yml, or add inherit_from: rubocop-todo.yml in a .rubocop.yml file. Thursday, February 6, 14
  37. 49.

    $ rubocop . Rubocop Workflow Inspecting 3 files ... 3

    files inspected, no offences detected Thursday, February 6, 14
  38. 50.

    Rubocop Workflow • Uncomment lines in rubocop-todo.yml • Fix offences

    • git commit • Repeat Thursday, February 6, 14
  39. 51.

    Foodcritic • Foodcritic is a code linting tool for Chef

    • Checks code correctness • Catches common mistakes before they cause problems • Extensible & Configurable • Create new rulesets • Ignore existing rulesets • Integrates nicely into CI pipelines Thursday, February 6, 14
  40. 52.

    $ foodcritic . Exercise: Run Foodcritic FC008: Generated cookbook metadata

    needs updating: ./metadata.rb:2 FC008: Generated cookbook metadata needs updating: ./metadata.rb:3 Thursday, February 6, 14
  41. 54.

    OPEN IN EDITOR: SAVE FILE! metadata.rb name 'myface' maintainer 'Your

    Name' maintainer_email 'you@example.com' license 'All rights reserved' description 'Installs/Configures myface' long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) version '0.1.0' Correct Foodcritic Errors Thursday, February 6, 14
  42. 55.

    $ foodcritic . Run Foodcritic • Foodcritic returns a zero

    value if there are no violations Thursday, February 6, 14
  43. 56.

    Best Practice: Run Foodcritic Before Each Commit • Always check

    in corrected code! • Make Foodcritic a part of your build pipeline with commit hooks or other methods • The Foodcritic web page has extensive documentation & examples showing how to build Foodcritic rules into Jenkins or Travis-CI Thursday, February 6, 14
  44. 58.

    Different Types of Testing • There are formal Software Engineering

    definitions for testing Thursday, February 6, 14
  45. 59.

    Different Types of Testing • There are formal Software Engineering

    definitions for testing • Unit test Thursday, February 6, 14
  46. 60.

    Different Types of Testing • There are formal Software Engineering

    definitions for testing • Unit test • Integration test Thursday, February 6, 14
  47. 61.

    Different Types of Testing • There are formal Software Engineering

    definitions for testing • Unit test • Integration test • Acceptance test Thursday, February 6, 14
  48. 62.

    Different Types of Testing • There are formal Software Engineering

    definitions for testing • Unit test • Integration test • Acceptance test • An easy explanation for SAs is ... Thursday, February 6, 14
  49. 63.

    • Unit Test: Signal Input What and When To Test

    Flickr user: Rain Rabbit Thursday, February 6, 14
  50. 64.

    • Unit Test: Signal Input • Did I send Chef

    the correct command? What and When To Test Flickr user: Rain Rabbit Thursday, February 6, 14
  51. 65.

    • Unit Test: Signal Input • Did I send Chef

    the correct command? • Signal Processing What and When To Test Flickr user: Rain Rabbit Thursday, February 6, 14
  52. 66.

    • Unit Test: Signal Input • Did I send Chef

    the correct command? • Signal Processing • Did Chef interpret my command correctly? What and When To Test Flickr user: Rain Rabbit Thursday, February 6, 14
  53. 67.

    • Unit Test: Signal Input • Did I send Chef

    the correct command? • Signal Processing • Did Chef interpret my command correctly? • Acceptance Test: Signal Output What and When To Test Flickr user: Rain Rabbit Thursday, February 6, 14
  54. 68.

    • Unit Test: Signal Input • Did I send Chef

    the correct command? • Signal Processing • Did Chef interpret my command correctly? • Acceptance Test: Signal Output • Did my expressed intent, executed by Chef, achieve the desired result? What and When To Test Flickr user: Rain Rabbit Thursday, February 6, 14
  55. 71.

    Chef Testing Tools • Signal Input • ChefSpec • Signal

    out • serverspec Thursday, February 6, 14
  56. 72.

    Chef Testing Tools • Signal Input • ChefSpec • Signal

    out • serverspec • Signal processing • Who cares; that’s what Chef’s own tests are for! Thursday, February 6, 14
  57. 74.

    ChefSpec Overview • Built on top of RSpec • Converge

    a Chef run in memory • Overrides all providers to take no action • Make assertions about the in-memory Chef run • Mock Ohai data (automatic attributes) with Fauxhai Thursday, February 6, 14
  58. 75.

    The Test Files: Chefspec • Each recipe gets an individual

    test file. • recipes/default.rb • specs/default_test.rb • In addition, a helper file lets us define our own functions for testing. • specs/spec_helper.rb Thursday, February 6, 14
  59. 79.

    Review & Wrap Up • knife cookbook test • rubocop

    • foodcritic • chefspec • test-kitchen • serverspec • monitoring Thursday, February 6, 14
  60. 80.

    Thank you! • What questions do you have? • Nathen

    Harvey • @nathenharvey • nharvey@getchef.com Thursday, February 6, 14