The world of Chef cookbook development and testing has improved a ton in the last year or two. We can be far more confident in our configuration quality since we run them via Test Kitchen using our internal custom AMIs.

At this point, Berkshelf can't directly index cookbooks hosted in chef-server and a Berkshelf API server is required. We had need for multiple configurations during development and I wanted to save every engineer on the team from running their own API server locally.

We use Travis CI to test our cookbooks and why not have the server running right where the information is needed. To simplify this example, I replaced hosted chef in the config.json with the Supermarket configuration but this would work with any of the supported endpoints.

  1. ENV['BERKSHELF_API_PATH'] is set to the root of the repository to override the default of ~/.berkshelf/api-server
  2. Travis encrypted environment variables are provided for aws_access_key_id and aws_secret_access_key
  3. The SSH private key is added via travis encrypt-file
  4. Cache for APT and Bundler are both enabled to speed up test runs
  5. Package containing libarchive.so installed for berks-api dependency
  6. AWS resource tags are applied to the EC2 instances to help identify them

After figuring out the Bundler cache hiccups, I ran into an issue that one of my coworkers had reported earlier this year. As pointed out there, uploading compressed tarballs or switching to sftp may be the best course of action but for now removing the empty directories results in a massive performance improvement.

The trickiest part of this test was getting the IAM configuration correct, so I'll explain that in another post.