• Stars
    star
    180
  • Rank 213,097 (Top 5 %)
  • Language
    Ruby
  • License
    Apache License 2.0
  • Created almost 9 years ago
  • Updated over 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A small Ruby Gem to run RSpec and Serverspec, Infrataster and Capybara tests against Dockerfiles or Docker images easily.

Dockerspec

Documentation GitHub License

Gem Version Dependency Status Code Climate Travis CI Build Status Circle CI Build Status Coverage Status Inline docs

A small Ruby Gem to run RSpec, Serverspec, Infrataster and Capybara tests against Dockerfiles or Docker images easily.

This gem is designed to work out of the box on Travis CI, CircleCI and other similar CI environments.

Table of Contents

Requirements

  • Ruby 2.2 or higher.
  • Recommended Docker 1.7 or higher.

Installation

You can install the Ruby Gem with:

$ gem install dockerspec

Or you can add this line to the Gemfile of your application:

gem 'dockerspec', '~> 0.5.0'

And then execute:

$ bundle

Warning: As the gem is in its early development stages, the API is very likely to break between minor versions.

Documentation

Specific documentation sections for resources or functions that can be used to generate test cases:

Presentations

Apart from the official documentation, Nan Liu presented a talk for Portland Docker user group regarding how to use Dockerspec in a container:

Trust, but verify | Testing with Docker Containers

Usage Examples

Run Tests Against a Dockerfile in the Current Directory

require 'dockerspec/serverspec'

describe 'My Dockerfile' do
  describe docker_build('.') do

    it { should have_maintainer /John Doe/ }
    it { should have_cmd ['/bin/dash'] }
    it { should have_expose '80' }
    it { should have_user 'nobody' }

    describe docker_run(described_image) do
      describe file('/etc/httpd.conf') do
        it { should be_file }
        it { should contain 'ServerName www.example.jp' }
      end

      describe service('httpd') do
        it { should be_enabled }
        it { should be_running }
      end
    end

  end
end

See the documentation above for more examples.

Run Tests Against Docker Compose

require 'dockerspec/serverspec'

describe docker_compose('.', wait: 30) do

  its_container(:myapp) do
    describe process('apache2') do
      it { should be_running }
      its(:args) { should match(/-DFOREGROUND/) }
    end
    # [...]
  end

  its_container(:db) do
    its(:stdout) { should include 'MySQL init process done.' }

    describe process('mysqld') do
      it { should be_running }
    end
    # [...]
  end

end

Important Warning: The docker_compose resource uses the docker-compose-api Ruby gem to emulate Docker Compose. So, some docker-compose.yml configuration options may not be supported yet or may not work exactly the same. Let us know if you find any bug or you need a missing feature. And thanks to Mauricio Klein for all his work by the way!

Checking Container Logs

To check the running container logs content, you can use the stdout and stderr helpers inside docker_run or its_container blocks.

For example:

require 'dockerspec/serverspec'

describe 'My Dockerfile' do
  describe docker_build('.') do
    describe docker_run(described_image) do
      its(:stdout) { should include 'Successfully Started.' }
      its(:stderr) { should eq '' }
    end
  end
end

Retrying Tests That Fail Temporarily

This gem includes the rspec-retry gem. So, you can add :retry to the RSpec metadata in order to retry some tests multiple times.

For example:

describe docker_run('mariadb') do
  its(:stdout, retry: 30) { should include 'MySQL init process done.' }
end

By default, it will do a sleep of 1 second between each retry. You can adjust it with :retry_wait. See rspec-retry documentation for more details.

You can also make all tests within a block retry:

describe docker_run('mariadb'), retry: 30 do
  its(:stdout) { should include 'MySQL init process done.' }
  its(:stderr) { should include 'MySQL init process done.' }

  describe command('mysqld -V'), retry: 1 do # disable retries here
    its(:stdout) { should match(/^mysqld .*MariaDB/i) }
  end
end

The same applies to its_container blocks.

Run HTTP Tests Using Infrataster

# require 'dockerspec/serverspec' # Only if you want to run both types of tests
require 'dockerspec/infrataster'

describe docker_run('nginx') do
  describe server(described_container) do # Infrataster

    describe http('/') do
      it 'responds content including "Welcome to nginx!"' do
        expect(response.body).to include 'Welcome to nginx!'
      end

      it 'responds as "nginx" server' do
        expect(response.headers['server']).to match(/nginx/i)
      end
    end

  end
end

See the Infrataster Resources documentation for more information.

