Skip to content

Commit

Permalink
refs #266
Browse files Browse the repository at this point in the history
hide 'delete' when 'rotate build' is disable.
few rotator bug.
  • Loading branch information
toshiyuki.ando1971 committed Jan 30, 2010
1 parent 0dc826f commit 681fd67
Show file tree
Hide file tree
Showing 7 changed files with 139 additions and 42 deletions.
11 changes: 10 additions & 1 deletion app/controllers/hudson_settings_controller.rb
Expand Up @@ -57,7 +57,16 @@ def joblist
end

def delete_builds
# 今は何もしないようにしておく。
find_hudson_jobs(@hudson.settings.url)

return unless params[:job_id]
job = HudsonJob.find(params[:job_id])
return unless job

rotator = HudsonBuildRotator.new(job.job_settings)
rotator.execute
rescue => error
@error = error.message
ensure
render :layout => false, :template => 'hudson_settings/_joblist.rhtml'
end
Expand Down
65 changes: 45 additions & 20 deletions app/models/hudson_build_rotator.rb
Expand Up @@ -2,7 +2,8 @@
# and open the template in the editor.

class HudsonBuildRotator

unloadable

def initialize(job_settings)
raise ArgumentError.new("arg job_settings is nil") unless job_settings
raise ArgumentError.new("arg job_settings should be HudsonJobSetting") unless job_settings.is_a?(HudsonJobSettings)
Expand All @@ -12,33 +13,57 @@ def initialize(job_settings)
def execute
return unless @job_settings.do_rotate?

cond = "hudson_job_id = #{@job_settings.hudson_job_id}"
HudsonBuild.destroy_all(HudsonBuildRotator.create_cond_to_delete(@job_settings))

delete_conds = []
delete_conds << create_cond_days_to_delete(@job_settings.build_rotator_days_to_keep)
delete_conds << create_cond_num_to_delete(@job_settings.build_rotator_num_to_keep)
delete_conds.delete("")
end

delete_cond = delete_conds.join(" OR ")
end

cond << " AND (#{delete_cond})"
def HudsonBuildRotator.can_store?(job, number)
return false unless job
return false unless number

HudsonBuild.delete_all(cond)
job_settings = job.job_settings
return true unless job_settings
return true unless job_settings.do_rotate?

end
cond = HudsonBuildRotator.create_cond_to_delete(job_settings)

private
def create_cond_days_to_delete(days_to_keep)
return "" unless (days_to_keep && days_to_keep > 0)
# get oldest data
oldest = HudsonBuild.find(:first,
:conditions => ["#{HudsonBuild.table_name}.hudson_job_id = ? and #{HudsonBuild.table_name}.id not in (select #{HudsonBuild.table_name}.id from #{HudsonBuild.table_name} where #{cond})", job.id],
:order => "#{HudsonBuild.table_name}.finished_at")

date_to_delete = Date.today - days_to_keep
return "finished_at <= '#{date_to_delete}'"
end
return number.to_i >= oldest.number.to_i

def create_cond_num_to_delete(num_to_keep)
return "" unless (num_to_keep && num_to_keep > 0)
end

return "id not in (select id from #{HudsonBuild.table_name} order by id desc limit #{num_to_keep})"
end
def HudsonBuildRotator.create_cond_to_delete(job_settings)

cond = "#{HudsonBuild.table_name}.hudson_job_id = #{job_settings.hudson_job_id}"

delete_conds = []
delete_conds << HudsonBuildRotator.create_cond_days_to_delete(job_settings.build_rotator_days_to_keep)
delete_conds << HudsonBuildRotator.create_cond_num_to_delete(job_settings.hudson_job_id, job_settings.build_rotator_num_to_keep)
delete_conds.delete("")

delete_cond = delete_conds.join(" OR ")

cond << " AND (#{delete_cond})"

return cond

end

def HudsonBuildRotator.create_cond_days_to_delete(days_to_keep)
return "" unless (days_to_keep && days_to_keep > 0)

date_to_delete = Date.today - days_to_keep
return "#{HudsonBuild.table_name}.finished_at <= '#{date_to_delete} 23:59:59'"
end

def HudsonBuildRotator.create_cond_num_to_delete(job_id, num_to_keep)
return "" unless (num_to_keep && num_to_keep > 0)

