2012-01-30 20:39:34 +00:00
|
|
|
# -*- encoding : utf-8 -*-
|
2011-04-07 14:20:21 +01:00
|
|
|
class BuildList < ActiveRecord::Base
|
2012-11-06 14:13:16 +00:00
|
|
|
include Modules::Models::CommitAndVersion
|
2012-12-06 14:41:24 +00:00
|
|
|
include AbfWorker::ModelHelper
|
2012-11-06 14:13:16 +00:00
|
|
|
|
2011-04-07 14:20:21 +01:00
|
|
|
belongs_to :project
|
|
|
|
belongs_to :arch
|
2012-05-04 18:12:51 +01:00
|
|
|
belongs_to :save_to_platform, :class_name => 'Platform'
|
2012-07-27 17:01:26 +01:00
|
|
|
belongs_to :save_to_repository, :class_name => 'Repository'
|
2012-05-04 18:12:51 +01:00
|
|
|
belongs_to :build_for_platform, :class_name => 'Platform'
|
2011-12-20 17:09:29 +00:00
|
|
|
belongs_to :user
|
2012-05-04 18:12:51 +01:00
|
|
|
belongs_to :advisory
|
2012-06-22 16:10:44 +01:00
|
|
|
belongs_to :mass_build, :counter_cache => true
|
2012-05-14 20:08:31 +01:00
|
|
|
has_many :items, :class_name => "BuildList::Item", :dependent => :destroy
|
|
|
|
has_many :packages, :class_name => "BuildList::Package", :dependent => :destroy
|
2012-05-04 18:12:51 +01:00
|
|
|
|
2011-10-22 16:28:41 +01:00
|
|
|
UPDATE_TYPES = %w[security bugfix enhancement recommended newpackage]
|
2012-05-04 18:12:51 +01:00
|
|
|
RELEASE_UPDATE_TYPES = %w[security bugfix]
|
|
|
|
|
2012-07-27 17:01:26 +01:00
|
|
|
validates :project_id, :project_version, :arch, :include_repos,
|
|
|
|
:build_for_platform_id, :save_to_platform_id, :save_to_repository_id, :presence => true
|
2012-05-14 20:08:31 +01:00
|
|
|
validates_numericality_of :priority, :greater_than_or_equal_to => 0
|
2012-05-04 18:12:51 +01:00
|
|
|
validates :update_type, :inclusion => UPDATE_TYPES,
|
2012-07-06 00:05:47 +01:00
|
|
|
:unless => Proc.new { |b| b.advisory.present? }
|
2012-05-24 11:21:57 +01:00
|
|
|
validates :update_type, :inclusion => {:in => RELEASE_UPDATE_TYPES, :message => I18n.t('flash.build_list.frozen_platform')},
|
2012-07-06 00:05:47 +01:00
|
|
|
:if => Proc.new { |b| b.advisory.present? }
|
2012-05-24 11:21:57 +01:00
|
|
|
validate lambda {
|
2012-05-04 18:12:51 +01:00
|
|
|
errors.add(:build_for_platform, I18n.t('flash.build_list.wrong_platform')) if save_to_platform.platform_type == 'main' && save_to_platform_id != build_for_platform_id
|
2011-10-22 16:28:41 +01:00
|
|
|
}
|
2012-11-20 16:14:51 +00:00
|
|
|
validate lambda {
|
|
|
|
errors.add(:build_for_platform, I18n.t('flash.build_list.wrong_build_for_platform')) unless build_for_platform.platform_type == 'main'
|
|
|
|
}
|
2012-07-27 17:01:26 +01:00
|
|
|
validate lambda {
|
2012-07-30 20:25:57 +01:00
|
|
|
errors.add(:save_to_repository, I18n.t('flash.build_list.wrong_repository')) unless save_to_repository_id.in? save_to_platform.repositories.map(&:id)
|
|
|
|
}
|
2012-09-04 13:44:28 +01:00
|
|
|
validate lambda {
|
|
|
|
include_repos.each {|ir|
|
|
|
|
errors.add(:save_to_repository, I18n.t('flash.build_list.wrong_include_repos')) unless build_for_platform.repository_ids.include? ir.to_i
|
|
|
|
}
|
|
|
|
}
|
2011-10-22 16:28:41 +01:00
|
|
|
|
2012-10-11 11:55:06 +01:00
|
|
|
LIVE_TIME = 4.week # for unpublished
|
2012-08-06 16:35:11 +01:00
|
|
|
MAX_LIVE_TIME = 3.month # for published
|
2012-05-11 18:44:19 +01:00
|
|
|
|
2011-12-12 12:34:20 +00:00
|
|
|
# The kernel does not send these statuses directly
|
2011-10-22 16:28:41 +01:00
|
|
|
BUILD_CANCELED = 5000
|
2011-04-11 17:37:09 +01:00
|
|
|
WAITING_FOR_RESPONSE = 4000
|
|
|
|
BUILD_PENDING = 2000
|
2011-11-11 10:38:17 +00:00
|
|
|
BUILD_PUBLISHED = 6000
|
2011-12-22 00:53:55 +00:00
|
|
|
BUILD_PUBLISH = 7000
|
|
|
|
FAILED_PUBLISH = 8000
|
2012-04-17 19:18:39 +01:00
|
|
|
REJECTED_PUBLISH = 9000
|
2012-12-06 14:41:24 +00:00
|
|
|
BUILD_CANCELING = 10000
|
2011-04-11 17:37:09 +01:00
|
|
|
|
2011-12-12 12:34:20 +00:00
|
|
|
STATUSES = [ WAITING_FOR_RESPONSE,
|
|
|
|
BUILD_CANCELED,
|
|
|
|
BUILD_PENDING,
|
|
|
|
BUILD_PUBLISHED,
|
2012-12-06 14:41:24 +00:00
|
|
|
BUILD_CANCELING,
|
2011-12-22 00:53:55 +00:00
|
|
|
BUILD_PUBLISH,
|
|
|
|
FAILED_PUBLISH,
|
2012-04-17 19:18:39 +01:00
|
|
|
REJECTED_PUBLISH,
|
2011-12-12 12:34:20 +00:00
|
|
|
BuildServer::SUCCESS,
|
|
|
|
BuildServer::BUILD_STARTED,
|
|
|
|
BuildServer::BUILD_ERROR,
|
|
|
|
BuildServer::PLATFORM_NOT_FOUND,
|
|
|
|
BuildServer::PLATFORM_PENDING,
|
|
|
|
BuildServer::PROJECT_NOT_FOUND,
|
|
|
|
BuildServer::PROJECT_VERSION_NOT_FOUND,
|
2012-02-29 14:04:04 +00:00
|
|
|
# BuildServer::BINARY_TEST_FAILED,
|
|
|
|
# BuildServer::DEPENDENCY_TEST_FAILED
|
|
|
|
]
|
2011-04-07 15:56:28 +01:00
|
|
|
|
2011-12-12 12:34:20 +00:00
|
|
|
HUMAN_STATUSES = { WAITING_FOR_RESPONSE => :waiting_for_response,
|
2011-12-12 16:16:05 +00:00
|
|
|
BUILD_CANCELED => :build_canceled,
|
2012-12-06 14:41:24 +00:00
|
|
|
BUILD_CANCELING => :build_canceling,
|
2011-04-07 15:56:28 +01:00
|
|
|
BUILD_PENDING => :build_pending,
|
2011-12-12 12:34:20 +00:00
|
|
|
BUILD_PUBLISHED => :build_published,
|
2011-12-22 00:53:55 +00:00
|
|
|
BUILD_PUBLISH => :build_publish,
|
|
|
|
FAILED_PUBLISH => :failed_publish,
|
2012-04-17 19:18:39 +01:00
|
|
|
REJECTED_PUBLISH => :rejected_publish,
|
2011-12-12 12:34:20 +00:00
|
|
|
BuildServer::BUILD_ERROR => :build_error,
|
|
|
|
BuildServer::BUILD_STARTED => :build_started,
|
2011-04-11 17:37:09 +01:00
|
|
|
BuildServer::SUCCESS => :success,
|
|
|
|
BuildServer::PLATFORM_NOT_FOUND => :platform_not_found,
|
|
|
|
BuildServer::PLATFORM_PENDING => :platform_pending,
|
|
|
|
BuildServer::PROJECT_NOT_FOUND => :project_not_found,
|
2011-10-29 18:50:47 +01:00
|
|
|
BuildServer::PROJECT_VERSION_NOT_FOUND => :project_version_not_found,
|
2012-02-29 14:04:04 +00:00
|
|
|
# BuildServer::DEPENDENCY_TEST_FAILED => :dependency_test_failed,
|
|
|
|
# BuildServer::BINARY_TEST_FAILED => :binary_test_failed
|
2011-04-07 14:20:21 +01:00
|
|
|
}
|
|
|
|
|
2011-12-13 13:00:15 +00:00
|
|
|
scope :recent, order("#{table_name}.updated_at DESC")
|
2011-04-07 14:20:21 +01:00
|
|
|
scope :for_status, lambda {|status| where(:status => status) }
|
2012-03-05 09:11:50 +00:00
|
|
|
scope :for_user, lambda { |user| where(:user_id => user.id) }
|
2012-08-30 22:20:30 +01:00
|
|
|
scope :for_platform, lambda { |platform| where(:build_for_platform_id => platform) }
|
2012-05-22 14:40:27 +01:00
|
|
|
scope :by_mass_build, lambda { |mass_build| where(:mass_build_id => mass_build) }
|
2011-04-07 14:20:21 +01:00
|
|
|
scope :scoped_to_arch, lambda {|arch| where(:arch_id => arch) }
|
2012-07-09 21:43:01 +01:00
|
|
|
scope :scoped_to_save_platform, lambda {|pl_id| where(:save_to_platform_id => pl_id) }
|
2011-10-23 11:34:42 +01:00
|
|
|
scope :scoped_to_project_version, lambda {|project_version| where(:project_version => project_version) }
|
2011-04-07 15:56:28 +01:00
|
|
|
scope :scoped_to_is_circle, lambda {|is_circle| where(:is_circle => is_circle) }
|
2011-04-07 14:20:21 +01:00
|
|
|
scope :for_creation_date_period, lambda{|start_date, end_date|
|
2012-04-13 23:27:24 +01:00
|
|
|
s = scoped
|
|
|
|
s = s.where(["build_lists.created_at >= ?", start_date]) if start_date
|
|
|
|
s = s.where(["build_lists.created_at <= ?", end_date]) if end_date
|
|
|
|
s
|
2011-04-07 14:20:21 +01:00
|
|
|
}
|
|
|
|
scope :for_notified_date_period, lambda{|start_date, end_date|
|
2012-04-13 23:27:24 +01:00
|
|
|
s = scoped
|
|
|
|
s = s.where(["build_lists.updated_at >= ?", start_date]) if start_date
|
|
|
|
s = s.where(["build_lists.updated_at <= ?", end_date]) if end_date
|
|
|
|
s
|
2011-04-07 14:20:21 +01:00
|
|
|
}
|
2011-12-07 22:46:01 +00:00
|
|
|
scope :scoped_to_project_name, lambda {|project_name| joins(:project).where('projects.name LIKE ?', "%#{project_name}%")}
|
2012-12-10 12:15:22 +00:00
|
|
|
scope :scoped_to_new_core, lambda {|new_core| where(:new_core => new_core)}
|
2012-08-06 16:35:11 +01:00
|
|
|
scope :outdated, where('created_at < ? AND status <> ? OR created_at < ?', Time.now - LIVE_TIME, BUILD_PUBLISHED, Time.now - MAX_LIVE_TIME)
|
2012-05-11 18:44:19 +01:00
|
|
|
|
2011-04-11 11:47:57 +01:00
|
|
|
serialize :additional_repos
|
2011-12-21 14:01:50 +00:00
|
|
|
serialize :include_repos
|
2012-11-27 14:22:17 +00:00
|
|
|
serialize :results, Array
|
2012-05-11 18:44:19 +01:00
|
|
|
|
2012-06-20 16:08:21 +01:00
|
|
|
after_commit :place_build
|
2012-05-23 11:52:23 +01:00
|
|
|
after_destroy :delete_container
|
2011-04-11 11:47:57 +01:00
|
|
|
|
2012-06-09 13:52:29 +01:00
|
|
|
@queue = :clone_and_build
|
|
|
|
|
2012-05-28 18:47:53 +01:00
|
|
|
state_machine :status, :initial => :waiting_for_response do
|
|
|
|
|
2012-06-29 12:01:40 +01:00
|
|
|
# WTF? around_transition -> infinite loop
|
|
|
|
before_transition do |build_list, transition|
|
2012-07-30 15:49:40 +01:00
|
|
|
status = BuildList::HUMAN_STATUSES[build_list.status]
|
|
|
|
if build_list.mass_build && MassBuild::COUNT_STATUSES.include?(status)
|
|
|
|
MassBuild.decrement_counter "#{status.to_s}_count", build_list.mass_build_id
|
2012-06-29 12:01:40 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
after_transition do |build_list, transition|
|
2012-07-30 15:49:40 +01:00
|
|
|
status = BuildList::HUMAN_STATUSES[build_list.status]
|
|
|
|
if build_list.mass_build && MassBuild::COUNT_STATUSES.include?(status)
|
|
|
|
MassBuild.increment_counter "#{status.to_s}_count", build_list.mass_build_id
|
2012-06-22 16:10:44 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-08-24 16:19:26 +01:00
|
|
|
after_transition :on => :published, :do => [:set_version_and_tag, :actualize_packages]
|
2012-12-06 17:34:09 +00:00
|
|
|
after_transition :on => :cancel, :do => [:cancel_job],
|
2012-12-06 19:18:28 +00:00
|
|
|
:if => lambda { |build_list| build_list.new_core? }
|
2012-12-10 18:04:33 +00:00
|
|
|
after_transition :on => :publish, :do => [:publish_container],
|
|
|
|
:if => lambda { |build_list| build_list.new_core? }
|
2012-06-14 14:36:40 +01:00
|
|
|
|
2012-09-19 20:52:18 +01:00
|
|
|
after_transition :on => [:published, :fail_publish, :build_error], :do => :notify_users
|
|
|
|
after_transition :on => :build_success, :do => :notify_users,
|
2012-09-19 21:54:15 +01:00
|
|
|
:unless => lambda { |build_list| build_list.auto_publish? }
|
2012-06-14 14:36:40 +01:00
|
|
|
|
2012-06-01 11:58:17 +01:00
|
|
|
event :place_build do
|
|
|
|
transition :waiting_for_response => :build_pending, :if => lambda { |build_list|
|
2012-06-19 18:24:11 +01:00
|
|
|
build_list.add_to_queue == BuildServer::SUCCESS
|
2012-06-01 11:58:17 +01:00
|
|
|
}
|
|
|
|
[
|
2012-06-05 13:19:54 +01:00
|
|
|
'BuildList::BUILD_PENDING',
|
|
|
|
'BuildServer::PLATFORM_PENDING',
|
|
|
|
'BuildServer::PLATFORM_NOT_FOUND',
|
|
|
|
'BuildServer::PROJECT_NOT_FOUND',
|
|
|
|
'BuildServer::PROJECT_VERSION_NOT_FOUND'
|
2012-06-01 11:58:17 +01:00
|
|
|
].each do |code|
|
2012-06-05 13:19:54 +01:00
|
|
|
transition :waiting_for_response => code.demodulize.downcase.to_sym, :if => lambda { |build_list|
|
|
|
|
build_list.add_to_queue == code.constantize
|
2012-06-01 11:58:17 +01:00
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-06-13 19:33:23 +01:00
|
|
|
event :start_build do
|
2012-06-13 18:24:50 +01:00
|
|
|
transition [ :build_pending,
|
|
|
|
:platform_pending,
|
|
|
|
:platform_not_found,
|
|
|
|
:project_not_found,
|
|
|
|
:project_version_not_found ] => :build_started
|
|
|
|
end
|
|
|
|
|
2012-05-28 18:47:53 +01:00
|
|
|
event :cancel do
|
2012-05-30 13:42:30 +01:00
|
|
|
transition [:build_pending, :platform_pending] => :build_canceled, :if => lambda { |build_list|
|
2012-12-06 14:41:24 +00:00
|
|
|
!build_list.new_core? && build_list.can_cancel? && BuildServer.delete_build_list(build_list.bs_id) == BuildServer::SUCCESS
|
2012-05-30 13:42:30 +01:00
|
|
|
}
|
2012-12-06 17:34:09 +00:00
|
|
|
transition [:build_pending, :build_started] => :build_canceling, :if => lambda { |build_list|
|
2012-12-06 19:18:28 +00:00
|
|
|
build_list.new_core?
|
2012-12-06 17:34:09 +00:00
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2012-12-07 11:47:42 +00:00
|
|
|
# :build_canceling => :build_canceled - canceling from UI
|
|
|
|
# :build_started => :build_canceled - canceling from worker by time-out (time_living has been expired)
|
2012-12-06 17:34:09 +00:00
|
|
|
event :build_canceled do
|
2012-12-07 09:10:38 +00:00
|
|
|
transition [:build_canceling, :build_started] => :build_canceled, :if => lambda { |build_list|
|
2012-12-06 17:34:09 +00:00
|
|
|
build_list.new_core?
|
2012-05-30 13:42:30 +01:00
|
|
|
}
|
2012-05-28 18:47:53 +01:00
|
|
|
end
|
|
|
|
|
2012-06-13 18:24:50 +01:00
|
|
|
event :published do
|
|
|
|
transition [:build_publish, :rejected_publish] => :build_published
|
|
|
|
end
|
|
|
|
|
|
|
|
event :fail_publish do
|
|
|
|
transition [:build_publish, :rejected_publish] => :failed_publish
|
|
|
|
end
|
|
|
|
|
2012-05-28 18:47:53 +01:00
|
|
|
event :publish do
|
2012-05-30 13:42:30 +01:00
|
|
|
transition [:success, :failed_publish] => :build_publish, :if => lambda { |build_list|
|
2012-12-10 18:04:33 +00:00
|
|
|
!build_list.new_core? && BuildServer.publish_container(build_list.bs_id) == BuildServer::SUCCESS
|
|
|
|
}
|
|
|
|
transition [:success, :failed_publish] => :build_publish, :if => lambda { |build_list|
|
|
|
|
build_list.new_core?
|
2012-05-30 13:42:30 +01:00
|
|
|
}
|
2012-05-31 15:35:37 +01:00
|
|
|
transition [:success, :failed_publish] => :failed_publish
|
2012-05-28 18:47:53 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
event :reject_publish do
|
2012-05-29 18:28:11 +01:00
|
|
|
transition :success => :rejected_publish, :if => :can_reject_publish?
|
2012-05-28 18:47:53 +01:00
|
|
|
end
|
|
|
|
|
2012-06-14 14:36:40 +01:00
|
|
|
event :build_success do
|
2012-06-13 18:24:50 +01:00
|
|
|
transition [:build_started, :build_canceled] => :success
|
|
|
|
end
|
|
|
|
|
2012-06-14 14:36:40 +01:00
|
|
|
event :build_error do
|
2012-12-06 16:28:44 +00:00
|
|
|
transition [:build_started, :build_canceled, :build_canceling] => :build_error
|
2012-06-13 18:24:50 +01:00
|
|
|
end
|
|
|
|
|
2012-05-28 18:47:53 +01:00
|
|
|
HUMAN_STATUSES.each do |code,name|
|
|
|
|
state name, :value => code
|
|
|
|
end
|
2012-06-18 17:19:09 +01:00
|
|
|
end
|
2012-05-28 18:47:53 +01:00
|
|
|
|
2012-06-20 00:20:25 +01:00
|
|
|
later :publish, :queue => :clone_build
|
2012-06-19 16:45:38 +01:00
|
|
|
|
2012-06-18 17:19:09 +01:00
|
|
|
def set_version_and_tag
|
|
|
|
pkg = self.packages.where(:package_type => 'source', :project_id => self.project_id).first
|
2012-06-27 15:57:30 +01:00
|
|
|
# TODO: remove 'return' after deployment ABF kernel 2.0
|
2012-10-11 11:55:06 +01:00
|
|
|
return if pkg.nil? # For old client that does not sends data about packages
|
2012-06-18 17:19:09 +01:00
|
|
|
self.package_version = "#{pkg.platform.name}-#{pkg.version}-#{pkg.release}"
|
2012-07-17 09:02:56 +01:00
|
|
|
system("cd #{self.project.repo.path} && git tag #{self.package_version} #{self.commit_hash}") # TODO REDO through grit
|
2012-06-18 17:19:09 +01:00
|
|
|
save
|
2012-05-28 18:47:53 +01:00
|
|
|
end
|
|
|
|
|
2012-08-24 16:19:26 +01:00
|
|
|
def actualize_packages
|
|
|
|
ActiveRecord::Base.transaction do
|
2012-12-03 17:43:24 +00:00
|
|
|
# packages from previous build_list
|
2012-12-04 09:59:16 +00:00
|
|
|
self.last_published.limit(2).last.packages.update_all :actual => false
|
2012-12-03 17:43:24 +00:00
|
|
|
self.packages.update_all :actual => true
|
2012-08-24 16:19:26 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-05-29 18:28:11 +01:00
|
|
|
#TODO: Share this checking on product owner.
|
|
|
|
def can_cancel?
|
2012-12-06 14:41:24 +00:00
|
|
|
if new_core?
|
|
|
|
build_started? || build_pending?
|
|
|
|
else
|
|
|
|
[BUILD_PENDING, BuildServer::PLATFORM_PENDING].include?(status) && bs_id
|
|
|
|
end
|
2012-05-29 18:28:11 +01:00
|
|
|
end
|
|
|
|
|
2012-06-22 11:33:03 +01:00
|
|
|
def can_publish?
|
|
|
|
[BuildServer::SUCCESS, FAILED_PUBLISH].include? status
|
|
|
|
end
|
|
|
|
|
2012-05-29 18:28:11 +01:00
|
|
|
def can_reject_publish?
|
2012-09-07 19:45:03 +01:00
|
|
|
can_publish? and not save_to_repository.publish_without_qa
|
2012-05-29 18:28:11 +01:00
|
|
|
end
|
|
|
|
|
2012-12-06 10:11:51 +00:00
|
|
|
def publish_container
|
|
|
|
type = save_to_platform.distrib_type
|
2012-12-10 18:04:33 +00:00
|
|
|
archive = results.select{ |r| r['file_name'] =~ /.*\.tar\.gz$/}[0]
|
2012-12-11 11:47:32 +00:00
|
|
|
|
2012-12-12 14:06:46 +00:00
|
|
|
platform_path = "#{APP_CONFIG['root_path']}/platforms/#{save_to_platform.name}/repository"
|
2012-12-11 11:47:32 +00:00
|
|
|
if save_to_platform.personal?
|
|
|
|
platform_path << '/'
|
|
|
|
platform_path << build_for_platform.name
|
|
|
|
Dir.mkdir(platform_path) unless File.exists?(platform_path)
|
|
|
|
end
|
|
|
|
|
2012-12-06 10:11:51 +00:00
|
|
|
Resque.push(
|
2012-12-10 18:04:33 +00:00
|
|
|
"publish_build_list_container_#{type}_worker",
|
|
|
|
'class' => "AbfWorker::PublishBuildListContainer#{type.capitalize}Worker",
|
|
|
|
'args' => [{
|
|
|
|
:id => id,
|
|
|
|
:arch => arch.name,
|
|
|
|
:distrib_type => type,
|
|
|
|
:container_sha1 => archive['sha1'],
|
2012-12-11 11:47:32 +00:00
|
|
|
:platform => {
|
|
|
|
:platform_path => platform_path,
|
|
|
|
:released => save_to_platform.released
|
|
|
|
},
|
|
|
|
:repository_name => save_to_repository.name,
|
2012-12-12 12:34:33 +00:00
|
|
|
:time_living => 2400 # 40 min
|
2012-12-10 18:04:33 +00:00
|
|
|
}]
|
2012-12-06 10:11:51 +00:00
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2012-06-01 11:58:17 +01:00
|
|
|
def add_to_queue
|
2012-11-30 10:41:39 +00:00
|
|
|
if new_core?
|
2012-12-06 19:45:35 +00:00
|
|
|
# TODO: Investigate: why 2 tasks will be created without checking @state
|
2012-12-06 14:41:24 +00:00
|
|
|
add_job_to_abf_worker_queue unless @status
|
|
|
|
@status ||= BUILD_PENDING
|
2012-11-29 15:12:24 +00:00
|
|
|
else
|
2012-11-30 13:10:17 +00:00
|
|
|
# XML-RPC params:
|
|
|
|
# - project_name
|
|
|
|
# - project_version
|
|
|
|
# - plname
|
|
|
|
# - arch
|
|
|
|
# - bplname
|
|
|
|
# - update_type
|
|
|
|
# - build_requires
|
|
|
|
# - id_web
|
|
|
|
# - include_repos
|
|
|
|
# - priority
|
|
|
|
# - git_project_address
|
|
|
|
@status ||= BuildServer.add_build_list(
|
|
|
|
project.name,
|
|
|
|
project_version,
|
|
|
|
save_to_platform.name,
|
|
|
|
arch.name,
|
|
|
|
(save_to_platform_id == build_for_platform_id ? '' : build_for_platform.name),
|
|
|
|
update_type,
|
|
|
|
build_requires,
|
|
|
|
id,
|
|
|
|
include_repos,
|
|
|
|
priority,
|
2012-12-14 11:25:10 +00:00
|
|
|
project.git_project_address(user)
|
2012-11-30 13:10:17 +00:00
|
|
|
)
|
2012-11-29 15:12:24 +00:00
|
|
|
end
|
|
|
|
@status
|
2012-06-01 11:58:17 +01:00
|
|
|
end
|
|
|
|
|
2012-12-06 18:04:39 +00:00
|
|
|
def self.has_access_to_new_core?(user)
|
|
|
|
user && (user.admin? || user.tester?)
|
|
|
|
end
|
|
|
|
|
2012-05-11 19:00:27 +01:00
|
|
|
def self.human_status(status)
|
|
|
|
I18n.t("layout.build_lists.statuses.#{HUMAN_STATUSES[status]}")
|
2011-04-07 14:20:21 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def human_status
|
|
|
|
self.class.human_status(status)
|
|
|
|
end
|
|
|
|
|
2012-06-29 19:31:40 +01:00
|
|
|
def self.status_by_human(human)
|
2012-07-04 12:22:26 +01:00
|
|
|
BuildList::HUMAN_STATUSES.key human
|
2012-06-29 19:31:40 +01:00
|
|
|
end
|
|
|
|
|
2011-04-11 11:47:57 +01:00
|
|
|
def set_items(items_hash)
|
|
|
|
self.items = []
|
|
|
|
|
|
|
|
items_hash.each do |level, items|
|
|
|
|
items.each do |item|
|
2011-10-29 15:05:40 +01:00
|
|
|
self.items << self.items.build(:name => item['name'], :version => item['version'], :level => level.to_i)
|
2011-04-11 11:47:57 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2011-12-21 23:31:05 +00:00
|
|
|
|
2012-05-17 22:19:57 +01:00
|
|
|
def set_packages(pkg_hash, project_name)
|
|
|
|
prj = Project.joins(:repositories => :platform).where('platforms.id = ?', save_to_platform.id).find_by_name!(project_name)
|
|
|
|
build_package(pkg_hash['srpm'], 'source', prj) {|p| p.save!}
|
2012-05-14 20:08:31 +01:00
|
|
|
pkg_hash['rpm'].each do |rpm_hash|
|
2012-05-17 22:19:57 +01:00
|
|
|
build_package(rpm_hash, 'binary', prj) {|p| p.save!}
|
2012-05-14 20:08:31 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2011-10-29 15:50:22 +01:00
|
|
|
def event_log_message
|
2011-11-28 15:41:42 +00:00
|
|
|
{:project => project.name, :version => project_version, :arch => arch.name}.inspect
|
2011-10-29 15:50:22 +01:00
|
|
|
end
|
|
|
|
|
2012-04-12 15:55:32 +01:00
|
|
|
def current_duration
|
2012-04-13 21:49:29 +01:00
|
|
|
(Time.now.utc - started_at.utc).to_i
|
2012-04-12 15:55:32 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def human_current_duration
|
2012-04-13 22:20:56 +01:00
|
|
|
I18n.t("layout.build_lists.human_current_duration", {:hours => (current_duration/3600).to_i, :minutes => (current_duration%3600/60).to_i})
|
2012-04-12 15:55:32 +01:00
|
|
|
end
|
|
|
|
|
2012-04-12 11:29:04 +01:00
|
|
|
def human_duration
|
2012-04-13 22:20:56 +01:00
|
|
|
I18n.t("layout.build_lists.human_duration", {:hours => (duration/3600).to_i, :minutes => (duration%3600/60).to_i})
|
2012-04-12 11:29:04 +01:00
|
|
|
end
|
|
|
|
|
2012-08-17 09:23:49 +01:00
|
|
|
def fs_log_path(log_type = :build)
|
|
|
|
container_path? ? "downloads/#{container_path}/log/#{project.name}/#{log_type.to_s}.log" : nil
|
|
|
|
end
|
|
|
|
|
2012-04-13 21:49:29 +01:00
|
|
|
def in_work?
|
2012-10-11 11:55:06 +01:00
|
|
|
status == BuildServer::BUILD_STARTED
|
2012-04-13 21:49:29 +01:00
|
|
|
#[WAITING_FOR_RESPONSE, BuildServer::BUILD_PENDING, BuildServer::BUILD_STARTED].include?(status)
|
2012-04-12 11:29:04 +01:00
|
|
|
end
|
|
|
|
|
2012-10-19 08:32:12 +01:00
|
|
|
def associate_and_create_advisory(params)
|
|
|
|
build_advisory(params){ |a| a.update_type = update_type }
|
|
|
|
advisory.attach_build_list(self)
|
|
|
|
end
|
|
|
|
|
2012-10-19 15:03:09 +01:00
|
|
|
def can_attach_to_advisory?
|
2012-10-19 08:32:12 +01:00
|
|
|
!save_to_repository.publish_without_qa &&
|
2012-10-19 15:03:09 +01:00
|
|
|
save_to_platform.main? &&
|
2012-10-19 08:32:12 +01:00
|
|
|
save_to_platform.released &&
|
2012-11-30 13:10:17 +00:00
|
|
|
build_published?
|
2012-10-18 15:17:50 +01:00
|
|
|
end
|
|
|
|
|
2012-11-29 17:56:03 +00:00
|
|
|
def log(load_lines)
|
2012-11-30 10:41:39 +00:00
|
|
|
if new_core?
|
2012-12-06 14:41:24 +00:00
|
|
|
abf_worker_log
|
2012-11-30 10:41:39 +00:00
|
|
|
else
|
2012-11-29 19:42:54 +00:00
|
|
|
log = `tail -n #{load_lines.to_i} #{Rails.root + 'public' + fs_log_path}`
|
2012-12-06 14:41:24 +00:00
|
|
|
$?.success? ? log : I18n.t('layout.build_lists.log.not_available')
|
2012-11-29 19:42:54 +00:00
|
|
|
end
|
2012-10-18 15:17:50 +01:00
|
|
|
end
|
|
|
|
|
2012-05-14 20:08:31 +01:00
|
|
|
protected
|
2011-04-11 17:37:09 +01:00
|
|
|
|
2012-12-06 14:41:24 +00:00
|
|
|
def abf_worker_args
|
|
|
|
include_repos_hash = {}.tap do |h|
|
|
|
|
include_repos.each do |r|
|
|
|
|
repo = Repository.find r
|
|
|
|
path = repo.platform.public_downloads_url(nil, arch.name, repo.name)
|
|
|
|
# path = path.gsub(/^http:\/\/0\.0\.0\.0\:3000/, 'https://abf.rosalinux.ru')
|
|
|
|
# Path looks like:
|
|
|
|
# http://abf.rosalinux.ru/downloads/rosa-server2012/repository/x86_64/base/
|
|
|
|
# so, we should append:
|
|
|
|
# /release
|
|
|
|
# /updates
|
|
|
|
h["#{repo.name}_release"] = path + 'release'
|
|
|
|
h["#{repo.name}_updates"] = path + 'updates'
|
|
|
|
end
|
|
|
|
end
|
2012-12-13 12:24:29 +00:00
|
|
|
if save_to_platform.personal?
|
|
|
|
include_repos_hash["#{save_to_platform.name}_release"] = save_to_platform.
|
2012-12-13 12:30:37 +00:00
|
|
|
urpmi_list(nil, nil, false, save_to_repository.name)["#{build_for_platform.name}"]["#{arch.name}"]
|
2012-12-13 12:24:29 +00:00
|
|
|
end
|
2012-12-06 14:41:24 +00:00
|
|
|
# mdv example:
|
|
|
|
# https://abf.rosalinux.ru/import/plasma-applet-stackfolder.git
|
|
|
|
# bfe6d68cc607238011a6108014bdcfe86c69456a
|
|
|
|
|
|
|
|
# rhel example:
|
|
|
|
# https://abf.rosalinux.ru/server/gnome-settings-daemon.git
|
|
|
|
# fbb2549e44d97226fea6748a4f95d1d82ffb8726
|
|
|
|
|
|
|
|
{
|
|
|
|
:id => id,
|
|
|
|
:arch => arch.name,
|
2012-12-06 19:57:20 +00:00
|
|
|
:time_living => 43200, # 12 hours
|
2012-12-06 14:41:24 +00:00
|
|
|
:distrib_type => build_for_platform.distrib_type,
|
|
|
|
# :git_project_address => 'https://abf.rosalinux.ru/server/gnome-settings-daemon.git',
|
2012-12-14 11:25:10 +00:00
|
|
|
:git_project_address => project.git_project_address(user),
|
2012-12-06 14:41:24 +00:00
|
|
|
# :commit_hash => 'fbb2549e44d97226fea6748a4f95d1d82ffb8726',
|
|
|
|
:commit_hash => commit_hash,
|
|
|
|
:build_requires => build_requires,
|
|
|
|
:include_repos => include_repos_hash,
|
2012-12-06 16:00:24 +00:00
|
|
|
:bplname => build_for_platform.name,
|
|
|
|
:user => {:uname => user.uname, :email => user.email}
|
2012-12-06 14:41:24 +00:00
|
|
|
}
|
|
|
|
end
|
|
|
|
|
2012-09-19 14:55:17 +01:00
|
|
|
def notify_users
|
|
|
|
unless mass_build_id
|
|
|
|
users = []
|
|
|
|
if project # find associated users
|
|
|
|
users = project.all_members.
|
|
|
|
select{ |user| user.notifier.can_notify? && user.notifier.new_associated_build? }
|
|
|
|
end
|
|
|
|
if user.notifier.can_notify? && user.notifier.new_build?
|
|
|
|
users = users | [user]
|
|
|
|
end
|
|
|
|
users.each do |user|
|
|
|
|
UserMailer.build_list_notification(self, user).deliver
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end # notify_users
|
|
|
|
|
2012-05-23 11:52:23 +01:00
|
|
|
def delete_container
|
|
|
|
if can_cancel?
|
|
|
|
BuildServer.delete_build_list bs_id
|
|
|
|
else
|
|
|
|
BuildServer.delete_container bs_id if bs_id # prevent error if bs_id does not set
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2012-05-17 22:19:57 +01:00
|
|
|
def build_package(pkg_hash, package_type, prj)
|
2012-05-14 20:08:31 +01:00
|
|
|
packages.create(pkg_hash) do |p|
|
2012-05-17 22:19:57 +01:00
|
|
|
p.project = prj
|
2012-05-14 20:08:31 +01:00
|
|
|
p.platform = save_to_platform
|
|
|
|
p.package_type = package_type
|
|
|
|
yield p
|
|
|
|
end
|
|
|
|
end
|
2012-12-03 17:43:24 +00:00
|
|
|
|
|
|
|
def last_published
|
|
|
|
BuildList.where(:project_id => self.project_id,
|
|
|
|
:save_to_repository_id => self.save_to_repository_id)
|
|
|
|
.for_platform(self.build_for_platform_id)
|
|
|
|
.scoped_to_arch(self.arch_id)
|
|
|
|
.for_status(BUILD_PUBLISHED)
|
2012-12-04 09:59:16 +00:00
|
|
|
.recent
|
2012-12-03 17:43:24 +00:00
|
|
|
end
|
2011-11-28 15:41:42 +00:00
|
|
|
end
|