Run HTTP Tests Using Capybara

In the following example we set the admin password and log in in a hypothetical web application:

require 'dockerspec/infrataster'

describe docker_build('.', tag: 'mywebapp') do
  describe docker_run('mywebapp') do

    describe server(described_container) do
      describe capybara('/') do
        let(:password) { '4dm1nP4ssw0rd' }

        describe 'on /setup' do
          before { visit '/setup' }

          it 'contains "Configure the password"' do
            expect(page).to have_content 'Configure the password'
          end

          it 'sets the admin password' do
            fill_in 'Password', with: password
            fill_in 'Confirm Password', with: password
            click_button 'Set password'
          end
        end

        describe 'on /login' do
          before { visit '/login' }

          it 'logs in as admin' do
            expect(page).to have_content 'sign in'
            fill_in 'User name', with: 'admin'
            fill_in 'Password', with: password
            click_button 'Sig in'
          end
        end

        describe 'on /' do
          before { visit '/' }

          it 'is logged id' do
            expect(page).to have_content 'Welcome admin!'
          end
        end

      end
    end

  end
end

See the Capybara DSL documentation for more information.

Run Database Tests Using infrataster-plugin-mysql Gem with Docker Compose

You need to include the infrataster-plugin-mysql gem in your Gemfile:

# Gemfile

# gem [...]
gem 'infrataster-plugin-mysql', '~> 0.2.0'

A docker-compose.yml file example with a database:

myapp:
  image: myapp
  links:
  - db:mysql
  ports:
  - 8080:80

db:
  image: mariadb
  environment:
  - MYSQL_ROOT_PASSWORD=example

The file with the tests:

require 'dockerspec/infrataster'
require 'infrataster-plugin-mysql'

describe docker_compose('docker-compose.yml', wait: 60) do

  its_container(:db, mysql: { user: 'root', password: 'example' }) do
    describe server(described_container) do # Infrataster

      describe mysql_query('SHOW STATUS') do
        it 'returns positive uptime' do
          row = results.find { |r| r['Variable_name'] == 'Uptime' }
          expect(row['Value'].to_i).to be > 0
        end
      end

      describe mysql_query('SHOW DATABASES') do
        it 'includes `myapp` database' do
          databases = results.map { |r| r['Database'] }
          expect(databases).to include('myapp')
        end
      end

    end
  end
end

Run Different Tests on Each Platform

Sometimes, you may want to be able to run different tests depending on the platform. You can use Serverspec's os helper method for that:

require 'dockerspec/serverspec'

describe docker_build('.', tag: 'mywebapp') do
  describe docker_run('mywebapp') do
    case os[:family]
    when 'debian'

      describe file('/etc/debian_version') do
        it { should exist }
      end

      # [...]

    when 'alpine'

      describe file('/etc/alpine-release') do
        it { should exist }
      end

      # [...]

    end
  end
end

For more details, see Serverspec documenation on how to get OS information.

Real-world Examples

Prepare Your Ruby Environment

If you are new to Ruby, you can follow these steps:

1. Create a Gemfile:

# Gemfile

source 'https://rubygems.org'

gem 'dockerspec', '~> 0.5.0'

2. Create the spec/ directory:

$ mkdir spec

3. Add your tests to a file with the spec/myapp_spec.rb format:

With this gem, you can use both Serverspec and Infrataster tests.

If you just want to use Serverspec tests:

require 'dockerspec/serverspec'

If you just want to use Infrataster tests:

require 'dockerspec/infrataster'

But, of course, you can use both types of tests if you want:

require 'dockerspec/serverspec'
require 'dockerspec/infrataster'

For example, you can create a file in spec/myapp_spec.rb with the following content:

# spec/myapp_spec.rb

require 'dockerspec/serverspec'

describe 'My Dockerfile' do
  describe docker_build('.') do
    # [...]
    describe docker_run(described_image) do
      # [...]
    end
  end
end

4. Install the gems:

$ bundle

5. Run the tests:

$ bundle exec rspec

Travis CI Configuration Example

.travis.yml file example:

language: ruby

sudo: required

services: docker

script: travis_retry bundle exec rspec

CircleCI Configuration Example

circle.yml file example:

machine:
  services:
  - docker
  ruby:
    version: 2.2.3

test:
  override:
  - bundle exec rspec

Testing

See TESTING.md.

Contributing

Please do not hesitate to open an issue with any questions or problems.

See CONTRIBUTING.md.

TODO

See TODO.md.

License and Author

