From fcd90a1dc67d4b5c04bfabd67c7b949a43a12097 Mon Sep 17 00:00:00 2001 From: Florian CHAZAL Date: Mon, 21 Nov 2016 18:29:56 +0000 Subject: [PATCH] Add and force unit tests in packer build process (with simple examples) --- packer/base/tests/Gemfile | 4 +++ packer/base/tests/Gemfile.lock | 47 +++++++++++++++++++++++++++ packer/base/tests/Rakefile | 6 ++++ packer/base/tests/spec/ntp_spec.rb | 10 ++++++ packer/base/tests/spec/spec_helper.rb | 3 ++ packer/ecs/tests/Gemfile | 4 +++ packer/ecs/tests/Gemfile.lock | 47 +++++++++++++++++++++++++++ packer/ecs/tests/Rakefile | 6 ++++ packer/ecs/tests/spec/ecs_spec.rb | 5 +++ packer/ecs/tests/spec/spec_helper.rb | 3 ++ tools/pack-ami | 26 +++++++++++++-- 11 files changed, 158 insertions(+), 3 deletions(-) create mode 100644 packer/base/tests/Gemfile create mode 100644 packer/base/tests/Gemfile.lock create mode 100644 packer/base/tests/Rakefile create mode 100644 packer/base/tests/spec/ntp_spec.rb create mode 100644 packer/base/tests/spec/spec_helper.rb create mode 100644 packer/ecs/tests/Gemfile create mode 100644 packer/ecs/tests/Gemfile.lock create mode 100644 packer/ecs/tests/Rakefile create mode 100644 packer/ecs/tests/spec/ecs_spec.rb create mode 100644 packer/ecs/tests/spec/spec_helper.rb diff --git a/packer/base/tests/Gemfile b/packer/base/tests/Gemfile new file mode 100644 index 00000000..f40dd22c --- /dev/null +++ b/packer/base/tests/Gemfile @@ -0,0 +1,4 @@ +source "https://rubygems.org" + +gem "rake" +gem "serverspec", ">= 2.37.2" \ No newline at end of file diff --git a/packer/base/tests/Gemfile.lock b/packer/base/tests/Gemfile.lock new file mode 100644 index 00000000..e58da4b3 --- /dev/null +++ b/packer/base/tests/Gemfile.lock @@ -0,0 +1,47 @@ +GEM + remote: https://rubygems.org/ + specs: + diff-lcs (1.2.5) + multi_json (1.12.1) + net-scp (1.2.1) + net-ssh (>= 2.6.5) + net-ssh (3.2.0) + net-telnet (0.1.1) + rake (10.1.1) + rspec (3.5.0) + rspec-core (~> 3.5.0) + rspec-expectations (~> 3.5.0) + rspec-mocks (~> 3.5.0) + rspec-core (3.5.4) + rspec-support (~> 3.5.0) + rspec-expectations (3.5.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.5.0) + rspec-its (1.2.0) + rspec-core (>= 3.0.0) + rspec-expectations (>= 3.0.0) + rspec-mocks (3.5.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.5.0) + rspec-support (3.5.0) + serverspec (2.37.2) + multi_json + rspec (~> 3.0) + rspec-its + specinfra (~> 2.53) + sfl (2.3) + specinfra (2.66.0) + net-scp + net-ssh (>= 2.7, < 4.0) + net-telnet + sfl + +PLATFORMS + ruby + +DEPENDENCIES + rake + serverspec (>= 2.37.2) + +BUNDLED WITH + 1.13.3 diff --git a/packer/base/tests/Rakefile b/packer/base/tests/Rakefile new file mode 100644 index 00000000..65a199af --- /dev/null +++ b/packer/base/tests/Rakefile @@ -0,0 +1,6 @@ +require 'rake' +require 'rspec/core/rake_task' + +RSpec::Core::RakeTask.new(:spec) do |t| + t.pattern = 'spec/*_spec.rb' +end diff --git a/packer/base/tests/spec/ntp_spec.rb b/packer/base/tests/spec/ntp_spec.rb new file mode 100644 index 00000000..5f9b0202 --- /dev/null +++ b/packer/base/tests/spec/ntp_spec.rb @@ -0,0 +1,10 @@ +require 'spec_helper' + +describe package('ntp') do + it { should be_installed } +end + +describe service('ntp') do + it { should be_enabled } + it { should be_running } +end diff --git a/packer/base/tests/spec/spec_helper.rb b/packer/base/tests/spec/spec_helper.rb new file mode 100644 index 00000000..30ece5b8 --- /dev/null +++ b/packer/base/tests/spec/spec_helper.rb @@ -0,0 +1,3 @@ +require 'serverspec' + +set :backend, :exec \ No newline at end of file diff --git a/packer/ecs/tests/Gemfile b/packer/ecs/tests/Gemfile new file mode 100644 index 00000000..f40dd22c --- /dev/null +++ b/packer/ecs/tests/Gemfile @@ -0,0 +1,4 @@ +source "https://rubygems.org" + +gem "rake" +gem "serverspec", ">= 2.37.2" \ No newline at end of file diff --git a/packer/ecs/tests/Gemfile.lock b/packer/ecs/tests/Gemfile.lock new file mode 100644 index 00000000..e58da4b3 --- /dev/null +++ b/packer/ecs/tests/Gemfile.lock @@ -0,0 +1,47 @@ +GEM + remote: https://rubygems.org/ + specs: + diff-lcs (1.2.5) + multi_json (1.12.1) + net-scp (1.2.1) + net-ssh (>= 2.6.5) + net-ssh (3.2.0) + net-telnet (0.1.1) + rake (10.1.1) + rspec (3.5.0) + rspec-core (~> 3.5.0) + rspec-expectations (~> 3.5.0) + rspec-mocks (~> 3.5.0) + rspec-core (3.5.4) + rspec-support (~> 3.5.0) + rspec-expectations (3.5.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.5.0) + rspec-its (1.2.0) + rspec-core (>= 3.0.0) + rspec-expectations (>= 3.0.0) + rspec-mocks (3.5.0) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.5.0) + rspec-support (3.5.0) + serverspec (2.37.2) + multi_json + rspec (~> 3.0) + rspec-its + specinfra (~> 2.53) + sfl (2.3) + specinfra (2.66.0) + net-scp + net-ssh (>= 2.7, < 4.0) + net-telnet + sfl + +PLATFORMS + ruby + +DEPENDENCIES + rake + serverspec (>= 2.37.2) + +BUNDLED WITH + 1.13.3 diff --git a/packer/ecs/tests/Rakefile b/packer/ecs/tests/Rakefile new file mode 100644 index 00000000..65a199af --- /dev/null +++ b/packer/ecs/tests/Rakefile @@ -0,0 +1,6 @@ +require 'rake' +require 'rspec/core/rake_task' + +RSpec::Core::RakeTask.new(:spec) do |t| + t.pattern = 'spec/*_spec.rb' +end diff --git a/packer/ecs/tests/spec/ecs_spec.rb b/packer/ecs/tests/spec/ecs_spec.rb new file mode 100644 index 00000000..ba67ec3f --- /dev/null +++ b/packer/ecs/tests/spec/ecs_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe service('ecs-agent') do + it { should be_enabled } +end diff --git a/packer/ecs/tests/spec/spec_helper.rb b/packer/ecs/tests/spec/spec_helper.rb new file mode 100644 index 00000000..30ece5b8 --- /dev/null +++ b/packer/ecs/tests/spec/spec_helper.rb @@ -0,0 +1,3 @@ +require 'serverspec' + +set :backend, :exec \ No newline at end of file diff --git a/tools/pack-ami b/tools/pack-ami index b1753576..2cc0177b 100755 --- a/tools/pack-ami +++ b/tools/pack-ami @@ -252,6 +252,11 @@ class Template(object): content = BEGIN_SCRIPT, ) + self.test = Script( + name = 'pack-test.sh', + content = TEST_SCRIPT, + ) + self.end = Script( name = 'pack-end.sh', content = END_SCRIPT, @@ -314,16 +319,23 @@ class Template(object): p1 = { 'type': 'shell', 'scripts': self.scripts() } ex = self.execute_command() + p2 = { + 'type' : 'file', + 'source' : 'tests', + 'destination' : '/tmp', + } + if ex is not None: p1['execute_command'] = ex - return [p0, p1] + return [p0, p1, p2] def scripts(self): scripts = [ ] scripts.append(self.begin.name) for s in self._scripts: scripts.append('scripts/' + s) + scripts.append(self.test.name) scripts.append(self.end.name) return scripts @@ -369,10 +381,10 @@ class Template(object): open(os.path.join(pwd, 'stdout.log'), 'wb') as stdout, \ open(os.path.join(pwd, 'stderr.log'), 'wb') as stderr: - for d in ('root', 'scripts'): + for d in ('root', 'scripts', 'tests'): shutil.copytree(os.path.join(templates_dir, self.name, d), os.path.join(pwd, d)) - for s in (self.begin, self.end): + for s in (self.begin, self.test, self.end): with open(os.path.join(pwd, s.name), 'w') as f: f.write(s.content) @@ -443,6 +455,14 @@ fi systemctl daemon-reload """ +TEST_SCRIPT = """#!/bin/bash + +sudo gem install bundler --no-ri --no-rdoc +cd /tmp/tests +bundle install --path=vendor +bundle exec rake spec +""" + END_SCRIPT = """#!/bin/bash set -e