summaryrefslogtreecommitdiff
path: root/chef-config
diff options
context:
space:
mode:
authorKartik Null Cating-Subramanian <ksubramanian@chef.io>2015-08-04 16:40:29 -0400
committerKartik Null Cating-Subramanian <ksubramanian@chef.io>2015-08-25 14:06:55 -0400
commita3f0b52d9c19df4136a07fbdcec7c416a1904c1a (patch)
tree7a9a868b45fc92b0997fbd789d00a1b5e7e1b387 /chef-config
parent49009b301e10130629944fd3b3511a26cdfbd1b1 (diff)
downloadchef-a3f0b52d9c19df4136a07fbdcec7c416a1904c1a.tar.gz
Refactor chef's Rakefile to a task.
Diffstat (limited to 'chef-config')
-rw-r--r--chef-config/Rakefile57
-rw-r--r--chef-config/lib/chef-config/package_task.rb222
2 files changed, 225 insertions, 54 deletions
diff --git a/chef-config/Rakefile b/chef-config/Rakefile
index 10b6010de3..304c4d3c95 100644
--- a/chef-config/Rakefile
+++ b/chef-config/Rakefile
@@ -1,26 +1,8 @@
require 'rspec/core/rake_task'
-require 'rubygems/package_task'
+require 'chef-config/package_task'
-VERSION = IO.read(File.expand_path("../../VERSION", __FILE__)).strip
-
-Dir[File.expand_path("../*gemspec", __FILE__)].reverse.each do |gemspec_path|
- gemspec = eval(IO.read(gemspec_path))
- Gem::PackageTask.new(gemspec).define
-end
-
-def with_clean_env(&block)
- if defined?(Bundler)
- Bundler.with_clean_env(&block)
- else
- block.call
- end
-end
-
-desc "Build and install a chef-config gem"
-task :install => [:package] do
- with_clean_env do
- sh(%{gem install pkg/chef-config-#{ChefConfig::VERSION}.gem --no-rdoc --no-ri}, verbose: true)
- end
+ChefConfig::PackageTask.new(File.expand_path('..', __FILE__), 'ChefConfig') do |package|
+ package.module_path_name = 'chef-config'
end
task :default => :spec
@@ -30,36 +12,3 @@ RSpec::Core::RakeTask.new(:spec) do |t|
t.pattern = FileList['spec/**/*_spec.rb']
end
-desc "Regenerate lib/chef/version.rb from VERSION file"
-task :version do
- contents = <<-VERSION_RB
-# Copyright:: Copyright (c) 2010-2015 Chef Software, Inc.
-# 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.
-
-#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-# NOTE: This file is generated by running `rake version` in the top level of
-# this repo. Do not edit this manually. Edit the VERSION file and run the rake
-# task instead.
-#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-module ChefConfig
- VERSION = '#{VERSION}'
-end
-
-VERSION_RB
- version_rb_path = File.expand_path("../lib/chef-config/version.rb", __FILE__)
- IO.write(version_rb_path, contents)
-end
-
diff --git a/chef-config/lib/chef-config/package_task.rb b/chef-config/lib/chef-config/package_task.rb
new file mode 100644
index 0000000000..1073747a40
--- /dev/null
+++ b/chef-config/lib/chef-config/package_task.rb
@@ -0,0 +1,222 @@
+#
+# Author:: Kartik Null Cating-Subramanian (<ksubramanian@chef.io>)
+# Copyright:: Copyright (c) 2015 Chef, Inc.
+# 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.
+#
+
+require 'rake'
+require 'rubygems'
+require 'rubygems/package_task'
+
+module ChefConfig
+ class PackageTask < Rake::TaskLib
+
+ # Full path to root of top-level repository. All other files (like VERSION or
+ # lib/<module_path_name>/version.rb are rooted at this path).
+ attr_accessor :root_path
+
+ # Name of the top-level module/library build built. This is used to define
+ # the top level module which contains VERSION and MODULE_ROOT.
+ attr_accessor :module_name
+
+ # Should the generated version.rb be in a class or module? Default is false (module).
+ attr_accessor :generate_version_class
+
+ # Paths to the roots of any components that also support ChefPackageTask.
+ # If relative paths are provided, they are rooted against root_path.
+ attr_accessor :component_paths
+
+ # This is the module name as it appears on the path "lib/module/".
+ # e.g. for module_name "ChefDK", you'd want module_path_name to be "chef-dk".
+ attr_writer :module_path_name
+
+ def module_path_name
+ @module_path_name || module_name
+ end
+
+ # Path to a VERSION file with a single string that contains the package version.
+ # By default, this is root_path/VERSION
+ attr_accessor :version_file_path
+
+ # Directory used to store package files and output that is generated.
+ # This has the same meaning (or lack thereof) as package_dir in
+ # rake/packagetask.
+ attr_accessor :package_dir
+
+ # Name of git remote used to push tags during a release. Default is origin.
+ attr_accessor :git_remote
+
+ def initialize(root_path=nil, module_name=nil)
+ init(root_path, module_name)
+ yield self if block_given?
+ define unless root_path.nil? || module_name.nil?
+ end
+
+ def init(root_path, module_name)
+ @root_path = root_path
+ @module_name = module_name
+ @component_paths = []
+ @module_path_name = nil
+ @version_file_path = 'VERSION'
+ @package_dir = 'pkg'
+ @git_remote = 'origin'
+ @generate_version_class = false
+ end
+
+ def component_full_paths
+ component_paths.map { |path| File.expand_path(path, root_path)}
+ end
+
+ def version_rb_path
+ File.expand_path("lib/#{module_path_name}/version.rb", root_path)
+ end
+
+ def version
+ IO.read(File.expand_path(version_file_path, root_path)).strip
+ end
+
+ def full_package_dir
+ File.expand_path(package_dir, root_path)
+ end
+
+ def class_or_module
+ generate_version_class ? 'class' : 'module'
+ end
+
+ def with_clean_env(&block)
+ if defined?(Bundler)
+ Bundler.with_clean_env(&block)
+ else
+ block.call
+ end
+ end
+
+ def define
+ fail 'Need to provide package root and module name' if root_path.nil? || module_name.nil?
+
+ desc 'Build Gems of component dependencies'
+ task :package_components do
+ component_full_paths.each do |component_path|
+ Dir.chdir(component_path) do
+ sh 'rake package'
+ end
+ end
+ end
+
+ task :package => :package_components
+
+ desc 'Build and install component dependencies'
+ task :install_components => :package_components do
+ component_full_paths.each do |component_path|
+ Dir.chdir(component_path) do
+ sh 'rake install'
+ end
+ end
+ end
+
+ task :install => :install_components
+
+ desc 'Clean up builds of component dependencies'
+ task :clobber_component_packages do
+ component_full_paths.each do |component_path|
+ Dir.chdir(component_path) do
+ sh 'rake clobber_package'
+ end
+ end
+ end
+
+ task :clobber_package => :clobber_component_packages
+
+ desc 'Update the version number for component dependencies'
+ task :update_components_versions do
+ component_full_paths.each do |component_path|
+ Dir.chdir(component_path) do
+ sh 'rake version'
+ end
+ end
+ end
+
+ desc 'Regenerate lib/#{@module_path_name}/version.rb from VERSION file'
+ task :version => :update_components_versions do
+ contents = <<-VERSION_RB
+# Copyright:: Copyright (c) 2010-2015 Chef Software, Inc.
+# 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.
+
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+# NOTE: This file is generated by running `rake version` in the top level of
+# this repo. Do not edit this manually. Edit the VERSION file and run the rake
+# task instead.
+#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+#{class_or_module} #{module_name}
+ #{module_name.upcase}_ROOT = File.dirname(File.expand_path(File.dirname(__FILE__)))
+ VERSION = '#{version}'
+end
+
+#
+# NOTE: the Chef::Version class is defined in version_class.rb
+#
+# NOTE: DO NOT Use the Chef::Version class on #{module_name}::VERSIONs. The
+# Chef::Version class is for _cookbooks_ only, and cannot handle
+# pre-release versions like "10.14.0.rc.2". Please use Rubygem's
+# Gem::Version class instead.
+#
+ VERSION_RB
+ IO.write(version_rb_path, contents)
+ end
+
+ Dir[File.expand_path("*gemspec", root_path)].reverse.each do |gemspec_path|
+ gemspec = eval(IO.read(gemspec_path))
+ Gem::PackageTask.new(gemspec) do |task|
+ task.package_dir = full_package_dir
+ end
+ end
+
+ desc "Build and install a #{module_path_name} gem"
+ task :install => [:package] do
+ with_clean_env do
+ module_path = File.join(full_package_dir, module_path_name)
+ sh %{gem install #{module_path}-#{version}.gem --no-rdoc --no-ri}
+ end
+ end
+
+ task :uninstall do
+ sh %{gem uninstall #{module_path_name} -x -v #{version} }
+ end
+
+ desc 'Build it, tag it and ship it'
+ task :ship => [:clobber_package, :gem] do
+ sh("git tag #{version}")
+ sh("git push #{git_remote} --tags")
+ Dir[File.expand_path('*.gem', full_package_dir)].reverse.each do |built_gem|
+ sh("gem push #{built_gem}")
+ end
+ end
+ end
+ end
+
+end \ No newline at end of file