#759: add action for cancel build, some refactoring
This commit is contained in:
parent
4640b798fa
commit
ff2ae73985
|
@ -5,7 +5,7 @@ class Platforms::ProductBuildListsController < Platforms::BaseController
|
||||||
load_and_authorize_resource :platform, :except => [:index, :status_build]
|
load_and_authorize_resource :platform, :except => [:index, :status_build]
|
||||||
load_and_authorize_resource :product, :through => :platform, :except => [:index, :status_build]
|
load_and_authorize_resource :product, :through => :platform, :except => [:index, :status_build]
|
||||||
load_and_authorize_resource :product_build_list, :through => :product, :except => [:index, :status_build]
|
load_and_authorize_resource :product_build_list, :through => :product, :except => [:index, :status_build]
|
||||||
load_and_authorize_resource :only => [:index, :show, :log, :stop]
|
load_and_authorize_resource :only => [:index, :show, :log, :cancel]
|
||||||
|
|
||||||
before_filter :authenticate_product_builder!, :only => [:status_build]
|
before_filter :authenticate_product_builder!, :only => [:status_build]
|
||||||
before_filter :find_product_build_list, :only => [:status_build]
|
before_filter :find_product_build_list, :only => [:status_build]
|
||||||
|
@ -25,15 +25,15 @@ class Platforms::ProductBuildListsController < Platforms::BaseController
|
||||||
def show
|
def show
|
||||||
end
|
end
|
||||||
|
|
||||||
def stop
|
def cancel
|
||||||
@product_build_list.stop
|
@product_build_list.cancel_job
|
||||||
flash[:notice] = t('flash.product_build_list.will_be_stopped')
|
flash[:notice] = t('layout.build_lists.will_be_canceled')
|
||||||
redirect_to platform_product_product_build_list_path(@platform, @product, @product_build_list)
|
redirect_to platform_product_product_build_list_path(@platform, @product, @product_build_list)
|
||||||
end
|
end
|
||||||
|
|
||||||
def log
|
def log
|
||||||
render :json => {
|
render :json => {
|
||||||
:log => @product_build_list.log,
|
:log => @product_build_list.abf_worker_log,
|
||||||
:building => @product_build_list.build_started?
|
:building => @product_build_list.build_started?
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -100,11 +100,17 @@ class Projects::BuildListsController < Projects::BaseController
|
||||||
end
|
end
|
||||||
|
|
||||||
def cancel
|
def cancel
|
||||||
if @build_list.cancel
|
if @build_list.new_core? && @build_list.can_cancel?
|
||||||
redirect_to :back, :notice => t('layout.build_lists.cancel_success')
|
@build_list.cancel_job
|
||||||
|
notice = t('layout.build_lists.will_be_canceled')
|
||||||
else
|
else
|
||||||
redirect_to :back, :notice => t('layout.build_lists.cancel_fail')
|
if @build_list.cancel
|
||||||
|
notice = t('layout.build_lists.cancel_success')
|
||||||
|
else
|
||||||
|
notice = t('layout.build_lists.cancel_fail')
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
redirect_to :back, :notice => notice
|
||||||
end
|
end
|
||||||
|
|
||||||
def log
|
def log
|
||||||
|
|
|
@ -114,7 +114,7 @@ class Ability
|
||||||
can(:read, Product, read_relations_for('products', 'platforms')) {|product| product.platform.main?}
|
can(:read, Product, read_relations_for('products', 'platforms')) {|product| product.platform.main?}
|
||||||
can([:create, :update, :destroy, :clone], Product) {|product| local_admin? product.platform and product.platform.main?}
|
can([:create, :update, :destroy, :clone], Product) {|product| local_admin? product.platform and product.platform.main?}
|
||||||
|
|
||||||
can([:create, :stop], ProductBuildList) {|pbl| can?(:update, pbl.product)}
|
can([:create, :cancel], ProductBuildList) {|pbl| can?(:update, pbl.product)}
|
||||||
can(:destroy, ProductBuildList) {|pbl| can?(:destroy, pbl.product)}
|
can(:destroy, ProductBuildList) {|pbl| can?(:destroy, pbl.product)}
|
||||||
|
|
||||||
can [:read, :create], PrivateUser, :platform => {:owner_type => 'User', :owner_id => user.id}
|
can [:read, :create], PrivateUser, :platform => {:owner_type => 'User', :owner_id => user.id}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# -*- encoding : utf-8 -*-
|
# -*- encoding : utf-8 -*-
|
||||||
class BuildList < ActiveRecord::Base
|
class BuildList < ActiveRecord::Base
|
||||||
include Modules::Models::CommitAndVersion
|
include Modules::Models::CommitAndVersion
|
||||||
|
include AbfWorker::ModelHelper
|
||||||
|
|
||||||
belongs_to :project
|
belongs_to :project
|
||||||
belongs_to :arch
|
belongs_to :arch
|
||||||
|
@ -49,11 +50,13 @@ class BuildList < ActiveRecord::Base
|
||||||
BUILD_PUBLISH = 7000
|
BUILD_PUBLISH = 7000
|
||||||
FAILED_PUBLISH = 8000
|
FAILED_PUBLISH = 8000
|
||||||
REJECTED_PUBLISH = 9000
|
REJECTED_PUBLISH = 9000
|
||||||
|
BUILD_CANCELING = 10000
|
||||||
|
|
||||||
STATUSES = [ WAITING_FOR_RESPONSE,
|
STATUSES = [ WAITING_FOR_RESPONSE,
|
||||||
BUILD_CANCELED,
|
BUILD_CANCELED,
|
||||||
BUILD_PENDING,
|
BUILD_PENDING,
|
||||||
BUILD_PUBLISHED,
|
BUILD_PUBLISHED,
|
||||||
|
BUILD_CANCELING,
|
||||||
BUILD_PUBLISH,
|
BUILD_PUBLISH,
|
||||||
FAILED_PUBLISH,
|
FAILED_PUBLISH,
|
||||||
REJECTED_PUBLISH,
|
REJECTED_PUBLISH,
|
||||||
|
@ -70,6 +73,7 @@ class BuildList < ActiveRecord::Base
|
||||||
|
|
||||||
HUMAN_STATUSES = { WAITING_FOR_RESPONSE => :waiting_for_response,
|
HUMAN_STATUSES = { WAITING_FOR_RESPONSE => :waiting_for_response,
|
||||||
BUILD_CANCELED => :build_canceled,
|
BUILD_CANCELED => :build_canceled,
|
||||||
|
BUILD_CANCELING => :build_canceling,
|
||||||
BUILD_PENDING => :build_pending,
|
BUILD_PENDING => :build_pending,
|
||||||
BUILD_PUBLISHED => :build_published,
|
BUILD_PUBLISHED => :build_published,
|
||||||
BUILD_PUBLISH => :build_publish,
|
BUILD_PUBLISH => :build_publish,
|
||||||
|
@ -169,7 +173,7 @@ class BuildList < ActiveRecord::Base
|
||||||
|
|
||||||
event :cancel do
|
event :cancel do
|
||||||
transition [:build_pending, :platform_pending] => :build_canceled, :if => lambda { |build_list|
|
transition [:build_pending, :platform_pending] => :build_canceled, :if => lambda { |build_list|
|
||||||
build_list.can_cancel? && BuildServer.delete_build_list(build_list.bs_id) == BuildServer::SUCCESS
|
!build_list.new_core? && build_list.can_cancel? && BuildServer.delete_build_list(build_list.bs_id) == BuildServer::SUCCESS
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -226,7 +230,11 @@ class BuildList < ActiveRecord::Base
|
||||||
|
|
||||||
#TODO: Share this checking on product owner.
|
#TODO: Share this checking on product owner.
|
||||||
def can_cancel?
|
def can_cancel?
|
||||||
[BUILD_PENDING, BuildServer::PLATFORM_PENDING].include?(status) && bs_id
|
if new_core?
|
||||||
|
build_started? || build_pending?
|
||||||
|
else
|
||||||
|
[BUILD_PENDING, BuildServer::PLATFORM_PENDING].include?(status) && bs_id
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def can_publish?
|
def can_publish?
|
||||||
|
@ -237,60 +245,10 @@ class BuildList < ActiveRecord::Base
|
||||||
can_publish? and not save_to_repository.publish_without_qa
|
can_publish? and not save_to_repository.publish_without_qa
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_to_abf_worker_queue
|
|
||||||
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
|
|
||||||
# mdv example:
|
|
||||||
# https://abf.rosalinux.ru/import/plasma-applet-stackfolder.git
|
|
||||||
# bfe6d68cc607238011a6108014bdcfe86c69456a
|
|
||||||
|
|
||||||
# rhel example:
|
|
||||||
# https://abf.rosalinux.ru/server/gnome-settings-daemon.git
|
|
||||||
# fbb2549e44d97226fea6748a4f95d1d82ffb8726
|
|
||||||
|
|
||||||
options = {
|
|
||||||
:id => id,
|
|
||||||
:arch => arch.name,
|
|
||||||
:time_living => 2880, # 2 days
|
|
||||||
:distrib_type => build_for_platform.distrib_type,
|
|
||||||
# :git_project_address => 'https://abf.rosalinux.ru/server/gnome-settings-daemon.git',
|
|
||||||
:git_project_address => project.git_project_address,
|
|
||||||
# :commit_hash => 'fbb2549e44d97226fea6748a4f95d1d82ffb8726',
|
|
||||||
:commit_hash => commit_hash,
|
|
||||||
:build_requires => build_requires,
|
|
||||||
:include_repos => include_repos_hash,
|
|
||||||
:bplname => build_for_platform.name
|
|
||||||
# :project_version => project_version,
|
|
||||||
# :plname => save_to_platform.name,
|
|
||||||
# :bplname => (save_to_platform_id == build_for_platform_id ? '' : build_for_platform.name),
|
|
||||||
# :update_type => update_type,
|
|
||||||
# :priority => priority,
|
|
||||||
}
|
|
||||||
unless @status
|
|
||||||
Resque.push(
|
|
||||||
'rpm_worker',
|
|
||||||
'class' => 'AbfWorker::RpmWorker',
|
|
||||||
'args' => [options]
|
|
||||||
)
|
|
||||||
end
|
|
||||||
@status ||= BUILD_PENDING
|
|
||||||
end
|
|
||||||
|
|
||||||
def add_to_queue
|
def add_to_queue
|
||||||
if new_core?
|
if new_core?
|
||||||
add_to_abf_worker_queue
|
add_job_to_abf_worker_queue unless @status
|
||||||
|
@status ||= BUILD_PENDING
|
||||||
else
|
else
|
||||||
# XML-RPC params:
|
# XML-RPC params:
|
||||||
# - project_name
|
# - project_name
|
||||||
|
@ -390,16 +348,53 @@ class BuildList < ActiveRecord::Base
|
||||||
|
|
||||||
def log(load_lines)
|
def log(load_lines)
|
||||||
if new_core?
|
if new_core?
|
||||||
log = Resque.redis.get("abfworker::rpm-worker-#{id}")
|
abf_worker_log
|
||||||
else
|
else
|
||||||
log = `tail -n #{load_lines.to_i} #{Rails.root + 'public' + fs_log_path}`
|
log = `tail -n #{load_lines.to_i} #{Rails.root + 'public' + fs_log_path}`
|
||||||
log = nil unless $?.success?
|
$?.success? ? log : I18n.t('layout.build_lists.log.not_available')
|
||||||
end
|
end
|
||||||
log || I18n.t('layout.build_lists.log.not_available')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
|
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
|
||||||
|
# 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,
|
||||||
|
:time_living => 2880, # 2 days
|
||||||
|
:distrib_type => build_for_platform.distrib_type,
|
||||||
|
# :git_project_address => 'https://abf.rosalinux.ru/server/gnome-settings-daemon.git',
|
||||||
|
:git_project_address => project.git_project_address,
|
||||||
|
# :commit_hash => 'fbb2549e44d97226fea6748a4f95d1d82ffb8726',
|
||||||
|
:commit_hash => commit_hash,
|
||||||
|
:build_requires => build_requires,
|
||||||
|
:include_repos => include_repos_hash,
|
||||||
|
:bplname => build_for_platform.name
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
def notify_users
|
def notify_users
|
||||||
unless mass_build_id
|
unless mass_build_id
|
||||||
users = []
|
users = []
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# -*- encoding : utf-8 -*-
|
# -*- encoding : utf-8 -*-
|
||||||
class ProductBuildList < ActiveRecord::Base
|
class ProductBuildList < ActiveRecord::Base
|
||||||
include Modules::Models::CommitAndVersion
|
include Modules::Models::CommitAndVersion
|
||||||
|
include AbfWorker::ModelHelper
|
||||||
delegate :url_helpers, to: 'Rails.application.routes'
|
delegate :url_helpers, to: 'Rails.application.routes'
|
||||||
|
|
||||||
BUILD_COMPLETED = 0
|
BUILD_COMPLETED = 0
|
||||||
|
@ -72,6 +73,10 @@ class ProductBuildList < ActiveRecord::Base
|
||||||
status == BUILD_CANCELING
|
status == BUILD_CANCELING
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def can_cancel?
|
||||||
|
[BUILD_STARTED, BUILD_PENDING].include? status
|
||||||
|
end
|
||||||
|
|
||||||
def container_path
|
def container_path
|
||||||
"/downloads/#{product.platform.name}/product/#{id}/"
|
"/downloads/#{product.platform.name}/product/#{id}/"
|
||||||
end
|
end
|
||||||
|
@ -92,22 +97,14 @@ class ProductBuildList < ActiveRecord::Base
|
||||||
[BUILD_COMPLETED, BUILD_FAILED, BUILD_CANCELED].include? status
|
[BUILD_COMPLETED, BUILD_FAILED, BUILD_CANCELED].include? status
|
||||||
end
|
end
|
||||||
|
|
||||||
def log
|
|
||||||
Resque.redis.get("abfworker::iso-worker-#{id}") || ''
|
|
||||||
end
|
|
||||||
|
|
||||||
def stop
|
|
||||||
update_attributes({:status => BUILD_CANCELING})
|
|
||||||
Resque.redis.setex(
|
|
||||||
"abfworker::iso-worker-#{id}::live-inspector",
|
|
||||||
120, # Data will be removed from Redis after 120 sec.
|
|
||||||
'USR1' # Immediately kill child but don't exit
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
def xml_rpc_create
|
def xml_rpc_create
|
||||||
|
add_job_to_abf_worker_queue
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
def abf_worker_args
|
||||||
file_name = "#{project.owner.uname}-#{project.name}-#{commit_hash}"
|
file_name = "#{project.owner.uname}-#{project.name}-#{commit_hash}"
|
||||||
srcpath = url_helpers.archive_url(
|
srcpath = url_helpers.archive_url(
|
||||||
project.owner,
|
project.owner,
|
||||||
|
@ -116,7 +113,7 @@ class ProductBuildList < ActiveRecord::Base
|
||||||
'tar.gz',
|
'tar.gz',
|
||||||
:host => ActionMailer::Base.default_url_options[:host]
|
:host => ActionMailer::Base.default_url_options[:host]
|
||||||
)
|
)
|
||||||
options = {
|
{
|
||||||
:id => id,
|
:id => id,
|
||||||
# TODO: remove comment
|
# TODO: remove comment
|
||||||
# :srcpath => 'http://dl.dropbox.com/u/945501/avokhmin-test-iso-script-5d9b463d4e9c06ea8e7c89e1b7ff5cb37e99e27f.tar.gz',
|
# :srcpath => 'http://dl.dropbox.com/u/945501/avokhmin-test-iso-script-5d9b463d4e9c06ea8e7c89e1b7ff5cb37e99e27f.tar.gz',
|
||||||
|
@ -127,13 +124,7 @@ class ProductBuildList < ActiveRecord::Base
|
||||||
:arch => arch.name,
|
:arch => arch.name,
|
||||||
:distrib_type => product.platform.distrib_type
|
:distrib_type => product.platform.distrib_type
|
||||||
}
|
}
|
||||||
Resque.push(
|
end
|
||||||
'iso_worker',
|
|
||||||
'class' => 'AbfWorker::IsoWorker',
|
|
||||||
'args' => [options]
|
|
||||||
)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
def xml_delete_iso_container
|
def xml_delete_iso_container
|
||||||
# TODO: write new worker for delete
|
# TODO: write new worker for delete
|
||||||
|
|
|
@ -23,11 +23,12 @@
|
||||||
|
|
||||||
= render 'show_field', :key => :notified_at, :value => l(pbl.updated_at, :format => :long)
|
= render 'show_field', :key => :notified_at, :value => l(pbl.updated_at, :format => :long)
|
||||||
|
|
||||||
|
- if pbl.can_cancel? && can?(:cancel, pbl)
|
||||||
|
= link_to t("layout.build_lists.cancel"), cancel_platform_product_product_build_list_path(pbl.product.platform, pbl.product, pbl),
|
||||||
|
:method => :put, :confirm => t("layout.confirm"), :class => 'button'
|
||||||
|
.both
|
||||||
|
|
||||||
- if pbl.build_started? || pbl.build_canceling?
|
- if pbl.build_started? || pbl.build_canceling?
|
||||||
- if can? :stop, pbl
|
|
||||||
.leftlist= t("layout.product_build_lists.action")
|
|
||||||
.rightlist= link_to t("layout.product_build_lists.stop"), stop_platform_product_product_build_list_path(pbl.product.platform, pbl.product, pbl)
|
|
||||||
.both
|
|
||||||
= render 'shared/log', { :build_started => true, :get_log_path => log_platform_product_product_build_list_path(pbl.product.platform, pbl.product, pbl) }
|
= render 'shared/log', { :build_started => true, :get_log_path => log_platform_product_product_build_list_path(pbl.product.platform, pbl.product, pbl) }
|
||||||
|
|
||||||
= render 'results', :pbl => pbl
|
= render 'results', :pbl => pbl
|
||||||
|
|
|
@ -62,6 +62,7 @@ en:
|
||||||
show: Show
|
show: Show
|
||||||
cancel: Cancel build
|
cancel: Cancel build
|
||||||
cancel_success: 'Build canceled'
|
cancel_success: 'Build canceled'
|
||||||
|
will_be_canceled: 'Build will be canceled...'
|
||||||
publish_success: 'Build published'
|
publish_success: 'Build published'
|
||||||
cancel_fail: 'Errors during build cancelation!'
|
cancel_fail: 'Errors during build cancelation!'
|
||||||
publish_fail: 'Errors during build publishing!'
|
publish_fail: 'Errors during build publishing!'
|
||||||
|
@ -111,6 +112,7 @@ en:
|
||||||
dependencies_fail: Dependences not found
|
dependencies_fail: Dependences not found
|
||||||
waiting_for_response: Waiting for response
|
waiting_for_response: Waiting for response
|
||||||
build_pending: Build pending
|
build_pending: Build pending
|
||||||
|
build_canceling: Build is canceling
|
||||||
dependency_test_failed: Dependency test failed
|
dependency_test_failed: Dependency test failed
|
||||||
binary_test_failed: Binary test failed
|
binary_test_failed: Binary test failed
|
||||||
build_canceled: Build canceled
|
build_canceled: Build canceled
|
||||||
|
|
|
@ -60,6 +60,7 @@ ru:
|
||||||
no_items_data: Данных нет
|
no_items_data: Данных нет
|
||||||
show: Просмотр
|
show: Просмотр
|
||||||
cancel: Отменить сборку
|
cancel: Отменить сборку
|
||||||
|
will_be_canceled: 'Сборка будет отменена...'
|
||||||
cancel_success: 'Сборка отменена.'
|
cancel_success: 'Сборка отменена.'
|
||||||
cancel_fail: 'При отмене сборки произошла ошибка!'
|
cancel_fail: 'При отмене сборки произошла ошибка!'
|
||||||
publish_success: 'Сборка поставлена в очередь на публикацию.'
|
publish_success: 'Сборка поставлена в очередь на публикацию.'
|
||||||
|
@ -111,6 +112,7 @@ ru:
|
||||||
dependency_test_failed: тестирование зависимостей не пройдено
|
dependency_test_failed: тестирование зависимостей не пройдено
|
||||||
binary_test_failed: тестирование бинарной совместимости не пройдено
|
binary_test_failed: тестирование бинарной совместимости не пройдено
|
||||||
build_canceled: сборка отменена
|
build_canceled: сборка отменена
|
||||||
|
build_canceling: сборка отменяется
|
||||||
success: собран
|
success: собран
|
||||||
build_started: собирается
|
build_started: собирается
|
||||||
platform_not_found: платформа не найдена
|
platform_not_found: платформа не найдена
|
||||||
|
|
|
@ -8,7 +8,6 @@ en:
|
||||||
results_folder: all files from this folder will be uploaded into the file-store
|
results_folder: all files from this folder will be uploaded into the file-store
|
||||||
archives_folder: this folder will be archived and uploaded into the file-store
|
archives_folder: this folder will be archived and uploaded into the file-store
|
||||||
delete: Delete
|
delete: Delete
|
||||||
stop: Stop
|
|
||||||
action: Action
|
action: Action
|
||||||
id_search: 'Id search'
|
id_search: 'Id search'
|
||||||
new: New build
|
new: New build
|
||||||
|
@ -52,5 +51,4 @@ en:
|
||||||
product_build_list:
|
product_build_list:
|
||||||
no_project: Project for build should be exist
|
no_project: Project for build should be exist
|
||||||
delete: Product build list deleted
|
delete: Product build list deleted
|
||||||
delete_error: Unable to delete product build list
|
delete_error: Unable to delete product build list
|
||||||
will_be_stopped: Build will be stopped
|
|
|
@ -8,7 +8,6 @@ ru:
|
||||||
results_folder: все файлы из этой папки будут загружены на file-store
|
results_folder: все файлы из этой папки будут загружены на file-store
|
||||||
archives_folder: эта папка будет заархивирована и загружена на file-store
|
archives_folder: эта папка будет заархивирована и загружена на file-store
|
||||||
delete: Удалить
|
delete: Удалить
|
||||||
stop: Остановить
|
|
||||||
action: Действие
|
action: Действие
|
||||||
id_search: 'Поиск по Id'
|
id_search: 'Поиск по Id'
|
||||||
new: Новая сборка
|
new: Новая сборка
|
||||||
|
@ -52,5 +51,4 @@ ru:
|
||||||
product_build_list:
|
product_build_list:
|
||||||
no_project: Проект для сборки должен присутствовать
|
no_project: Проект для сборки должен присутствовать
|
||||||
delete: Сборочный лист продукта удален
|
delete: Сборочный лист продукта удален
|
||||||
delete_error: Не удалось удалить cборочный лист продукта
|
delete_error: Не удалось удалить cборочный лист продукта
|
||||||
will_be_stopped: Сборка будет остановлена
|
|
|
@ -151,7 +151,7 @@ Rosa::Application.routes.draw do
|
||||||
resources :product_build_lists, :only => [:create, :destroy, :new, :show] do
|
resources :product_build_lists, :only => [:create, :destroy, :new, :show] do
|
||||||
member {
|
member {
|
||||||
get :log
|
get :log
|
||||||
get :stop
|
put :cancel
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
collection { get :autocomplete_project }
|
collection { get :autocomplete_project }
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
module AbfWorker
|
||||||
|
module ModelHelper
|
||||||
|
# In model which contains this helper should be:
|
||||||
|
# - BUILD_CANCELING
|
||||||
|
# - BUILD_CANCELED
|
||||||
|
# - #abf_worker_args
|
||||||
|
|
||||||
|
def abf_worker_log
|
||||||
|
q = 'abfworker::'
|
||||||
|
q << worker_queue
|
||||||
|
q << '-'
|
||||||
|
q << id.to_s
|
||||||
|
Resque.redis.get(q) || I18n.t('layout.build_lists.log.not_available')
|
||||||
|
end
|
||||||
|
|
||||||
|
def add_job_to_abf_worker_queue
|
||||||
|
Resque.push(
|
||||||
|
worker_queue,
|
||||||
|
'class' => worker_queue_class,
|
||||||
|
'args' => [abf_worker_args]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def cancel_job
|
||||||
|
update_attributes({:status => self.class::BUILD_CANCELING})
|
||||||
|
|
||||||
|
deleted = Resque::Job.destroy(
|
||||||
|
worker_queue,
|
||||||
|
worker_queue_class,
|
||||||
|
abf_worker_args
|
||||||
|
)
|
||||||
|
if deleted
|
||||||
|
update_attributes({:status => self.class::BUILD_CANCELED})
|
||||||
|
else
|
||||||
|
send_stop_signal
|
||||||
|
end
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def send_stop_signal
|
||||||
|
Resque.redis.setex(
|
||||||
|
live_inspector_queue,
|
||||||
|
90, # Data will be removed from Redis after 90 sec.
|
||||||
|
'USR1' # Immediately kill child but don't exit
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def live_inspector_queue
|
||||||
|
q = 'abfworker::'
|
||||||
|
q << worker_queue
|
||||||
|
q << '-'
|
||||||
|
q << id.to_s
|
||||||
|
q << '::live-inspector'
|
||||||
|
q
|
||||||
|
end
|
||||||
|
|
||||||
|
def worker_queue
|
||||||
|
is_a?(BuildList) ? 'rpm_worker' : 'iso_worker'
|
||||||
|
end
|
||||||
|
|
||||||
|
def worker_queue_class
|
||||||
|
is_a?(BuildList) ? 'AbfWorker::RpmWorker' : 'AbfWorker::IsoWorker'
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
|
@ -23,8 +23,8 @@ shared_examples_for 'product build list admin' do
|
||||||
response.should render_template(:index)
|
response.should render_template(:index)
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should be able to perform stop action' do
|
it 'should be able to perform cancel action' do
|
||||||
get :stop, valid_attributes_for_show
|
put :cancel, valid_attributes_for_show
|
||||||
response.should redirect_to(platform_product_product_build_list_path(@product.platform, @product, @pbl))
|
response.should redirect_to(platform_product_product_build_list_path(@product.platform, @product, @pbl))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -56,8 +56,8 @@ shared_examples_for 'product build list user without admin rights' do
|
||||||
response.should_not be_success
|
response.should_not be_success
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'should not be able to perform stop action' do
|
it 'should not be able to perform cancel action' do
|
||||||
get :stop, valid_attributes_for_show
|
put :cancel, valid_attributes_for_show
|
||||||
response.should_not redirect_to(platform_product_product_build_list_path(@product.platform, @product, @pbl))
|
response.should_not redirect_to(platform_product_product_build_list_path(@product.platform, @product, @pbl))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue