#405: Run mass builds with relations
This commit is contained in:
parent
21d705610b
commit
c263df2fec
|
@ -0,0 +1,31 @@
|
||||||
|
class RunExtraMassBuildsJob
|
||||||
|
@queue = :low
|
||||||
|
|
||||||
|
def self.perform
|
||||||
|
RunExtraMassBuildsJob.new.perform
|
||||||
|
end
|
||||||
|
|
||||||
|
def perform
|
||||||
|
MassBuild.where(status: BUILD_PENDING).find_each do |mb|
|
||||||
|
next if mb.extra_mass_builds.blank?
|
||||||
|
next if mb.extra_mass_builds.exclude?(mass_build_id)
|
||||||
|
emb = MassBuild.where(status: SUCCESS, id: mb.extra_mass_builds).to_a
|
||||||
|
next if emb.size != mb.extra_mass_builds.size
|
||||||
|
|
||||||
|
next if emb.find{ |mb| not_ready?(mb) }
|
||||||
|
mb.build_all
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
# Returns true if mass build has not published packages or packages without container
|
||||||
|
def not_ready?(mb)
|
||||||
|
mb.build_lists.count != mb.build_lists.where(
|
||||||
|
'status = ? OR container_status = ?',
|
||||||
|
BuildList::BUILD_PUBLISHED,
|
||||||
|
BuildList::BUILD_PUBLISHED
|
||||||
|
).count
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -15,7 +15,7 @@ class BuildList < ActiveRecord::Base
|
||||||
belongs_to :builder, class_name: 'User'
|
belongs_to :builder, class_name: 'User'
|
||||||
belongs_to :publisher, class_name: 'User'
|
belongs_to :publisher, class_name: 'User'
|
||||||
belongs_to :advisory
|
belongs_to :advisory
|
||||||
belongs_to :mass_build, counter_cache: true, touch: true
|
belongs_to :mass_build, counter_cache: true
|
||||||
has_many :items, class_name: '::BuildList::Item', dependent: :destroy
|
has_many :items, class_name: '::BuildList::Item', dependent: :destroy
|
||||||
has_many :packages, class_name: '::BuildList::Package', dependent: :destroy
|
has_many :packages, class_name: '::BuildList::Package', dependent: :destroy
|
||||||
has_many :source_packages, -> { where(package_type: 'source') }, class_name: '::BuildList::Package'
|
has_many :source_packages, -> { where(package_type: 'source') }, class_name: '::BuildList::Package'
|
||||||
|
@ -172,7 +172,7 @@ class BuildList < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
after_transition on: :published,
|
after_transition on: :published,
|
||||||
do: [:set_version_and_tag, :actualize_packages]
|
do: %i(set_version_and_tag actualize_packages)
|
||||||
after_transition on: :publish, do: :set_publisher
|
after_transition on: :publish, do: :set_publisher
|
||||||
after_transition(on: :publish) do |build_list, transition|
|
after_transition(on: :publish) do |build_list, transition|
|
||||||
if transition.from == BUILD_PUBLISHED_INTO_TESTING
|
if transition.from == BUILD_PUBLISHED_INTO_TESTING
|
||||||
|
|
|
@ -2,6 +2,34 @@ class MassBuild < ActiveRecord::Base
|
||||||
|
|
||||||
AUTO_PUBLISH_STATUSES = %w(none default testing)
|
AUTO_PUBLISH_STATUSES = %w(none default testing)
|
||||||
|
|
||||||
|
STATUSES, HUMAN_STATUSES = [], {}
|
||||||
|
[
|
||||||
|
%w(SUCCESS 0),
|
||||||
|
%w(BUILD_STARTED 3000),
|
||||||
|
%w(BUILD_PENDING 2000),
|
||||||
|
].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
|
||||||
|
|
||||||
|
state_machine :status, initial: :build_pending do
|
||||||
|
event :start do
|
||||||
|
transition build_pending: :build_started
|
||||||
|
end
|
||||||
|
|
||||||
|
event :done do
|
||||||
|
transition build_started: :success
|
||||||
|
end
|
||||||
|
|
||||||
|
HUMAN_STATUSES.each do |code,name|
|
||||||
|
state name, value: code
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
belongs_to :build_for_platform, -> { where(platform_type: 'main') }, class_name: 'Platform'
|
belongs_to :build_for_platform, -> { where(platform_type: 'main') }, class_name: 'Platform'
|
||||||
belongs_to :save_to_platform, class_name: 'Platform'
|
belongs_to :save_to_platform, class_name: 'Platform'
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
|
@ -43,7 +71,7 @@ class MassBuild < ActiveRecord::Base
|
||||||
:use_extra_tests,
|
:use_extra_tests,
|
||||||
inclusion: { in: [true, false] }
|
inclusion: { in: [true, false] }
|
||||||
|
|
||||||
after_commit :build_all, on: :create
|
after_commit :build_all, on: :create, if: Proc.new { |mb| mb.extra_mass_builds.blank? }
|
||||||
before_validation :set_data, on: :create
|
before_validation :set_data, on: :create
|
||||||
|
|
||||||
COUNT_STATUSES = %i(
|
COUNT_STATUSES = %i(
|
||||||
|
@ -58,6 +86,7 @@ class MassBuild < ActiveRecord::Base
|
||||||
)
|
)
|
||||||
|
|
||||||
def build_all
|
def build_all
|
||||||
|
start
|
||||||
# later with resque
|
# later with resque
|
||||||
arches_list = arch_names ? Arch.where(name: arch_names.split(', ')) : Arch.all
|
arches_list = arch_names ? Arch.where(name: arch_names.split(', ')) : Arch.all
|
||||||
|
|
||||||
|
@ -82,6 +111,7 @@ class MassBuild < ActiveRecord::Base
|
||||||
update_column :missed_projects_list, list
|
update_column :missed_projects_list, list
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
done
|
||||||
end
|
end
|
||||||
later :build_all, queue: :low
|
later :build_all, queue: :low
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,13 @@ clean_api_defender_statistics:
|
||||||
queue: low
|
queue: low
|
||||||
description: 'Cleans ApiDefender statistics'
|
description: 'Cleans ApiDefender statistics'
|
||||||
|
|
||||||
|
run_extra_mass_builds:
|
||||||
|
every:
|
||||||
|
- '5m'
|
||||||
|
class: 'RunExtraMassBuildsJob'
|
||||||
|
queue: low
|
||||||
|
description: 'Run mass builds with relations'
|
||||||
|
|
||||||
restart_nodes:
|
restart_nodes:
|
||||||
every:
|
every:
|
||||||
- '5m'
|
- '5m'
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
class AddStatusToMassBuilds < ActiveRecord::Migration
|
||||||
|
|
||||||
|
def up
|
||||||
|
# Sets SUCCESS for all current builds
|
||||||
|
add_column :mass_builds, :status, :integer, null: false, default: 0 # SUCCESS
|
||||||
|
# Sets BUILD_PENDING for all new builds
|
||||||
|
change_column :mass_builds, :status, :integer, null: false, default: 2000 # BUILD_PENDING
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
remove_column :mass_builds, :status
|
||||||
|
end
|
||||||
|
end
|
|
@ -11,7 +11,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20140701172739) do
|
ActiveRecord::Schema.define(version: 20140709194335) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
|
@ -331,6 +331,7 @@ ActiveRecord::Schema.define(version: 20140701172739) do
|
||||||
t.text "extra_mass_builds"
|
t.text "extra_mass_builds"
|
||||||
t.boolean "include_testing_subrepository", default: false, null: false
|
t.boolean "include_testing_subrepository", default: false, null: false
|
||||||
t.boolean "auto_create_container", default: false, null: false
|
t.boolean "auto_create_container", default: false, null: false
|
||||||
|
t.integer "status", default: 2000, null: false
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "users", force: true do |t|
|
create_table "users", force: true do |t|
|
||||||
|
|
Loading…
Reference in New Issue