ianheggie/cruisecontrol.rb

View on GitHub
lib/builder_plugins/release_tag_logger/init.rb

Summary

Maintainability
A
0 mins
Test Coverage
# CruiseControl.rb shows builds by their commit number . For git , this doesn't represent a sequential number . This plugin adds a sequential build number . 
#
#
class ReleaseTagLogger < BuilderPlugin
  attr_accessor :enabled
  attr_accessor :show_in_artifacts

  
  def initialize(project)
    @enabled = true 
    @show_in_artifacts = true
    @current_dir = Rails.root.join('lib', 'builder_plugins', 'release_tag_logger').to_s
  end

  def release_tagged(revision , tag_label, build)
    @project_release_tag_log = "#{build.project.path}/release_tag.log"
    if @enabled
      remove_existing_tag(tag_label)
      add_tag(revision , tag_label)
      move_tag_log_to_artifacts(build)
    end
  end

  
  private

  def remove_existing_tag(tag)
    begin
      create_temp_file_without_tag_command = "grep -v \"^#{tag},\" #{@project_release_tag_log} > tmpfile" 
      move_temp_file_to_release_tag_log_command = "mv tmpfile #{@project_release_tag_log}" 
      system(create_temp_file_without_tag_command)
      system(move_temp_file_to_release_tag_log_command)
    rescue Exception => e
      CruiseControl::Log.event("Existing release tag was not removed from file - #{e.inspect}" , :error)
    end
  end

  def add_tag(revision , tag)
    File.open(@project_release_tag_log, "a") do |f| 
      f.write "#{tag},#{revision},#{Time.now}\n"
    end 
  end

  def move_tag_log_to_artifacts(build)
    destination_dir = "#{build.artifacts_directory}/release_tags"
    FileUtils.mkdir_p destination_dir unless File.directory?(destination_dir) 
    FileUtils.cp @current_dir + '/index.html' , destination_dir
    FileUtils.cp_r @current_dir + '/tablecloth' , destination_dir
    FileUtils.cp @project_release_tag_log , destination_dir
  end


end

Project.plugin :release_tag_logger