rosa-build/app/models/build_list.rb

693 lines
24 KiB
Ruby
Raw Permalink Normal View History

2011-04-07 14:20:21 +01:00
class BuildList < ActiveRecord::Base
include CommitAndVersion
include FileStoreClean
include AbfWorkerMethods
include BuildListObserver
include EventLoggable
2015-02-10 22:08:39 +00:00
include ExternalNodable
2012-11-06 14:13:16 +00:00
self.per_page = 25
2011-04-07 14:20:21 +01:00
belongs_to :project
belongs_to :arch
2014-01-21 04:51:49 +00:00
belongs_to :save_to_platform, class_name: 'Platform'
belongs_to :save_to_repository, class_name: 'Repository'
belongs_to :build_for_platform, class_name: 'Platform'
belongs_to :user
2014-01-21 04:51:49 +00:00
belongs_to :builder, class_name: 'User'
belongs_to :publisher, class_name: 'User'
2014-07-09 21:24:41 +01:00
belongs_to :mass_build, counter_cache: true
2014-01-21 04:51:49 +00:00
has_many :items, class_name: '::BuildList::Item', dependent: :destroy
has_many :packages, class_name: '::BuildList::Package', dependent: :destroy
has_many :source_packages, -> { where(package_type: 'source') }, class_name: '::BuildList::Package'
2012-05-04 18:12:51 +01:00
EXTRA_PARAMS = %w[cfg_options cfg_urpm_options build_src_rpm build_rpm]
2012-05-04 18:12:51 +01:00
AUTO_PUBLISH_STATUSES = [
AUTO_PUBLISH_STATUS_NONE = 'none',
AUTO_PUBLISH_STATUS_DEFAULT = 'default',
AUTO_PUBLISH_STATUS_TESTING = 'testing'
]
2014-11-25 17:33:54 +00:00
validates :project, :project_id,
2014-04-07 20:00:42 +01:00
:project_version,
2014-11-25 17:33:54 +00:00
:arch, :arch_id,
2014-04-07 20:00:42 +01:00
:include_repos,
2014-11-25 17:33:54 +00:00
:build_for_platform, :build_for_platform_id,
:save_to_platform, :save_to_platform_id,
:save_to_repository, :save_to_repository_id,
2014-04-07 20:00:42 +01:00
presence: true
2014-01-21 04:51:49 +00:00
validates_numericality_of :priority, greater_than_or_equal_to: 0
validates :auto_publish_status, inclusion: { in: AUTO_PUBLISH_STATUSES }
validate -> {
if save_to_platform.try(:main?) && save_to_platform_id != build_for_platform_id
errors.add(:build_for_platform, I18n.t('flash.build_list.wrong_platform'))
end
}
validate -> {
unless build_for_platform.try :main?
errors.add(:build_for_platform, I18n.t('flash.build_list.wrong_build_for_platform'))
end
}
validate -> {
if save_to_repository.try(:platform_id) != save_to_platform.try(:id)
errors.add(:save_to_repository, I18n.t('flash.build_list.wrong_repository'))
end
}
validate -> {
if build_for_platform && build_for_platform.repositories.where(id: include_repos).count != include_repos.try(:size)
errors.add(:save_to_repository, I18n.t('flash.build_list.wrong_include_repos'))
end
}
validate -> {
unless save_to_repository && save_to_repository.projects.exists?(project_id)
errors.add(:save_to_repository, I18n.t('flash.build_list.wrong_project'))
end
}
before_validation -> {
2015-03-27 10:24:36 +00:00
self.include_repos = ([] << include_repos).flatten.uniq if include_repos.present?
}, on: :create
2014-01-21 04:51:49 +00:00
before_validation :prepare_extra_repositories, on: :create
before_validation :prepare_extra_build_lists, on: :create
before_validation :prepare_extra_params, on: :create
before_validation :prepare_auto_publish_status, on: :create
2013-11-01 17:11:59 +00:00
LIVE_TIME = 4.week # for unpublished
MAX_LIVE_TIME = 3.month # for published
STATUSES, HUMAN_STATUSES = [], {}
[
%w(SUCCESS 0),
# %w(ERROR 1),
# %w(PROJECT_SOURCE_ERROR 6),
# %w(DEPENDENCIES_ERROR 555),
%w(BUILD_ERROR 666),
%w(PACKAGES_FAIL 777),
2013-11-01 17:11:59 +00:00
%w(BUILD_STARTED 3000),
%w(BUILD_CANCELED 5000),
%w(WAITING_FOR_RESPONSE 4000),
%w(BUILD_PENDING 2000),
2014-05-21 23:58:13 +01:00
%w(RERUN_TESTS 2500),
2014-05-22 00:17:29 +01:00
%w(RERUNNING_TESTS 2550),
2013-11-01 17:11:59 +00:00
%w(BUILD_PUBLISHED 6000),
%w(BUILD_PUBLISH 7000),
%w(FAILED_PUBLISH 8000),
%w(REJECTED_PUBLISH 9000),
%w(BUILD_CANCELING 10000),
%w(TESTS_FAILED 11000),
%w(BUILD_PUBLISHED_INTO_TESTING 12000),
%w(BUILD_PUBLISH_INTO_TESTING 13000),
%w(FAILED_PUBLISH_INTO_TESTING 14000),
%w(UNPERMITTED_ARCH 15000)
2013-11-01 17:11:59 +00:00
].each do |kind, value|
value = value.to_i
const_set kind, value
STATUSES << value
HUMAN_STATUSES[value] = kind.downcase.to_sym
end
STATUSES.freeze
HUMAN_STATUSES.freeze
2011-04-07 14:20:21 +01:00
scope :recent, -> { order(updated_at: :desc) }
2015-03-19 23:31:41 +00:00
scope :for_extra_build_lists, ->(ids, save_to_platform) {
2015-04-07 20:43:40 +01:00
s = where(id: ids, container_status: BuildList::BUILD_PUBLISHED)
2014-01-21 04:51:49 +00:00
s = s.where(save_to_platform_id: save_to_platform.id) if save_to_platform && save_to_platform.main?
s
}
scope :for_status, ->(status) { where(status: status) if status.present? }
scope :for_user, ->(user) { where(user_id: user.id) }
scope :not_owned_external_nodes, -> { where("#{table_name}.external_nodes is null OR #{table_name}.external_nodes != ?", :owned) }
scope :external_nodes, ->(type) { where("#{table_name}.external_nodes = ?", type) }
scope :oldest, -> { where("#{table_name}.updated_at < ?", Time.zone.now - 15.seconds) }
scope :for_platform, ->(platform) { where(build_for_platform_id: platform) if platform.present? }
scope :by_mass_build, ->(mass_build) { where(mass_build_id: mass_build) }
scope :scoped_to_arch, ->(arch) { where(arch_id: arch) if arch.present? }
2014-12-09 15:33:27 +00:00
scope :scoped_to_save_platform, ->(pl_id) { where(save_to_platform_id: pl_id) if pl_id.present? }
scope :scoped_to_build_for_platform, ->(pl_id) { where(build_for_platform_id: pl_id) if pl_id.present? }
scope :scoped_to_save_to_repository, ->(repo_id) { where(save_to_repository_id: repo_id) if repo_id.present? }
scope :scoped_to_project_version, ->(pr_version) { where(project_version: pr_version) if pr_version.present? }
scope :scoped_to_is_circle, ->(is_circle) { where(is_circle: is_circle) }
scope :for_creation_date_period, ->(start_date, end_date) {
2014-03-14 21:55:28 +00:00
s = all
2013-02-28 15:27:50 +00:00
s = s.where(["#{table_name}.created_at >= ?", start_date]) if start_date
s = s.where(["#{table_name}.created_at <= ?", end_date]) if end_date
2012-04-13 23:27:24 +01:00
s
2011-04-07 14:20:21 +01:00
}
scope :for_notified_date_period, ->(start_date, end_date) {
2014-03-14 21:55:28 +00:00
s = all
s = s.where("#{table_name}.updated_at >= ?", start_date) if start_date.present?
s = s.where("#{table_name}.updated_at <= ?", end_date) if end_date.present?
2012-04-13 23:27:24 +01:00
s
2011-04-07 14:20:21 +01:00
}
scope :scoped_to_project_name, ->(project_name) {
joins(:project).where('projects.name LIKE ?', "%#{project_name}%") if project_name.present?
}
scope :scoped_to_new_core, ->(new_core) { where(new_core: new_core) }
scope :outdated, -> (now = Time.now) {
where(<<-SQL, now - LIVE_TIME, [BUILD_PUBLISHED,BUILD_PUBLISHED_INTO_TESTING], now - MAX_LIVE_TIME)
(
#{table_name}.created_at < ? AND
#{table_name}.status NOT IN (?) AND
#{table_name}.mass_build_id IS NULL
) OR (
#{table_name}.created_at < ?
)
SQL
}
scope :published_container, -> { where(container_status: BUILD_PUBLISHED) }
2011-04-11 11:47:57 +01:00
serialize :additional_repos
serialize :include_repos
serialize :results, Array
serialize :extra_repositories, Array
serialize :extra_build_lists, Array
serialize :extra_params, Hash
2016-02-24 04:59:40 +00:00
after_commit :place_build, on: :create
after_destroy :remove_container
2011-04-11 11:47:57 +01:00
2014-01-21 04:51:49 +00:00
state_machine :status, initial: :waiting_for_response do
2014-01-21 04:51:49 +00:00
after_transition on: :published,
2014-07-09 21:24:41 +01:00
do: %i(set_version_and_tag actualize_packages)
2014-01-21 04:51:49 +00:00
after_transition on: :publish, do: :set_publisher
after_transition(on: :publish) do |build_list, transition|
2014-01-09 22:56:11 +00:00
if transition.from == BUILD_PUBLISHED_INTO_TESTING
build_list.cleanup_packages_from_testing
end
end
2014-01-21 04:51:49 +00:00
after_transition on: :cancel, do: :cancel_job
after_transition on: %i(published fail_publish build_error tests_failed unpermitted_arch), do: :notify_users
2014-01-21 04:51:49 +00:00
after_transition on: :build_success, do: :notify_users,
unless: ->(build_list) { build_list.auto_publish? || build_list.auto_publish_into_testing? }
2012-06-01 11:58:17 +01:00
event :place_build do
2014-01-21 04:51:49 +00:00
transition waiting_for_response: :build_pending
2012-06-01 11:58:17 +01:00
end
event :unpermitted_arch do
2014-07-24 20:02:08 +01:00
transition [:build_started, :build_canceling, :build_canceled] => :unpermitted_arch
end
2014-05-21 23:58:13 +01:00
event :rerun_tests do
transition %i(success tests_failed) => :rerun_tests
end
event :start_build do
2014-01-21 04:51:49 +00:00
transition build_pending: :build_started
2014-05-22 00:17:29 +01:00
transition rerun_tests: :rerunning_tests
end
event :cancel do
2013-01-24 06:33:16 +00:00
transition [:build_pending, :build_started] => :build_canceling
2014-05-22 00:17:29 +01:00
transition [:rerun_tests, :rerunning_tests] => :tests_failed
end
2014-01-21 04:51:49 +00:00
# build_canceling: :build_canceled - canceling from UI
# build_started: :build_canceled - canceling from worker by time-out (time_living has been expired)
event :build_canceled do
2014-02-21 19:07:27 +00:00
transition [:build_canceling, :build_started, :build_pending] => :build_canceled
2014-05-22 00:17:29 +01:00
transition [:rerun_tests, :rerunning_tests] => :tests_failed
end
event :published do
transition [:build_publish, :rejected_publish] => :build_published
end
event :fail_publish do
transition [:build_publish, :rejected_publish] => :failed_publish
end
event :publish do
2013-11-01 17:11:59 +00:00
transition [
:success,
:failed_publish,
:build_published,
:tests_failed,
:failed_publish_into_testing,
:build_published_into_testing
] => :build_publish
transition [:success, :failed_publish, :failed_publish_into_testing] => :failed_publish
end
event :reject_publish do
2013-11-01 17:11:59 +00:00
transition [
:success,
:failed_publish,
:tests_failed,
:failed_publish_into_testing,
:build_published_into_testing
] => :rejected_publish
end
# ===== into testing - start
event :published_into_testing do
transition [:build_publish_into_testing, :rejected_publish] => :build_published_into_testing
end
2013-11-01 17:11:59 +00:00
event :fail_publish_into_testing do
transition [:build_publish_into_testing, :rejected_publish] => :failed_publish_into_testing
end
event :publish_into_testing do
transition [
:success,
:failed_publish,
:tests_failed,
:failed_publish_into_testing,
:build_published_into_testing
] => :build_publish_into_testing
transition [:success, :failed_publish, :failed_publish_into_testing] => :failed_publish_into_testing
end
2013-11-01 17:11:59 +00:00
# ===== into testing - end
event :build_success do
transition [:build_pending, :build_started, :build_canceling, :build_canceled, :rerunning_tests] => :success
end
[:build_error, :tests_failed].each do |kind|
event kind do
transition [:build_started, :build_canceling, :build_canceled, :build_pending] => kind
2014-05-22 00:17:29 +01:00
transition rerunning_tests: :tests_failed
end
end
HUMAN_STATUSES.each do |code,name|
2014-01-21 04:51:49 +00:00
state name, value: code
end
2012-06-18 17:19:09 +01:00
end
HUMAN_CONTAINER_STATUSES = { WAITING_FOR_RESPONSE => :waiting_for_publish,
BUILD_PUBLISHED => :container_published,
BUILD_PUBLISH => :container_publish,
FAILED_PUBLISH => :container_failed_publish
2013-04-04 12:27:51 +01:00
}.freeze
2014-01-21 04:51:49 +00:00
state_machine :container_status, initial: :waiting_for_publish do
2014-01-21 04:51:49 +00:00
after_transition on: :publish_container, do: :create_container
after_transition on: [:fail_publish_container, :destroy_container],
do: :remove_container
event :publish_container do
2013-02-06 13:21:47 +00:00
transition [:waiting_for_publish, :container_failed_publish] => :container_publish,
2014-01-21 04:51:49 +00:00
if: :can_create_container?
end
event :published_container do
2014-01-21 04:51:49 +00:00
transition container_publish: :container_published
end
event :fail_publish_container do
2014-01-21 04:51:49 +00:00
transition container_publish: :container_failed_publish
end
event :destroy_container do
2013-01-29 13:17:35 +00:00
transition [:container_failed_publish, :container_published, :waiting_for_publish] => :waiting_for_publish
end
HUMAN_CONTAINER_STATUSES.each do |code,name|
2014-01-21 04:51:49 +00:00
state name, value: code
end
end
2012-06-18 17:19:09 +01:00
def set_version_and_tag
2016-03-20 13:36:03 +00:00
#TODO FIX THIS
#pkg = self.packages.where(package_type: 'source', project_id: self.project_id).first
# TODO: remove 'return' after deployment ABF kernel 2.0
2016-03-20 13:36:03 +00:00
#return if pkg.nil? # For old client that does not sends data about packages
#self.package_version = "#{pkg.platform.name}-#{pkg.version}-#{pkg.release}"
#system("cd #{self.project.repo.path} && git tag #{self.package_version} #{self.commit_hash}") # TODO REDO through grit
#save
end
def actualize_packages
ActiveRecord::Base.transaction do
2012-12-03 17:43:24 +00:00
# packages from previous build_list
2014-01-21 04:51:49 +00:00
self.last_published.limit(2).last.packages.update_all actual: false
self.packages.update_all actual: true
end
end
def can_create_container?
2013-11-01 17:11:59 +00:00
[SUCCESS, BUILD_PUBLISH, FAILED_PUBLISH, BUILD_PUBLISHED, TESTS_FAILED, BUILD_PUBLISHED_INTO_TESTING, FAILED_PUBLISH_INTO_TESTING].include?(status) && [WAITING_FOR_RESPONSE, FAILED_PUBLISH].include?(container_status)
end
def can_publish_into_platform?
return true unless save_to_platform.project_list_active
if save_to_platform.project_list_type == Platform::PROJECT_LIST_TYPE_BLACKLIST
return false if save_to_platform.project_list.split("\n").include?(project.name)
else
return false unless save_to_platform.project_list.split("\n").include?(project.name)
end
return true
end
def can_publish_into_repository?
return true if !save_to_repository.synchronizing_publications? || save_to_platform.personal? || project.architecture_dependent?
arch_ids = save_to_platform.platform_arch_settings.by_default.pluck(:arch_id)
BuildList.where(
2014-01-21 04:51:49 +00:00
project_id: project_id,
save_to_repository_id: save_to_repository_id,
arch_id: arch_ids,
commit_hash: commit_hash,
status: [
SUCCESS,
BUILD_PUBLISHED,
BUILD_PUBLISH,
FAILED_PUBLISH,
TESTS_FAILED,
BUILD_PUBLISHED_INTO_TESTING,
BUILD_PUBLISH_INTO_TESTING,
FAILED_PUBLISH_INTO_TESTING
]
).group(:arch_id).count == arch_ids.size
end
#TODO: Share this checking on product owner.
def can_cancel?
2013-01-24 06:33:16 +00:00
build_started? || build_pending?
end
def auto_publish?
auto_publish_status == AUTO_PUBLISH_STATUS_DEFAULT
end
def auto_publish_into_testing?
auto_publish_status == AUTO_PUBLISH_STATUS_TESTING
end
# TODO: remove later
def auto_publish=(value)
self.auto_publish_status = value.present? ? AUTO_PUBLISH_STATUS_DEFAULT : AUTO_PUBLISH_STATUS_NONE
end
def can_auto_publish?
2016-03-21 14:22:43 +00:00
auto_publish? && can_publish? && can_publish_into_repository?
end
def can_publish?
super &&
can_publish_into_platform? &&
valid_branch_for_publish? &&
extra_build_lists_published? &&
save_to_repository.projects.exists?(id: project_id)
end
def can_publish_into_testing?
super && valid_branch_for_publish?
end
def extra_build_lists_published?
# All extra build lists should be published before publishing this build list for main platforms!
return true unless save_to_platform.main?
2014-01-21 04:51:49 +00:00
BuildList.where(id: extra_build_lists).where('status != ?', BUILD_PUBLISHED).count == 0
end
def human_average_build_time
2014-01-21 04:51:49 +00:00
I18n.t('layout.project_statistics.human_average_build_time', {hours: (average_build_time/3600).to_i, minutes: (average_build_time%3600/60).to_i})
end
def formatted_average_build_time
"%02d:%02d" % [average_build_time / 3600, average_build_time % 3600 / 60]
end
def average_build_time
return 0 unless project
@average_build_time ||= project.project_statistics.
find{ |ps| ps.arch_id == arch_id }.try(:average_build_time) || 0
2012-06-01 11:58:17 +01:00
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)
2013-01-24 11:32:00 +00:00
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|
2014-01-21 04:51:49 +00: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
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!}
pkg_hash['rpm'].each do |rpm_hash|
build_package(rpm_hash, 'binary', prj) {|p| p.save!}
end
end
def event_log_message
2014-01-21 04:51:49 +00:00
{project: project.name, version: project_version, arch: arch.name}.inspect
end
def current_duration
if started_at
(Time.now.utc - started_at.utc).to_i
else
0
end
end
def human_current_duration
2014-01-21 04:51:49 +00:00
I18n.t("layout.build_lists.human_current_duration", {hours: (current_duration/3600).to_i, minutes: (current_duration%3600/60).to_i})
end
2012-04-12 11:29:04 +01:00
def human_duration
2014-01-21 04:51:49 +00:00
I18n.t("layout.build_lists.human_duration", {hours: (duration.to_i/3600).to_i, minutes: (duration.to_i%3600/60).to_i})
2012-04-12 11:29:04 +01:00
end
2012-04-13 21:49:29 +01:00
def in_work?
2013-01-24 11:32:00 +00:00
status == BUILD_STARTED
#[WAITING_FOR_RESPONSE, BUILD_PENDING, BUILD_STARTED].include?(status)
2012-04-12 11:29:04 +01:00
end
def log(load_lines=nil)
2016-03-20 09:24:23 +00:00
worker_log = abf_worker_log
Pygments.highlight(worker_log, lexer: 'sh') rescue worker_log
end
def last_published(testing = false)
2014-01-21 04:51:49 +00:00
BuildList.where(project_id: self.project_id,
save_to_repository_id: self.save_to_repository_id)
2013-01-12 01:36:00 +00:00
.for_platform(self.build_for_platform_id)
.scoped_to_arch(self.arch_id)
.for_status(testing ? BUILD_PUBLISHED_INTO_TESTING : BUILD_PUBLISHED)
2013-01-12 01:36:00 +00:00
.recent
end
def sha1_of_file_store_files
packages.pluck(:sha1).compact | (results || []).map{ |r| r['sha1'] }.compact
end
def abf_worker_args
2013-02-14 12:50:13 +00:00
repos = include_repos
include_repos_hash = {}.tap do |h|
2014-01-21 04:51:49 +00:00
Repository.where(id: (repos | (extra_repositories || [])) ).each do |repo|
path, prefix = repo.platform.public_downloads_url(
repo.platform.main? ? nil : build_for_platform.name,
arch.name,
repo.name
), "#{repo.platform.name}_#{repo.name}_"
h["#{prefix}release"] = insert_token_to_path(path + 'release', repo.platform)
h["#{prefix}updates"] = insert_token_to_path(path + 'updates', repo.platform) if repo.platform.main?
h["#{prefix}testing"] = insert_token_to_path(path + 'testing', repo.platform) if include_testing_subrepository?
2020-05-07 12:01:54 +01:00
if enable_32bit? && (arch.name == 'x86_64' || arch.name == 'znver1')
path, prefix = repo.platform.public_downloads_url(
repo.platform.main? ? nil : build_for_platform.name,
'i686',
repo.name
), "#{repo.platform.name}_#{repo.name}32_"
h["#{prefix}release"] = insert_token_to_path(path + 'release', repo.platform)
h["#{prefix}updates"] = insert_token_to_path(path + 'updates', repo.platform) if repo.platform.main?
h["#{prefix}testing"] = insert_token_to_path(path + 'testing', repo.platform) if include_testing_subrepository?
end
end
end
host = EventLog.current_controller.request.host_with_port rescue ::Rosa::Application.config.action_mailer.default_url_options[:host]
2014-01-21 04:51:49 +00:00
BuildList.where(id: extra_build_lists).each do |bl|
path = "#{APP_CONFIG['downloads_url']}/#{bl.save_to_platform.name}/container/"
path << "#{bl.id}/#{bl.arch.name}/#{bl.save_to_repository.name}/release"
include_repos_hash["container_#{bl.id}"] = insert_token_to_path(path, bl.save_to_platform)
end
2015-12-29 19:22:17 +00:00
git_project_address = project.git_project_address
2014-04-08 22:07:50 +01:00
2013-09-20 19:43:03 +01:00
cmd_params = {
2015-12-29 19:22:17 +00:00
'PACKAGE' => project.name,
'GIT_REPO' => git_project_address,
'PROJECT_VERSION' => project_version,
'USE_EXTRA_TESTS' => use_extra_tests?,
2014-09-24 21:44:32 +01:00
'SAVE_BUILDROOT' => save_buildroot?,
2013-09-20 19:43:03 +01:00
'EXTRA_CFG_OPTIONS' => extra_params['cfg_options'],
'EXTRA_CFG_URPM_OPTIONS' => extra_params['cfg_urpm_options'],
2013-09-20 19:43:03 +01:00
'EXTRA_BUILD_SRC_RPM_OPTIONS' => extra_params['build_src_rpm'],
'EXTRA_BUILD_RPM_OPTIONS' => extra_params['build_rpm'],
'PLATFORM_NAME' => build_for_platform.name,
'FILE_STORE_ADDR' => APP_CONFIG['file_store_url']
2014-04-08 22:07:50 +01:00
}
2014-05-21 23:58:13 +01:00
cmd_params.merge!(
'RERUN_TESTS' => true,
'PACKAGES' => packages.pluck(:sha1).compact * ' '
) if rerun_tests?
2014-04-08 22:07:50 +01:00
if use_cached_chroot?
sha1 = build_for_platform.cached_chroot(arch.name)
cmd_params.merge!('CACHED_CHROOT_SHA1' => sha1) if sha1.present?
cmd_params.merge!('MOCK_CACHE' => 'True')
2014-04-08 22:07:50 +01:00
end
2015-12-29 19:22:17 +00:00
#cmd_params = cmd_params.map{ |k, v| "#{k}='#{v}'" }.join(' ')
2013-09-20 19:43:03 +01:00
{
2014-01-21 04:51:49 +00:00
id: id,
time_living: (build_for_platform.platform_arch_settings.by_arch(arch).first.try(:time_living) || PlatformArchSetting::DEFAULT_TIME_LIVING),
distrib_type: build_for_platform.distrib_type,
cmd_params: cmd_params,
include_repos: include_repos_hash,
platform: {
type: build_for_platform.distrib_type,
name: build_for_platform.name,
arch: arch.name
},
2014-05-27 21:59:54 +01:00
rerun_tests: rerun_tests?,
user: { uname: user.uname, email: user.email }
}
end
2014-01-09 22:56:11 +00:00
def cleanup_packages_from_testing
2014-06-19 20:35:53 +01:00
AbfWorkerService::Base.cleanup_packages_from_testing(
2014-01-09 22:56:11 +00:00
build_for_platform_id,
save_to_repository_id,
id
)
end
def valid_branch_for_publish?
@valid_branch_for_publish ||= begin
save_to_platform.personal? ||
save_to_repository.publish_builds_only_from_branch.blank? ||
2016-03-20 12:50:58 +00:00
( project_version == save_to_repository.publish_builds_only_from_branch )
# TODO: Check branch name for commit hash if all else fails
end
end
protected
def create_container
2016-05-28 19:21:02 +01:00
BuildLists::CreateContainerJob.perform_async(id)
end
def remove_container
2014-06-19 20:35:53 +01:00
AbfWorkerService::Container.new(self).destroy! if save_to_platform
end
2012-12-28 14:00:37 +00:00
def abf_worker_priority
mass_build_id ? '' : 'default'
end
def abf_worker_base_queue
'rpm_worker'
end
def insert_token_to_path(path, platform)
if platform.hidden?
path.gsub(/^http:\/\//, "http://#{user.authentication_token}:@")
else
path
end
end
def notify_users
2016-05-28 19:21:02 +01:00
#unless mass_build_id
# users = [user, publisher].compact.uniq.select{ |u| u.notifier.can_notify? && u.notifier.new_build? }
2013-08-28 16:20:18 +01:00
2016-05-28 19:21:02 +01:00
# users |= project.all_members(:notifier).select do |u|
# u.notifier.can_notify? && u.notifier.new_associated_build?
# end if project
# users.each{ |u| UserMailer.build_list_notification(self, u).deliver }
#end
end # notify_users
def build_package(pkg_hash, package_type, prj)
packages.create(pkg_hash) do |p|
p.project = prj
p.platform = save_to_platform
p.package_type = package_type
yield p
end
end
2013-02-04 11:43:42 +00:00
2013-03-28 11:58:26 +00:00
def set_publisher
self.publisher ||= user
save
end
2013-02-21 14:46:52 +00:00
def prepare_extra_repositories
if save_to_platform && save_to_platform.main?
self.extra_repositories = nil
else
2015-04-07 21:44:39 +01:00
self.extra_repositories = PlatformPolicy::Scope.new(user, Repository.joins(:platform)).show.
2014-01-21 04:51:49 +00:00
where(id: extra_repositories, platforms: {platform_type: 'personal'}).
2015-04-07 21:44:39 +01:00
pluck('repositories.id')
end
end
def prepare_extra_build_lists
if mass_build && mass_build.extra_mass_builds.present?
extra_build_lists << BuildList.where(mass_build_id: mass_build.extra_mass_builds).pluck(:id)
extra_build_lists.flatten!
end
2014-06-16 21:23:17 +01:00
return if extra_build_lists.blank?
2015-03-19 23:31:41 +00:00
bls = BuildListPolicy::Scope.new(user, BuildList).read.
for_extra_build_lists(extra_build_lists, save_to_platform)
if save_to_platform
if save_to_platform.distrib_type == 'rhel'
bls = bls.where('
(build_lists.arch_id = ? AND projects.publish_i686_into_x86_64 is not true) OR
(projects.publish_i686_into_x86_64 is true)
', arch_id).joins(:project)
else
2014-01-21 04:51:49 +00:00
bls = bls.where(arch_id: arch_id)
end
end
self.extra_build_lists = bls.pluck('build_lists.id')
end
def prepare_auto_publish_status
if external_nodes.present?
self.auto_publish_status = AUTO_PUBLISH_STATUS_NONE
end
if save_to_repository && !save_to_repository.publish_without_qa?
self.auto_publish_status = AUTO_PUBLISH_STATUS_TESTING
end
if auto_publish? || auto_publish_into_testing?
self.auto_create_container = false
end
2014-02-20 15:25:17 +00:00
true
end
def prepare_extra_params
if extra_params.present?
params = extra_params.slice(*BuildList::EXTRA_PARAMS)
params.update(params) do |k,v|
v.strip.gsub(I18n.t("activerecord.attributes.build_list.extra_params.#{k}"), '').
2019-07-10 17:46:56 +01:00
gsub(/[^\w\s\-["]=]/, '')
end
self.extra_params = params.select{ |k,v| v.present? }
end
end
2014-01-21 04:51:49 +00:00
end