Development Quality for Ruby and Chef (DevOps Weekly #298)

originally posted medium

A few years ago I wrote a small blog post about how to setup a local development environment for Chef using Vagrant and Test-Kitchen (you can see it here).

Lately I’ve been questioned about how to maintain a codebase through the years and how to work on/find quality metrics.

A lot of people come from previous background where just vi/nano is required to lash out some code and moving to Ruby/Chef it seems only the language changed but there wasn’t much investment on better software development practices.

I’m now describing my Ruby/Chef local setup hoping it will help people get out of the rut or get some feedback for myself about tools/processes I might be missing out on.

I’m assuming the previous article was read or people are aware of its contents so I won’t re-explain Bundler, Gemfiles, RbEnv, etc.

I’m also using the Atom editor so a lot of the integration will go through its plugins.

Preparation Link to heading

I have a WIP Git repository which install all the plugins and configures Atom. Please check README.md for more details.

Unit Testing Link to heading

In first place we have unit testing, I’m a big fan of TDD and in Ruby there I’m using Rspec and following practices from Better Spec.

For Chef the option is Chefspec (which also includes Berkshelf support)

I’m also running Guard/Guard-Rspec in the background which will re-run tests based on file changes so I don’t need to be reminded — I can set up alerts in case tests fail.

image

Guard running for the unit tests

Another useful library is Timecop which allows me to time travel on time specific code — ensuring no external dependencies in that aspect and testing edge cases like timeouts.

If you’re still using ERB for local Ruby debugging then I’d suggest moving to Pry, it has too many features to mention but just the debugging is a lifesaver.

image

Pry binding example from the Pry website

Integration Testing Link to heading

Integration testing (between different layers, services, but only testing one relation at a time) is also done in Rspec. You can split the folder structure in a way that integration runs separately on guard (or not).

I also use Fakeweb which will allow me to stub out any HTTP calls outside the scope of the test.

As for Chef there is Serverspec available or more recently Inspec

Acceptance Testing Link to heading

For this I’m running Cucumber and Capybara so I can test end user behaviour either it is a website or an API.

Static Code Analysis Link to heading

Editor tools Link to heading

I’m using Rubocop for analysing code based on the community ruby style guide.

Also on Atom I’m using the Linter-Rubocop to have per line information about the issues.

As well as Linter-Ruby/Linter-ERB.

And if you feel a bit dangerous you can Rubocop-auto-correctto automatically apply the changes.

If you work with Chef there is also Foodcritic for Chef specific style guide and on Atom there is Linter-Foodcritic (I think you see where this is going).

image

Atom running the previously named plugins

Other languages Link to heading

Linter-JSON— Useful for Cloudformation or any JSON… Uses JSONLint

Linter-Shellcheck — Linter for Shell scripts (which you’ll almost certainly have around)

Linter-Docker / Language-Docker****— Linting and Syntax Highlighting.

Linter-YAML****— Using it for Test-kitchen and docker YAML.

Background tools Link to heading

Rubycritic

We can use Rubycritic and Guard-Rubycritic to report ruby code smells. I like to run Rubycritic once in a while to get a page with a report.

image

image

Images from the official Rubycritic page

Rubycritic runs with three highly influential gems:

Reek****—Code smell detector

Flag — Structural similarities (code duplication, variable names, …)

Flog****— Code complexity

I also run Linter-Reek for Atom to more quickly address issues before waiting for Rubycritic and find line numbers.

Simplecov

Simplecov is a code coverage generator, and it does what it says in the tin.

image

image from Rubyinsider

Debride

Debride looks for methods which it thinks are not in use. You can also install Debride-ERB which is useful for Chef config files.

image

Debride

Fasterer

Next we have Fasterer which will analyse the code based on performance best practices from Fast-Ruby

image

Fasterer

Atom ‘Nice to Have’ / Workflow Link to heading

Version Control (Git) Link to heading

Git-Plus — Hit Cmd+Shift+H for the Git Command Pallete

Merge-Conflicts

Git-Time-Machine****— Hit Alt+T and visualise previous commits and compare on the fly.

Others Link to heading

Ctrl+Shift+M (Default install) — Open Markdown preview

Shift+Cmd+P (Default install) — Open the Command Palette in case you don’t know a command

Atom-Beautify (Default install) — Hit Ctrl+Alt+B to beautify a number of formats

Fuzzy-Grep — Ctrl+Alt+G to find variables, methods or strings on any file

Ror-Refactor****— Hit Ctrl+Alt+Cmd+R to extract line, method or class (if multiple methods)

TODO-Show****— Hit Ctrl+Shift+T to show list of TODO, XXX, FIX-MEs and so on.

Linter-Write-Good****— Write. Better. English.

Conclusions Link to heading

I hope you found this post useful to maybe finally upgrade your barebones editor install or to give you some ideas on ways to improve your day to day code analysis.

I’ll be waiting for feedback on tools I might have missed which should be on this post and might help me on my day to day work.

I’ll also be adding a blog post on workflow to improve updating chef cookbook CI/CD through several environments.