return "#{HudsonBuild.table_name}.id not in (select #{HudsonBuild.table_name}.id from #{HudsonBuild.table_name} where #{HudsonBuild.table_name}.hudson_job_id = #{job_id} order by #{HudsonBuild.table_name}.finished_at desc limit #{num_to_keep})"
end
2 changes: 2 additions & 0 deletions app/models/hudson_job.rb
Expand Up @@ -142,6 +142,7 @@ def fetch_summary
doc.elements.each("//entry") do |entry|
buildinfo = HudsonBuild.parse_rss(entry)

next unless HudsonBuildRotator.can_store?(self, buildinfo[:number])
next unless HudsonBuild.to_be_updated?(self.id, buildinfo[:number])

build = get_build(buildinfo[:number])
Expand Down Expand Up @@ -188,6 +189,7 @@ def fetch_detail
doc.elements.each("//build") do |buildelem|
build_number = get_element_value(buildelem, "number")

next unless HudsonBuildRotator.can_store?(self, build_number)
next unless HudsonBuild.to_be_updated?(self.id, build_number)

build = get_build(build_number)
Expand Down
2 changes: 1 addition & 1 deletion app/views/hudson_settings/_joblist.rhtml
Expand Up @@ -34,7 +34,7 @@
<% delete_button = link_to_remote(l(:button_delete), { :update => 'joblist', :url => {:controller => 'hudson_settings', :action => 'delete_builds', :id => @project, :job_id => job.id},
:method => :post
}, :title => l(:button_delete),
:class => 'icon icon-del') -%>
:class => 'icon icon-del') if job && job.job_settings && job.job_settings.do_rotate? -%>
<td><%=delete_button%></td>
<tr>
<% end %>
Expand Down
6 changes: 6 additions & 0 deletions app/views/hudson_settings/edit.rhtml
Expand Up @@ -53,6 +53,12 @@
<p><%= submit_tag l(:button_save) %></p>
<% end %>

<h2 style="margin-top:20px;"><%=l(:label_database)%></h2>

<% form_tag({:action => 'delete_history', :id => @project}) do %>
<%= submit_tag l(:button_delete_history) %>
<% end %>

<style type="text/css">
<!--
.health_report_explain { font-weight:bold;}
Expand Down
2 changes: 1 addition & 1 deletion init.rb
Expand Up @@ -14,7 +14,7 @@
# パーミッション設定。
permission :view_hudson, {:hudson => [:index, :history]}
permission :build_hudson, {:hudson => [:build]}, :require => :member
permission :edit_hudson_settings, {:hudson_settings => [:edit, :joblist, :delete_builds]}, :require => :member
permission :edit_hudson_settings, {:hudson_settings => [:edit, :joblist, :delete_builds, :delete_history]}, :require => :member
end

menu :project_menu, :hudson, { :controller => :hudson, :action => :index }, :param => :id, :caption => :label_hudson
Expand Down
93 changes: 74 additions & 19 deletions test/unit/hudson_build_rotator_test.rb
Expand Up @@ -21,19 +21,22 @@ def test_execute_both

HudsonBuild.delete_all

create_build data_job.id, Date.today - 2, (1..10)
create_build data_job.id, Date.today - 1, (11..20)
create_build data_job.id, Date.today, (21..30)
curdate = DateTime.new(2010,1,30,12,00,10)
(0..1).each do |index|
create_build data_job.id + index, curdate - 2, (1..10)
create_build data_job.id + index, curdate - 1, (11..20)
create_build data_job.id + index, curdate, (21..30)
end

assert_equal 30, HudsonBuild.count()
assert_equal 60, HudsonBuild.count()

target = HudsonBuildRotator.new(job.job_settings)
target.execute

assert_equal 10, HudsonBuild.count
assert_equal 30, HudsonBuild.count_by_sql(["select count(*) from #{HudsonBuild.table_name} where hudson_job_id = ?", data_job.id + 1])
count = 0
HudsonBuild.find(:all).each do |build|
count += 1 if build.number.to_i >= 11 && build.finished_at > Date.today - 1
HudsonBuild.find(:all, :conditions => ["hudson_job_id = ?", data_job.id]).each do |build|
count += 1 if build.number.to_i >= 11 && build.finished_at >= DateTime.new(2010,1,30,0,0,0)
end
assert_equal 10, count

