2012-05-18 16:12:51 +01:00
|
|
|
class MassBuild < ActiveRecord::Base
|
2013-06-04 20:59:08 +01:00
|
|
|
belongs_to :build_for_platform, :class_name => 'Platform', :conditions => {:platform_type => 'main'}
|
2013-06-03 16:20:23 +01:00
|
|
|
belongs_to :save_to_platform, :class_name => 'Platform'
|
2012-05-23 15:08:11 +01:00
|
|
|
belongs_to :user
|
|
|
|
has_many :build_lists, :dependent => :destroy
|
2012-05-18 16:12:51 +01:00
|
|
|
|
2013-06-04 20:59:08 +01:00
|
|
|
serialize :extra_repositories, Array
|
|
|
|
serialize :extra_build_lists, Array
|
|
|
|
|
2013-05-17 12:42:01 +01:00
|
|
|
scope :recent, order("#{table_name}.created_at DESC")
|
2013-06-03 16:20:23 +01:00
|
|
|
scope :by_platform, lambda { |platform| where(:save_to_platform_id => platform.id) }
|
2013-02-28 15:27:50 +00:00
|
|
|
scope :outdated, where("#{table_name}.created_at < ?", Time.now + 1.day - BuildList::MAX_LIVE_TIME)
|
2012-05-21 11:18:29 +01:00
|
|
|
|
2012-12-10 19:35:56 +00:00
|
|
|
attr_accessor :arches
|
2013-06-04 20:59:08 +01:00
|
|
|
attr_accessible :arches, :auto_publish, :projects_list, :build_for_platform_id,
|
|
|
|
:extra_repositories, :extra_build_lists
|
2012-05-25 16:56:26 +01:00
|
|
|
|
2013-06-21 11:39:03 +01:00
|
|
|
validates :save_to_platform_id, :build_for_platform_id, :arch_names, :name, :user_id, :presence => true
|
|
|
|
validates :projects_list, :length => {:maximum => 500_000}, :presence => true
|
2012-05-29 14:44:30 +01:00
|
|
|
validates_inclusion_of :auto_publish, :in => [true, false]
|
2012-05-25 16:56:26 +01:00
|
|
|
|
2013-06-05 14:48:11 +01:00
|
|
|
after_commit :build_all, :on => :create
|
|
|
|
before_validation :set_data, :on => :create
|
2012-05-25 16:56:26 +01:00
|
|
|
|
2012-06-27 10:48:54 +01:00
|
|
|
COUNT_STATUSES = [
|
|
|
|
:build_lists,
|
|
|
|
:build_published,
|
|
|
|
:build_pending,
|
|
|
|
:build_started,
|
|
|
|
:build_publish,
|
2013-01-29 15:20:28 +00:00
|
|
|
:build_error,
|
|
|
|
:success,
|
|
|
|
:build_canceled
|
2012-06-27 10:48:54 +01:00
|
|
|
]
|
|
|
|
|
2012-05-25 18:31:57 +01:00
|
|
|
def build_all
|
2012-12-06 17:59:17 +00:00
|
|
|
# later with resque
|
2013-03-11 11:19:13 +00:00
|
|
|
arches_list = arch_names ? Arch.where(:name => arch_names.split(', ')) : Arch.all
|
2012-12-10 19:35:56 +00:00
|
|
|
|
|
|
|
projects_list.lines.each do |name|
|
|
|
|
next if name.blank?
|
|
|
|
name.chomp!; name.strip!
|
|
|
|
|
2013-06-03 16:20:23 +01:00
|
|
|
if project = Project.joins(:repositories).where('repositories.id in (?)', save_to_platform.repository_ids).find_by_name(name)
|
2012-12-10 19:35:56 +00:00
|
|
|
begin
|
|
|
|
return if self.reload.stop_build
|
|
|
|
arches_list.each do |arch|
|
2013-06-03 16:20:23 +01:00
|
|
|
rep_id = (project.repository_ids & save_to_platform.repository_ids).first
|
2013-09-04 14:44:48 +01:00
|
|
|
project.build_for(build_for_platform, save_to_platform, rep_id, user, arch, auto_publish?, self, 0)
|
2012-12-10 19:35:56 +00:00
|
|
|
end
|
|
|
|
rescue RuntimeError, Exception
|
|
|
|
end
|
|
|
|
else
|
|
|
|
MassBuild.increment_counter :missed_projects_count, id
|
|
|
|
list = (missed_projects_list || '') << "#{name}\n"
|
|
|
|
update_column :missed_projects_list, list
|
|
|
|
end
|
2012-12-06 17:59:17 +00:00
|
|
|
end
|
2012-05-18 16:12:51 +01:00
|
|
|
end
|
2013-06-04 21:01:19 +01:00
|
|
|
later :build_all, :queue => :clone_build
|
2012-06-22 16:10:44 +01:00
|
|
|
|
|
|
|
def generate_failed_builds_list
|
|
|
|
report = ""
|
2013-03-27 10:38:52 +00:00
|
|
|
BuildList.select('build_lists.id, projects.name as project_name, arches.name as arch_name').
|
|
|
|
where(
|
2013-03-27 09:59:31 +00:00
|
|
|
:status => BuildList::BUILD_ERROR,
|
|
|
|
:mass_build_id => self.id
|
2013-03-27 10:38:52 +00:00
|
|
|
).joins(:project, :arch).find_in_batches(:batch_size => 100) do |build_lists|
|
2013-03-27 09:59:31 +00:00
|
|
|
build_lists.each do |build_list|
|
|
|
|
report << "ID: #{build_list.id}; "
|
2013-03-27 10:38:52 +00:00
|
|
|
report << "PROJECT_NAME: #{build_list.project_name}; "
|
|
|
|
report << "ARCH: #{build_list.arch_name}\n"
|
2013-03-27 09:59:31 +00:00
|
|
|
end
|
2012-06-22 16:10:44 +01:00
|
|
|
end
|
|
|
|
report
|
|
|
|
end
|
2012-06-28 16:23:33 +01:00
|
|
|
|
|
|
|
def cancel_all
|
2012-09-06 11:53:03 +01:00
|
|
|
update_column(:stop_build, true)
|
2012-08-15 14:52:32 +01:00
|
|
|
build_lists.find_each(:batch_size => 100) do |bl|
|
2012-06-29 17:01:32 +01:00
|
|
|
bl.cancel
|
|
|
|
end
|
2012-06-28 16:23:33 +01:00
|
|
|
end
|
2012-07-02 15:50:47 +01:00
|
|
|
later :cancel_all, :queue => :clone_build
|
2012-07-09 17:13:02 +01:00
|
|
|
|
2013-04-02 14:54:18 +01:00
|
|
|
def publish_success_builds(user)
|
|
|
|
publish user, BuildList::SUCCESS, BuildList::FAILED_PUBLISH
|
2013-03-21 14:41:45 +00:00
|
|
|
end
|
|
|
|
later :publish_success_builds, :queue => :clone_build
|
|
|
|
|
2013-08-02 12:23:10 +01:00
|
|
|
def publish_test_failed_builds(user)
|
2013-04-02 14:54:18 +01:00
|
|
|
publish user, BuildList::TESTS_FAILED
|
2013-03-21 14:41:45 +00:00
|
|
|
end
|
2013-08-02 12:23:10 +01:00
|
|
|
later :publish_test_failed_builds, :queue => :clone_build
|
2013-03-21 14:41:45 +00:00
|
|
|
|
2012-07-09 17:13:02 +01:00
|
|
|
private
|
|
|
|
|
2013-04-02 14:54:18 +01:00
|
|
|
def publish(user, *statuses)
|
|
|
|
builds = build_lists.where(:status => statuses)
|
|
|
|
builds.update_all(:publisher_id => user.id)
|
|
|
|
builds.order(:id).find_in_batches(:batch_size => 50) do |bls|
|
2013-09-10 14:58:58 +01:00
|
|
|
bls.each{ |bl| bl.can_publish? && bl.has_new_packages? && bl.now_publish }
|
2013-03-21 14:41:45 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-06-03 16:20:23 +01:00
|
|
|
def set_data
|
2013-06-21 11:39:03 +01:00
|
|
|
if save_to_platform
|
|
|
|
self.name = "#{Time.now.utc.to_date.strftime("%d.%b")}-#{save_to_platform.name}"
|
|
|
|
self.build_for_platform = save_to_platform if save_to_platform.main?
|
|
|
|
end
|
|
|
|
self.arch_names = Arch.where(:id => arches).map(&:name).join(", ")
|
|
|
|
|
|
|
|
self.projects_list = projects_list.lines.map do |name|
|
|
|
|
name.chomp.strip if name.present?
|
|
|
|
end.compact.uniq.join("\r\n") if projects_list.present?
|
2013-06-03 16:20:23 +01:00
|
|
|
end
|
2012-05-18 16:12:51 +01:00
|
|
|
end
|