Author: Xabier de Zuazo ([email protected])
Contributor: John Meichle
Copyright: Copyright (c) 2015-2016 Xabier de Zuazo
License: Apache License, Version 2.0
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

More Repositories

1

postfix-dovecot-cookbook

Chef cookbook example to install and configure a mail server using Postfix, Dovecot, PostfixAdmin and SpamAssassin.
Ruby
64
star
2

owncloud-cookbook

Chef cookbook to install and configure ownCloud.
Ruby
38
star
3

kitchen-in-travis

Chef cookbook example to run test-kitchen inside Travis CI.
Ruby
36
star
4

node-jmx

Node.js library to connect to Java applications through JMX.
JavaScript
34
star
5

ssl_certificate-cookbook

Chef cookbook to make it easy for other cookbooks to support SSL.
Ruby
32
star
6

dovecot-cookbook

Chef cookbook to install and configure Dovecot.
Ruby
26
star
7

alpine-tor-docker

A minimal Docker image with the Tor daemon running in the background.
Ruby
23
star
8

mysql_tuning-cookbook

Chef cookbook to create MySQL configuraiton files better suited for your system.
Ruby
23
star
9

chef-local-docker

Docker image with Chef configured to make it easier to run cookbooks using chef in local mode (with chef-zero).
Ruby
16
star
10

kong-cookbook

Chef cookbook to install Kong: An open-source management layer for APIs, delivering high performance and reliability.
Ruby
14
star
11

dradis-docker

A Docker image with Dradis: A collaboration and reporting platform for IT security experts.
Ruby
13
star
12

postfixadmin-cookbook

Chef cookbook to install and configure PostfixAdmin.
Ruby
13
star
13

chef-handler-sns

Chef report handler to send Amazon SNS notifications on failures or changes.
Ruby
12
star
14

kitchen-in-travis-native

Chef cookbook example to run test-kitchen with Travis CI Docker service.
Ruby
12
star
15

specinfra-backend-docker_compose

Serverspec / Specinfra backend for Docker Compose.
Ruby
9
star
16

kitchen-in-circleci

Chef cookbook example to run test-kitchen inside CircleCI.
Ruby
9
star
17

ssh_authorized_keys-cookbook

Chef cookbook to create SSH authorized keys files in user home directories.
Ruby
9
star
18

keywhiz-docker

Docker image with Keywhiz: A system for managing and distributing secrets.
Shell
8
star
19

chef-encrypted-attributes

Chef plugin to add Node encrypted attributes support using client keys.
Ruby
6
star
20

diffy-docker

Docker image with Diffy: A tool to test services without writing tests.
Ruby
5
star
21

mumble_server-cookbook

Chef cookbook to install and configure a Mumble server (called Murmur).
Ruby
5
star
22

encrypted_attributes-cookbook

Chef cookbook to install and load chef-encrypted-attributes gem.
Ruby
4
star
23

git-ssh-server-cookbook

Chef cookbook to set up a basic git repository container to be accesed via SSH.
Ruby
4
star
24

docker-in-travis

Docker image example using TDD with Serverspec and Travis CI.
Ruby
4
star
25

swap_tuning-cookbook

Chef cookbook to create a swap file of the recommended size considering the system memory.
Ruby
3
star
26

boxbilling-cookbook

Chef cookbook to install and configure BoxBilling.
Ruby
3
star
27

filesystem_resize-cookbook

Chef cookbook to resize the file system automatically when the underlying partition or disk increases its size.
Ruby
3
star
28

spamassassin-cookbook

Chef cookbook to install and configure SpamAssassin.
Ruby
3
star
29

proftpd-cookbook

Chef cookbook to install and configure ProFTPD.
Ruby
2
star
30

ramdisk-cookbook

Chef cookbook to manage tmpfs RAM disks.
Ruby
2
star
31

opendkim-cookbook

Chef cookbook to install and configure OpenDKIM.
Ruby
2
star
32

zookeeper_bridge-cookbook

Chef cookbook to help integrating the Chef Run with ZooKeeper.
Ruby
1
star
33

specinfra-backend-docker_lxc

Serverspec / Specinfra backend for Docker LXC execution driver.
Ruby
1
star
34

irssi-tor-docker

A minimal Docker image to run the IRC client Irssi on Tor.
Ruby
1
star
35

chef_handler_sns-cookbook

Chef cookbook to install and enable chef-handler-sns: A simple Chef report handler that reports status of a Chef run through Amazon SNS. Includes IAM roles support.
Ruby
1
star