class Vtasks::Release

Release tasks

Attributes

bug_labels[R]
enhancement_labels[R]
require_pull_request[R]
wait_for_ci_success[R]
write_changelog[R]

Public Class Methods

new(options = {}) click to toggle source
# File lib/vtasks/release.rb, line 20
def initialize(options = {})
  @write_changelog = options.fetch(:write_changelog, false)
  @require_pull_request = options.fetch(:require_pull_request, false)
  @wait_for_ci_success = options.fetch(:wait_for_ci_success, false)
  @bug_labels = options.fetch(:bug_labels, 'bug')
  @enhancement_labels = options.fetch(:enhancement_labels, 'enhancement')
  define_tasks
end

Public Instance Methods

changelog(config, release: nil) click to toggle source

Configure the github_changelog_generator/task

# File lib/vtasks/release.rb, line 30
def changelog(config, release: nil)
  config.bug_labels         = bug_labels #'Type: Bug'
  config.enhancement_labels = enhancement_labels #'Type: Enhancement'
  config.future_release     = "v#{release}" if release
end
define_tasks() click to toggle source
# File lib/vtasks/release.rb, line 36
def define_tasks
  desc 'Generate a Change log from GitHub'
  task release: ['release:changes']

  namespace :release do
    begin
      require 'github_changelog_generator/task'

      # Create release:changes task
      ::GitHubChangelogGenerator::RakeTask.new(:changes) do |config|
          changelog(config)
      end
    rescue LoadError
      nil # Might be in a group that is not installed
    end

    SEM_LEVELS.each do |level|
      desc "Release #{level} version"
      task level.to_sym do
        new_version = bump(level)
        release = "#{new_version[:major]}.#{new_version[:minor]}.#{new_version[:patch]}"
        initial_branch = git_branch

        if require_pull_request == true
          release_branch = "release_v#{release.gsub(/[^0-9A-Za-z]/, '_')}"
        else
          release_branch = initial_branch
        end

        info 'Check if the repository is clean'
        git_clean_repo

        # Write changelog
        if write_changelog == true
          info 'Generate new changelog'
          ::GitHubChangelogGenerator::RakeTask.new(:latest_release) do |config|
            changelog(config, release: release)
          end
          task('latest_release').invoke

          if system 'git diff --quiet HEAD'
            info 'CHANGELOG has not changed. Skipping...'
          else
            # Create a separate release branch (works with  protected branches as well)
            if require_pull_request == true
              info 'Create a new release branch'
              sh "git checkout -b #{release_branch}"
            end

            info 'Commit the new changes'
            sh "git commit --gpg-sign --message 'Update change log for v#{release}' CHANGELOG.md"

            if wait_for_ci_success == true
              info 'Waiting for CI to finish'
              sleep 5 until git_ci_status(release_branch) == 'success'
            end

            if require_pull_request == true
              info 'Merge release branch'
              sh "git checkout #{initial_branch}"
              sh "git merge --gpg-sign --no-ff --message 'Release v#{release}' #{release_branch}"
            end
          end
        end

        info "Tag #{release}"
        sh "git tag --sign v#{release} --message 'Release v#{release}'"
        sh 'git push --follow-tags'
      end # task
    end # LEVELS
  end # namespace :release
end