Rakefile in selenium-connect-2.0.0 vs Rakefile in selenium-connect-2.1.0

- old
+ new

@@ -1,17 +1,127 @@ -require "bundler/gem_tasks" +# Encoding: utf-8 + +require 'bundler/gem_tasks' require 'rspec/core/rake_task' -task :default => [:build] +task default: :build_ci +task build_ci: [:clean, :prepare, :rubocop, :spec_unit] + desc 'Runs standard build activities.' -task :build => [:clean, :prepare, :spec] +task build: [:clean, :prepare, :rubocop, :spec_unit, :spec_full] desc 'Removes the build directory.' task :clean do - FileUtils.rm_rf('build'); + FileUtils.rm_rf('build') end desc 'Adds the build tmp directory for test kit creation.' task :prepare do FileUtils.mkdir_p('build/tmp') end -RSpec::Core::RakeTask.new(:spec) +RSpec::Core::RakeTask.new(:spec_full) + +RSpec::Core::RakeTask.new(:spec_unit) do |t| + t.rspec_opts = "--tag ~selenium" +end + +desc 'Runs code quality check' +task :rubocop do + sh 'rubocop' +end + +# TODO This could probably be more cleanly automated +desc 'Start a release (Requires Git Flow)' +task :release_start, :version do |t, args| + version = args['version'] + + # make sure we have the latest stuff + system 'git fetch --all' + + # first make sure master is checked out and up to date + system 'git checkout master' + system 'git pull --no-edit origin master' + + # then make sure develop is up to date + system 'git checkout develop' + system 'git pull --no-edit origin develop' + + # next assure all the tests run + task(:build).invoke + + # start the release process + system "git flow release start #{version}" + + # update the version number in the .gemspec file + gemspec = File.join(Dir.getwd, 'selenium-connect.gemspec') + updated = File.read(gemspec).gsub( + /s.version(\s+)=(\s?["|']).+(["|'])/, + "s.version\\1=\\2#{version}\\3" + ) + File.open(gemspec, 'w') { |f| f.write(updated) } + + # commit the version bump + system 'git add selenium-connect.gemspec' + system "git commit -m 'Bumped version to #{version} to prepare for release.'" + + puts "You've started release #{version}, make any last minute updates now.\n" +end + +# TODO This could probablly be more cleanly automated +desc 'Finish a release (Requires Git Flow and Gem Deploy Permissions' +task :release_finish, :update_message do |t, args| + message = args['update_message'] + gemspec = File.join(Dir.getwd, 'selenium-connect.gemspec') + changelog = File.join(Dir.getwd, 'CHANGELOG.md') + version = File.read(gemspec).match(/s.version\s+=\s?["|'](.+)["|']/)[1] + + ### Changelog + # get the latest tag + last_tag = `git describe --abbrev=0` + # get the commit hash since the last that version was merged to develop + hash = `git log --grep="Merge branch 'release/#{last_tag.chomp}' into develop" --format="%H"` + # get all the commits since them less merges + log = `git log --format="- %s" --no-merges #{hash.chomp}..HEAD` + + changelog_contents = File.read(changelog) + date = Time.new.strftime('%Y-%m-%d') + # create the new heading + updated_changelog = "##{version} (#{date})\n" + log + "\n" + changelog_contents + # update the contents + File.open(changelog, 'w') { |f| f.write(updated_changelog) } + puts "Updated change log for version #{version}\n" + + ### Update the gemspec with the message + updated_gemspec = File.read(gemspec).gsub( + /s.description(\s+)=(\s?["|']).+(["|'])/, + "s.description\\1=\\2#{message}\\3" + ) + File.open(gemspec, 'w') { |f| f.write(updated_gemspec) } + + # Commit the updated change log and gemspec + system "git commit -am 'Updated CHANGELOG.md and gemspec for #{version} release.'" + + # build the gem + system 'gem build selenium-connect.gemspec' + + # push the gem + system "gem push selenium-connect-#{version}.gem" + + # remove the gem file + system "rm selenium-connect-#{version}.gem" + + # finish the release + # TODO there is a bug with git flow, and you still need to deal with merge + # messages, might just do this with git directly + system "git flow release finish -m'#{version}' #{version}" + + # push develop + system 'git push origin develop' + + # push master + system 'git push origin master' + + # push tags + system 'git push --tags' + + puts "Rock and roll, you just released Selenium Connect #{version}!\n" +end