Expand All @@ -48,15 +51,19 @@ def test_execute_enable_num_to_keep

HudsonBuild.delete_all

create_build data_job.id, Date.today - 2, (1..10)
create_build data_job.id, Date.today - 1, (11..20)
create_build data_job.id, Date.today, (21..30)
curdate = DateTime.new(2010,1,30,12,00,10)
(0..1).each do |index|
create_build data_job.id + index, curdate - 2, (1..10)
create_build data_job.id + index, curdate - 1, (11..20)
create_build data_job.id + index, curdate, (21..30)
end

target.execute

assert_equal 15, HudsonBuild.count
assert_equal 45, HudsonBuild.count
assert_equal 30, HudsonBuild.count_by_sql(["select count(*) from #{HudsonBuild.table_name} where hudson_job_id = ?", data_job.id + 1])
count = 0
HudsonBuild.find(:all).each do |build|
HudsonBuild.find(:all, :conditions => ["hudson_job_id = ?", data_job.id]).each do |build|
count += 1 if build.number.to_i >= 16
end
assert_equal 15, count
Expand All @@ -72,29 +79,77 @@ def test_execute_enable_days_to_keep

HudsonBuild.delete_all

create_build data_job.id, Date.today - 2, (1..10)
create_build data_job.id, Date.today - 1, (11..20)
create_build data_job.id, Date.today, (21..30)
curdate = DateTime.new(2010,1,30,12,00,10)
(0..1).each do |index|
create_build data_job.id + index, curdate - 2, (1..10)
create_build data_job.id + index, curdate - 1, (11..20)
create_build data_job.id + index, curdate, (21..30)
end

target.execute

assert_equal 20, HudsonBuild.count
assert_equal 50, HudsonBuild.count
assert_equal 30, HudsonBuild.count_by_sql(["select count(*) from #{HudsonBuild.table_name} where hudson_job_id = ?", data_job.id + 1])
count = 0
HudsonBuild.find(:all).each do |build|
count += 1 if build.finished_at > Date.today - job.job_settings.build_rotator_days_to_keep
HudsonBuild.find(:all, :conditions => ["hudson_job_id = ?", data_job.id]).each do |build|
count += 1 if build.finished_at >= DateTime.new(2010,1,29,0,0,0)
end
assert_equal 20, count

end

def test_self_can_store_should_return_false

data_job = hudson_jobs(:simple_ruby_application)
job = HudsonJob.find(data_job.id, :include => HudsonJobSettings)

HudsonBuild.delete_all

curdate = DateTime.new(2010,1,30,12,00,10)
(0..1).each do |index|
create_build data_job.id + index, curdate - 2, (1..10)
create_build data_job.id + index, curdate - 1, (11..20)
create_build data_job.id + index, curdate, (21..30)
end

assert_equal false, HudsonBuildRotator.can_store?(nil, nil)
assert_equal false, HudsonBuildRotator.can_store?(nil, 1)
assert_equal false, HudsonBuildRotator.can_store?(nil, "1")

assert_equal false, HudsonBuildRotator.can_store?(job, 1)
assert_equal false, HudsonBuildRotator.can_store?(job, "1")
assert_equal false, HudsonBuildRotator.can_store?(job, 20)
assert_equal false, HudsonBuildRotator.can_store?(job, "20")

end

def test_self_can_store_should_return_true

data_job = hudson_jobs(:simple_ruby_application)
job = HudsonJob.find(data_job.id, :include => HudsonJobSettings)

HudsonBuild.delete_all

curdate = DateTime.new(2010,1,30,12,00,10)
(0..1).each do |index|
create_build data_job.id + index, curdate - 2, (1..10)
create_build data_job.id + index, curdate - 1, (11..20)
create_build data_job.id + index, curdate, (21..30)
end

assert_equal true, HudsonBuildRotator.can_store?(job, 31)
assert_equal true, HudsonBuildRotator.can_store?(job, "31")

end

def create_build(job_id, finished_at, number_list)
number_list.each do |number|
build = HudsonBuild.new
build.hudson_job_id = job_id
build.number = number
build.result = "SUCCESS"
build.building = false
build.finished_at = finished_at
build.finished_at = finished_at + Rational(1, 24 * 60 * 60) * number
build.save!
end
end
Expand Down

0 comments on commit 681fd67

Please sign in to comment.