Rakefile in ruby-pwsh-0.10.0 vs Rakefile in ruby-pwsh-0.10.1
- old
+ new
@@ -97,35 +97,89 @@
run_local_command('pdk build --force')
# Cleanup
File.open('README.md', 'wb') { |file| file.write(actual_readme_content) }
end
+# Used in vendor_dsc_module
+TAR_LONGLINK = '././@LongLink'
+
+# Vendor a Puppetized DSC Module to spec/fixtures/modules.
+#
+# This is necessary because `puppet module install` fails on modules with
+# long file paths, like xpsdesiredstateconfiguration
+#
+# @param command [String] command to execute.
+# @return [Object] the standard out stream.
+def vendor_dsc_module(name, version, destination)
+ require 'open-uri'
+ require 'rubygems/package'
+ require 'zlib'
+
+ module_uri = "https://forge.puppet.com/v3/files/dsc-#{name}-#{version}.tar.gz"
+ tar_gz_archive = File.expand_path("#{name}.tar.gz", ENV['TEMP'])
+
+ # Download the archive from the forge
+ File.open(tar_gz_archive, 'wb') do |file|
+ file.write(URI.open(module_uri).read) # rubocop:disable Security/Open
+ end
+
+ # Unzip to destination
+ # Taken directly from StackOverflow:
+ # - https://stackoverflow.com/a/19139114
+ Gem::Package::TarReader.new(Zlib::GzipReader.open(tar_gz_archive)) do |tar|
+ dest = nil
+ tar.each do |entry|
+ if entry.full_name == TAR_LONGLINK
+ dest = File.join(destination, entry.read.strip)
+ next
+ end
+ dest ||= File.join(destination, entry.full_name)
+ if entry.directory?
+ File.delete(dest) if File.file?(dest)
+ FileUtils.mkdir_p(dest, mode: entry.header.mode, verbose: false)
+ elsif entry.file?
+ FileUtils.rm_rf(dest) if File.directory?(dest)
+ File.open(dest, 'wb') do |f|
+ f.print(entry.read)
+ end
+ FileUtils.chmod(entry.header.mode, dest, verbose: false)
+ elsif entry.header.typeflag == '2' # Symlink!
+ File.symlink(entry.header.linkname, dest)
+ end
+ dest = nil
+ end
+ end
+
+ # Rename folder to just the module name, as needed by Puppet
+ Dir.glob("#{destination}/*#{name}*").each do |existing_folder|
+ new_folder = File.expand_path(name, destination)
+ FileUtils.mv(existing_folder, new_folder)
+ end
+end
+
namespace :dsc do
namespace :acceptance do
desc 'Prep for running DSC acceptance tests'
task :spec_prep do
# Create the modules fixture folder, if needed
modules_folder = File.expand_path('spec/fixtures/modules', File.dirname(__FILE__))
FileUtils.mkdir_p(modules_folder) unless Dir.exist?(modules_folder)
# symlink the parent folder to the modules folder for puppet
- File.symlink(File.dirname(__FILE__), File.expand_path('pwshlib', modules_folder))
+ symlink_path = File.expand_path('pwshlib', modules_folder)
+ File.symlink(File.dirname(__FILE__), symlink_path) unless Dir.exist?(symlink_path)
# Install each of the required modules for acceptance testing
# Note: This only works for modules in the dsc namespace on the forge.
puppetized_dsc_modules = [
{ name: 'powershellget', version: '2.2.5-0-1' },
- { name: 'jeadsc', version: '0.7.2-0-2' } # update to 0.7.2-0-3 on release
+ { name: 'jeadsc', version: '0.7.2-0-2' }, # update to 0.7.2-0-3 on release
+ { name: 'xpsdesiredstateconfiguration', version: '9.1.0-0-1' },
+ { name: 'xwebadministration', version: '3.2.0-0-2' },
+ { name: 'accesscontroldsc', version: '1.4.1-0-3' }
]
puppetized_dsc_modules.each do |puppet_module|
next if Dir.exist?(File.expand_path(puppet_module[:name], modules_folder))
- install_command = [
- 'bundle exec puppet module install',
- "dsc-#{puppet_module[:name]}",
- "--version #{puppet_module[:version]}",
- '--ignore-dependencies',
- "--target-dir #{modules_folder}"
- ].join(' ')
- run_local_command(install_command)
+ vendor_dsc_module(puppet_module[:name], puppet_module[:version], modules_folder)
end
end
RSpec::Core::RakeTask.new(:spec) do |t|
t.pattern = 'spec/acceptance/dsc/*.rb'
end