Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TDD with Chef

Nathen Harvey
February 05, 2014

TDD with Chef

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

Nathen Harvey

February 05, 2014
Tweet

More Decks by Nathen Harvey

Other Decks in Technology

Transcript

  1. Test-driven Development with
    Chef
    1
    Thursday, February 6, 14

    View Slide

  2. Hello!
    • Nathen Harvey
    • Director Community & #learnchef
    • @nathenharvey
    [email protected]
    2
    Thursday, February 6, 14

    View Slide

  3. Who are you?
    • Developer?
    • System Administrator?
    • DevOp?
    • Experienced with Chef?
    • Test-driven development? (any flavor)
    • Ruby developer?
    3
    Thursday, February 6, 14

    View Slide

  4. Thursday, February 6, 14

    View Slide

  5. Software Development
    Workflows For Systems
    Administrators: A Crash Course
    Thursday, February 6, 14

    View Slide

  6. Developers Care
    • It’s great when
    developers care
    about
    • uptime!
    • scaling!
    • deployment!
    • Put them on call!
    etc. etc. etc.
    Thursday, February 6, 14

    View Slide

  7. Operations cares, too!
    • Systems Administrators
    also have as much or more to
    learn from developers as well!
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  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

    View Slide

  10. Source
    Code
    Compiler
    Artifact
    Test
    Typical Development Workflow
    • Compiler
    • Takes source code and
    converts it into executable
    programs
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  14. Thursday, February 6, 14

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  19. Cookbooks Are Artifacts
    Close Encounters of the Third Kind, copyright 1977, Columbia Pictures
    “This means something! This is important!”
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  26. Testing Cookbooks
    Source'
    Code'
    Compiler' Ar/fact' Test'
    X
    Thursday, February 6, 14

    View Slide

  27. Testing Cookbooks
    • Three things necessary to test a Chef cookbook:
    Source'
    Code'
    Compiler' Ar/fact' Test'
    X
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  32. Worksta(on:+
    edit+cookbook+
    Worksta(on:+
    knife+cookbook+
    upload+
    Target:+Run+
    chef9client+
    Traditional Cookbook Development: Subsequent Runs
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  36. Code Can (Help)
    Thursday, February 6, 14

    View Slide

  37. The Toolchain
    Thursday, February 6, 14

    View Slide

  38. The Toolchain
    • You’re becoming a developer!
    • Reasonably powerful computer
    • Good editor
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  40. Tools
    • Chef
    • Virtualization provider
    • Virtualization automation
    • Testing frameworks
    Code Can (Help)
    Thursday, February 6, 14

    View Slide

  41. Requirements
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  43. Worksta(on:+
    edit+cookbook+
    Worksta(on:+
    knife+cookbook+
    upload+
    Target:+Run+
    chef9client+
    Traditional Cookbook Development: Subsequent Runs
    Thursday, February 6, 14

    View Slide

  44. Pre-testing
    Thursday, February 6, 14

    View Slide

  45. Rubocop
    • A robust Ruby code analyzer, based on the
    community Ruby style guide.
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  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

    View Slide

  48. $ echo "inherit_from: rubocop-todo.yml" >> .rubocop.yml
    Rubocop Workflow
    Thursday, February 6, 14

    View Slide

  49. $ rubocop .
    Rubocop Workflow
    Inspecting 3 files
    ...
    3 files inspected, no offences detected
    Thursday, February 6, 14

    View Slide

  50. Rubocop Workflow
    • Uncomment lines in rubocop-todo.yml
    • Fix offences
    • git commit
    • Repeat
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  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

    View Slide

  53. Foodcritic
    http://foodcritic.io
    Thursday, February 6, 14

    View Slide

  54. OPEN IN EDITOR:
    SAVE FILE!
    metadata.rb
    name 'myface'
    maintainer 'Your Name'
    maintainer_email '[email protected]'
    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

    View Slide

  55. $ foodcritic .
    Run Foodcritic
    • Foodcritic returns a zero value if there are no
    violations
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  57. Testing
    Thursday, February 6, 14

    View Slide

  58. Different Types of Testing
    • There are formal
    Software Engineering
    definitions for testing
    Thursday, February 6, 14

    View Slide

  59. Different Types of Testing
    • There are formal
    Software Engineering
    definitions for testing
    • Unit test
    Thursday, February 6, 14

    View Slide

  60. Different Types of Testing
    • There are formal
    Software Engineering
    definitions for testing
    • Unit test
    • Integration test
    Thursday, February 6, 14

    View Slide

  61. Different Types of Testing
    • There are formal
    Software Engineering
    definitions for testing
    • Unit test
    • Integration test
    • Acceptance test
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  63. • Unit Test: Signal Input
    What and When To Test
    Flickr user: Rain Rabbit
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  69. Chef Testing Tools
    Thursday, February 6, 14

    View Slide

  70. Chef Testing Tools
    • Signal Input
    • ChefSpec
    Thursday, February 6, 14

    View Slide

  71. Chef Testing Tools
    • Signal Input
    • ChefSpec
    • Signal out
    • serverspec
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  73. Unit Testing: ChefSpec
    Thursday, February 6, 14

    View Slide

  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

    View Slide

  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

    View Slide

  76. Integration Testing
    Thursday, February 6, 14

    View Slide

  77. Thursday, February 6, 14

    View Slide

  78. Old School Testing
    Thursday, February 6, 14

    View Slide

  79. Review & Wrap Up
    • knife cookbook test
    • rubocop
    • foodcritic
    • chefspec
    • test-kitchen
    • serverspec
    • monitoring
    Thursday, February 6, 14

    View Slide

  80. Thank you!
    • What questions do you have?
    • Nathen Harvey
    • @nathenharvey
    [email protected]
    Thursday, February 6, 14

    View Slide