From 155659b84333ca766b3c28d09f44093c3d891939 Mon Sep 17 00:00:00 2001 From: Jonathan Hartman Date: Wed, 2 Sep 2015 08:43:41 -0700 Subject: [PATCH 1/7] Add a Windows builder --- .kitchen.appveyor.yml | 7 +++++++ .kitchen.travis.yml | 6 +++--- .travis.yml | 9 ++++++--- README.md | 4 +++- appveyor.yml | 17 +++++++++++++++++ 5 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 .kitchen.appveyor.yml create mode 100644 appveyor.yml diff --git a/.kitchen.appveyor.yml b/.kitchen.appveyor.yml new file mode 100644 index 0000000..12c65c6 --- /dev/null +++ b/.kitchen.appveyor.yml @@ -0,0 +1,7 @@ +--- +driver: + name: localhost + clean_up_on_destroy: false + +platforms: + - name: windows diff --git a/.kitchen.travis.yml b/.kitchen.travis.yml index 9fd51d7..ad7009d 100644 --- a/.kitchen.travis.yml +++ b/.kitchen.travis.yml @@ -1,7 +1,7 @@ --- driver: - name: digitalocean + name: localhost + clean_up_on_destroy: false + platforms: - name: macosx - driver: - name: localhost diff --git a/.travis.yml b/.travis.yml index d2fd675..8735f6a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,16 +1,19 @@ language: objective-c +branches: + only: + - master + install: - curl -L https://www.opscode.com/chef/install.sh | sudo bash -s -- -P chefdk - - chef exec bundle install --without=development + - chef exec bundle update before_script: # Pending ENV support in Kitchen's Rake tasks and not just the CLI - cp .kitchen.travis.yml .kitchen.local.yml - - echo -e $DIGITALOCEAN_SSH_KEY_BODY > ~/.ssh/id_rsa script: - - chef exec rake && chef exec rake kitchen:all + - chef exec bundle exec rake && chef exec bundle exec kitchen test -c 2 after_script: diff --git a/README.md b/README.md index 13ea531..8d85b07 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,14 @@ Dropbox Cookbook ================ [![Cookbook Version](https://img.shields.io/cookbook/v/dropbox.svg)][cookbook] -[![Build Status](https://img.shields.io/travis/RoboticCheese/dropbox-chef.svg)][travis] +[![OS X Build Status](https://img.shields.io/travis/RoboticCheese/dropbox-chef.svg)][travis] +[![Windows Build Status](https://img.shields.io/appveyor/ci/RoboticCheese/dropbox-chef.svg)][appveyor] [![Code Climate](https://img.shields.io/codeclimate/github/RoboticCheese/dropbox-chef.svg)][codeclimate] [![Coverage Status](https://img.shields.io/coveralls/RoboticCheese/dropbox-chef.svg)][coveralls] [cookbook]: https://supermarket.chef.io/cookbooks/dropbox [travis]: https://travis-ci.org/RoboticCheese/dropbox-chef +[appveyor]: https://ci.appveyor.com/project/RoboticCheese/dropbox-chef [codeclimate]: https://codeclimate.com/github/RoboticCheese/dropbox-chef [coveralls]: https://coveralls.io/r/RoboticCheese/dropbox-chef diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..08681be --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,17 @@ +branches: + only: + - master + +cache: + - '%TEMP%\verifier\gems' + +install: + - cinst chefdk + - SET PATH=C:\opscode\chefdk\bin;%PATH% + +build_script: + - chef exec bundle update + - copy .kitchen.appveyor.yml .kitchen.local.yml + +test_script: + - chef exec bundle exec kitchen test -c 2 From 356c0083ecce7fbaab5b5a8b80108678eb2bc3a8 Mon Sep 17 00:00:00 2001 From: Jonathan Hartman Date: Wed, 2 Sep 2015 10:05:52 -0700 Subject: [PATCH 2/7] Resolve RuboCop failures --- .travis.yml | 2 +- Guardfile | 2 +- appveyor.yml | 2 +- libraries/provider_dropbox.rb | 2 +- spec/libraries/provider_dropbox_spec.rb | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8735f6a..370fdee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ branches: install: - curl -L https://www.opscode.com/chef/install.sh | sudo bash -s -- -P chefdk - - chef exec bundle update + - chef exec bundle install --without=development integration before_script: # Pending ENV support in Kitchen's Rake tasks and not just the CLI diff --git a/Guardfile b/Guardfile index 9ea1826..75bca0f 100644 --- a/Guardfile +++ b/Guardfile @@ -6,7 +6,7 @@ guard :rspec, all_on_start: true, notification: false do watch(%r{^recipes/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" } watch(%r{^attributes/(.+)\.rb$}) - watch(%r{^files/(.+)/]}) + watch(%r{^files/(.+)}) watch(%r{^templates/(.+)}) watch(%r{^providers/(.+)\.rb}) watch(%r{^resources/(.+)\.rb}) diff --git a/appveyor.yml b/appveyor.yml index 08681be..251d388 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,7 +10,7 @@ install: - SET PATH=C:\opscode\chefdk\bin;%PATH% build_script: - - chef exec bundle update + - chef exec bundle install --without=development integration - copy .kitchen.appveyor.yml .kitchen.local.yml test_script: diff --git a/libraries/provider_dropbox.rb b/libraries/provider_dropbox.rb index 756c8b0..993ff68 100644 --- a/libraries/provider_dropbox.rb +++ b/libraries/provider_dropbox.rb @@ -109,7 +109,7 @@ def download_source # def download_dest ::File.join(Chef::Config[:file_cache_path], - ::File.basename(URI.decode(download_source)).gsub(' ', '')) + ::File.basename(URI.decode(download_source)).delete(' ')) end # diff --git a/spec/libraries/provider_dropbox_spec.rb b/spec/libraries/provider_dropbox_spec.rb index 9986dda..c6e85b8 100644 --- a/spec/libraries/provider_dropbox_spec.rb +++ b/spec/libraries/provider_dropbox_spec.rb @@ -8,7 +8,7 @@ let(:node) { Fauxhai.mock(platform).data } let(:package_url) { nil } let(:new_resource) do - double(name: 'dropbox', package_url: package_url, :'installed=' => true) + double(name: 'dropbox', package_url: package_url, 'installed=' => true) end let(:provider) { described_class.new(new_resource, nil) } From b052e0b087855a7e2bfc8348b2e3e30560d4323a Mon Sep 17 00:00:00 2001 From: Jonathan Hartman Date: Wed, 2 Sep 2015 22:50:52 -0700 Subject: [PATCH 3/7] Use ChefDK's pinned versions instead of Bundler's conflicting ones --- .travis.yml | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 370fdee..d978290 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ before_script: - cp .kitchen.travis.yml .kitchen.local.yml script: - - chef exec bundle exec rake && chef exec bundle exec kitchen test -c 2 + - chef exec rake && chef exec kitchen test -c 2 after_script: diff --git a/appveyor.yml b/appveyor.yml index 251d388..e5ed838 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -14,4 +14,4 @@ build_script: - copy .kitchen.appveyor.yml .kitchen.local.yml test_script: - - chef exec bundle exec kitchen test -c 2 + - chef exec kitchen test -c 2 From a91f4a4b69ef778dd15282e04ebd499eb5e15b4e Mon Sep 17 00:00:00 2001 From: Jonathan Hartman Date: Thu, 3 Sep 2015 08:29:05 -0700 Subject: [PATCH 4/7] Add a Vagrant Windows TK builder --- .kitchen.yml | 3 +++ Gemfile | 1 + .../default/serverspec/localhost/package_spec.rb | 16 +++++++++------- .../default/serverspec/spec_helper.rb | 7 ++++++- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/.kitchen.yml b/.kitchen.yml index 5886d15..379ff99 100644 --- a/.kitchen.yml +++ b/.kitchen.yml @@ -10,6 +10,9 @@ platforms: driver: ssh: insert_key: false + - name: windows-2012 + driver: + box: roboticcheese/windows-2012 suites: - name: default diff --git a/Gemfile b/Gemfile index a4ec9be..06bf3c7 100644 --- a/Gemfile +++ b/Gemfile @@ -26,6 +26,7 @@ group :test do gem 'kitchen-digitalocean', '>= 0.8.0' gem 'kitchen-localhost' gem 'kitchen-vagrant' + gem 'winrm-transport' end group :integration do diff --git a/test/integration/default/serverspec/localhost/package_spec.rb b/test/integration/default/serverspec/localhost/package_spec.rb index 9769677..3939fc0 100644 --- a/test/integration/default/serverspec/localhost/package_spec.rb +++ b/test/integration/default/serverspec/localhost/package_spec.rb @@ -3,13 +3,15 @@ require_relative '../spec_helper' describe 'Dropbox package' do - it 'is installed' do - case os[:family] - when 'darwin' - f = '/Applications/Dropbox.app/Contents/MacOS/Dropbox' - expect(file(f)).to be_executable - else - fail('Unsupported platform') + describe file('/Applications/Dropbox.app'), if: os[:family] == 'darwin' do + it 'exists' do + expect(subject).to be_directory + end + end + + describe package('Dropbox'), if: os[:family] == 'windows' do + it 'is installed' do + expect(subject).to be_installed end end end diff --git a/test/integration/default/serverspec/spec_helper.rb b/test/integration/default/serverspec/spec_helper.rb index 227b270..eef2022 100644 --- a/test/integration/default/serverspec/spec_helper.rb +++ b/test/integration/default/serverspec/spec_helper.rb @@ -2,4 +2,9 @@ require 'serverspec' -set :backend, :exec +if RUBY_PLATFORM.match(/mswin|mingw32|windows/) + set :os, family: 'windows' + set :backend, :cmd +else + set :backend, :exec +end From f53731898ccb04d4539f84192bdb20f4fbbfb4fc Mon Sep 17 00:00:00 2001 From: Jonathan Hartman Date: Thu, 3 Sep 2015 08:33:15 -0700 Subject: [PATCH 5/7] Use the windows_cookbook_package resource directly The base Chef windows_package resource is somehow now being given precedence (and so complaining about the invalid installer type). This will at least get things working again. --- libraries/provider_dropbox_windows.rb | 2 +- .../libraries/provider_dropbox_windows_spec.rb | 2 +- spec/spec_helper.rb | 2 ++ .../provider/windows_cookbook_package.rb | 13 +++++++++++++ .../resource/windows_cookbook_package.rb | 18 ++++++++++++++++++ 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 spec/support/provider/windows_cookbook_package.rb create mode 100644 spec/support/resource/windows_cookbook_package.rb diff --git a/libraries/provider_dropbox_windows.rb b/libraries/provider_dropbox_windows.rb index 048fc76..de04545 100644 --- a/libraries/provider_dropbox_windows.rb +++ b/libraries/provider_dropbox_windows.rb @@ -43,7 +43,7 @@ def tailor_package_to_platform # @return [Chef::Resource::Windows] # def package_resource_class - Chef::Resource::WindowsPackage + Chef::Resource::WindowsCookbookPackage end end end diff --git a/spec/libraries/provider_dropbox_windows_spec.rb b/spec/libraries/provider_dropbox_windows_spec.rb index 667171f..5faa303 100644 --- a/spec/libraries/provider_dropbox_windows_spec.rb +++ b/spec/libraries/provider_dropbox_windows_spec.rb @@ -37,7 +37,7 @@ describe '#package_resource_class' do it 'returns the windows_package resource' do - expected = Chef::Resource::WindowsPackage + expected = Chef::Resource::WindowsCookbookPackage expect(provider.send(:package_resource_class)).to eq(expected) end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 821ab54..6dd4b13 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -11,7 +11,9 @@ require 'fileutils' require_relative '../libraries/matchers' require_relative 'support/resource/dmg_package' +require_relative 'support/resource/windows_cookbook_package' require_relative 'support/provider/dmg_package' +require_relative 'support/provider/windows_cookbook_package' RSpec.configure do |c| c.color = true diff --git a/spec/support/provider/windows_cookbook_package.rb b/spec/support/provider/windows_cookbook_package.rb new file mode 100644 index 0000000..d702d99 --- /dev/null +++ b/spec/support/provider/windows_cookbook_package.rb @@ -0,0 +1,13 @@ +# Encoding: UTF-8 + +require 'spec_helper' + +class Chef + class Provider + # A fake windows_cookbook_package provider + # + # @author Jonathan Hartman + class WindowsCookbookPackage < Provider::LWRPBase + end + end +end diff --git a/spec/support/resource/windows_cookbook_package.rb b/spec/support/resource/windows_cookbook_package.rb new file mode 100644 index 0000000..1213d37 --- /dev/null +++ b/spec/support/resource/windows_cookbook_package.rb @@ -0,0 +1,18 @@ +# Encoding: UTF-8 + +require 'spec_helper' + +class Chef + class Resource + # A fake windows_cookbook_package resource + # + # @author Jonathan Hartman + class WindowsCookbookPackage < Resource::LWRPBase + self.resource_name = :windows_cookbook_package + actions :install, :remove + default_action :install + attribute :source, kind_of: String + attribute :installer_type, kind_of: Symbol + end + end +end From 86e41355baffbbcba0ecd6f3e96944684d730be6 Mon Sep 17 00:00:00 2001 From: Jonathan Hartman Date: Thu, 3 Sep 2015 08:35:19 -0700 Subject: [PATCH 6/7] Switch installer type from :nsis to :wise It seems Dropbox changed their installer type at some point. Using the switches for a silent nsis install now causes the process (and Chef run) to hang indefinitely. --- libraries/provider_dropbox_windows.rb | 2 +- spec/libraries/provider_dropbox_windows_spec.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/provider_dropbox_windows.rb b/libraries/provider_dropbox_windows.rb index de04545..1d0e67d 100644 --- a/libraries/provider_dropbox_windows.rb +++ b/libraries/provider_dropbox_windows.rb @@ -34,7 +34,7 @@ class Windows < Dropbox # def tailor_package_to_platform @package.source(URI.encode(download_dest)) - @package.installer_type(:nsis) + @package.installer_type(:wise) end # diff --git a/spec/libraries/provider_dropbox_windows_spec.rb b/spec/libraries/provider_dropbox_windows_spec.rb index 5faa303..3d3ad97 100644 --- a/spec/libraries/provider_dropbox_windows_spec.rb +++ b/spec/libraries/provider_dropbox_windows_spec.rb @@ -30,7 +30,7 @@ end it 'sets the correct installer type' do - expect(package).to receive(:installer_type).with(:nsis) + expect(package).to receive(:installer_type).with(:wise) provider.send(:tailor_package_to_platform) end end From dc23a1df74076017f02f0e75b4b94f4a2ab1325d Mon Sep 17 00:00:00 2001 From: Jonathan Hartman Date: Thu, 3 Sep 2015 22:35:24 -0700 Subject: [PATCH 7/7] Fix download pathing on Windows At some point, :file_cache_path started using backslashes on Windows systems, but Ruby's File.join method always uses forward slashes. --- libraries/provider_dropbox.rb | 7 +++++-- libraries/provider_dropbox_mac_os_x.rb | 4 ++-- libraries/provider_dropbox_windows.rb | 4 ++-- spec/libraries/provider_dropbox_mac_os_x_spec.rb | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/libraries/provider_dropbox.rb b/libraries/provider_dropbox.rb index 993ff68..1aa5764 100644 --- a/libraries/provider_dropbox.rb +++ b/libraries/provider_dropbox.rb @@ -19,6 +19,7 @@ # require 'chef/provider' +require 'chef-config/path_helper' require 'net/http' require_relative 'provider_dropbox_mac_os_x' require_relative 'provider_dropbox_windows' @@ -108,8 +109,10 @@ def download_source # @return [String] # def download_dest - ::File.join(Chef::Config[:file_cache_path], - ::File.basename(URI.decode(download_source)).delete(' ')) + ChefConfig::PathHelper.join( + Chef::Config[:file_cache_path], + ::File.basename(URI.decode(download_source)).delete(' ') + ) end # diff --git a/libraries/provider_dropbox_mac_os_x.rb b/libraries/provider_dropbox_mac_os_x.rb index 2881fd3..35465c2 100644 --- a/libraries/provider_dropbox_mac_os_x.rb +++ b/libraries/provider_dropbox_mac_os_x.rb @@ -18,7 +18,7 @@ # limitations under the License. # -require 'net/http' +require_relative 'provider_dropbox' class Chef class Provider @@ -35,7 +35,7 @@ class MacOsX < Dropbox def tailor_package_to_platform @package.app('Dropbox') @package.volumes_dir('Dropbox Installer') - @package.source(URI.encode("file://#{download_dest}")) + @package.source("file://#{download_dest}") end # diff --git a/libraries/provider_dropbox_windows.rb b/libraries/provider_dropbox_windows.rb index 1d0e67d..4f3a145 100644 --- a/libraries/provider_dropbox_windows.rb +++ b/libraries/provider_dropbox_windows.rb @@ -18,7 +18,7 @@ # limitations under the License. # -require 'net/http' +require_relative 'provider_dropbox' class Chef class Provider @@ -33,7 +33,7 @@ class Windows < Dropbox # Ensure the package resource gets Windows-specific attributes # def tailor_package_to_platform - @package.source(URI.encode(download_dest)) + @package.source(download_dest) @package.installer_type(:wise) end diff --git a/spec/libraries/provider_dropbox_mac_os_x_spec.rb b/spec/libraries/provider_dropbox_mac_os_x_spec.rb index 40e31c6..0f662e1 100644 --- a/spec/libraries/provider_dropbox_mac_os_x_spec.rb +++ b/spec/libraries/provider_dropbox_mac_os_x_spec.rb @@ -33,7 +33,7 @@ end it 'sets the correct source' do - expected = URI.encode('file:///tmp/package.dmg') + expected = 'file:///tmp/package.dmg' expect(package).to receive(:source).with(expected) provider.send(:tailor_package_to_platform) end