- Добавлена поддержка ожидания сборки

- Изменен порядок сортировки новых пакетов в repoview
master
Alexey Berezhok 2 weeks ago
parent d50ee1a708
commit 89f92d265a

@ -36,4 +36,3 @@ gem "ffi", "~> 1.17"
gem "ptools", "~> 1.5" gem "ptools", "~> 1.5"
gem "ostruct", "~> 0.6.1" gem "ostruct", "~> 0.6.1"

@ -1,3 +1,7 @@
0.3-1
* Добавлена возможность добавлять сборки в состоянии ожидания
* Изменена сортировка пакетов в repoview
0.2-1 0.2-1
* Добавлена поддержка проектов для тестовых сборок (версия меняется каждую сборку) * Добавлена поддержка проектов для тестовых сборок (версия меняется каждую сборку)
* Доработан вывод repoview * Доработан вывод repoview

@ -38,6 +38,7 @@ end
cfg = IniConfig.new() cfg = IniConfig.new()
db = DBase.new(cfg) db = DBase.new(cfg)
db.cancel_hang_builds
set :bind, "0.0.0.0" set :bind, "0.0.0.0"
set :port, cfg.get_port set :port, cfg.get_port
@ -780,7 +781,7 @@ get "/gitbld/:id/:git_id" do
@git_name = git_info[:reponame] @git_name = git_info[:reponame]
@proj_id = params["id"] @proj_id = params["id"]
@build_id = prj.build_projects_git(prj_info[:id], git_info[:id], cfg.get_counter_path) @build_id = prj.build_projects_git(prj_info[:id], git_info[:id], cfg.get_counter_path, cfg.get_build_lock_path)
if @build_id == 0 if @build_id == 0
print_error_page(503, "Ошибка создания или получения информации о сборке, возможно проблемы с файлом блокировки") print_error_page(503, "Ошибка создания или получения информации о сборке, возможно проблемы с файлом блокировки")
@ -963,6 +964,18 @@ get "/buildinfof/:build_id" do
end end
end end
get "/buildterm/:build_id" do
build_info = db.get_build_info(params["build_id"])
if build_info.nil?
print_error_page(503, "Сборки не сущестует")
else
if build_info[:result] == 3
db.update_build_task_status(params["build_id"], 4)
end
redirect back
end
end
get "/buildinfofraw" do get "/buildinfofraw" do
if params["file"].nil? || !File.exist?(params["file"]) if params["file"].nil? || !File.exist?(params["file"])
print_error_page(503, "Файл не найден") print_error_page(503, "Файл не найден")

@ -71,6 +71,14 @@ class IniConfig
end end
end end
def get_build_lock_path()
unless @config["build"]["path"].nil?
@config["build"]["path"].to_s
else
"locks/build"
end
end
def get_items_per_page() def get_items_per_page()
unless @config["pages"]["items_per_page"].nil? unless @config["pages"]["items_per_page"].nil?
res = @config["pages"]["items_per_page"].to_i res = @config["pages"]["items_per_page"].to_i

@ -249,6 +249,10 @@ class DBase
BuildTask.where(id: build_id.to_i).update(result: status.to_i) BuildTask.where(id: build_id.to_i).update(result: status.to_i)
end end
def get_build_task_status(build_id)
BuildTask.where(id: build_id.to_i).first
end
def update_build_task_error_log(build_id, path) def update_build_task_error_log(build_id, path)
BuildTask.where(id: build_id.to_i).update(errlogpath: path) BuildTask.where(id: build_id.to_i).update(errlogpath: path)
end end
@ -384,4 +388,8 @@ class DBase
def delete_git_by_id(id) def delete_git_by_id(id)
Repos.where(id: id.to_i).delete Repos.where(id: id.to_i).delete
end end
def cancel_hang_builds()
BuildTask.where(result: [0, 3]).update(result: 4)
end
end end

@ -267,7 +267,7 @@ class MockManager
end end
end end
def build_task() def build_task(build_lock)
@error = false @error = false
@db.before_fork @db.before_fork
spock = Spork.spork(:logger => log) do spock = Spork.spork(:logger => log) do
@ -275,6 +275,18 @@ class MockManager
old_stdout = $stdout.dup old_stdout = $stdout.dup
$stdout = File.open(@process_log, "w") $stdout = File.open(@process_log, "w")
@log = Logger.new($stdout) @log = Logger.new($stdout)
File.open(build_lock,"wb") do |global_lock|
global_lock.flock(File::LOCK_EX)
global_lock.rewind
build_info = @db.get_build_task_status(build_id)
unless build_info.nil?
if build_info[:result].to_i == 4
return
end
end
@db.update_build_task_status(@build_id, 0)
if @spec == "" if @spec == ""
@error = true @error = true
@log.error("Не могу найти spec файл") @log.error("Не могу найти spec файл")
@ -300,8 +312,11 @@ class MockManager
else else
@db.update_build_task_status(@build_id, 2) @db.update_build_task_status(@build_id, 2)
end end
global_lock.flock(File::LOCK_UN)
end
end end
@db.after_fork @db.after_fork
spock
end end
end end

@ -269,7 +269,7 @@ class ProjectsActions
spec_file spec_file
end end
def build_projects_git(prj_id, git_id, counter_file) def build_projects_git(prj_id, git_id, counter_file, build_lock)
bld_id = 0 bld_id = 0
build_ok = true build_ok = true
proj_path = get_project_path(prj_id) proj_path = get_project_path(prj_id)
@ -286,14 +286,10 @@ class ProjectsActions
# Файл заблокирован считать id и вывести сведения о сборке # Файл заблокирован считать id и вывести сведения о сборке
build_ok = false build_ok = false
build_id = f.gets build_id = f.gets
unless build_id.nil? build_id = build_id.strip.to_i unless build_id.nil?
build_id = build_id.strip.to_i if build_id.positive?
end
if build_id > 0
build_info = @db.get_build_task_process_log(build_id) build_info = @db.get_build_task_process_log(build_id)
unless build_info.nil? bld_id = build_info[:id] unless build_info.nil?
bld_id = build_info[:id]
end
end end
else else
# Сборка завершилась, но каталог не подчистился # Сборка завершилась, но каталог не подчистился
@ -306,17 +302,17 @@ class ProjectsActions
#Верная ситуация #Верная ситуация
if build_ok if build_ok
build_path = File.join(proj_path, PROJECTS_STRUCTURE[:LOGS], git_name[:reponame])
Dir.mkdir(prepare_path) Dir.mkdir(prepare_path)
lockf_path = File.join(prepare_path, "lock") lockf_path = File.join(prepare_path, "lock")
File.open(lockf_path, File::RDWR | File::CREAT) do |f| File.open(lockf_path, File::RDWR | File::CREAT) do |f|
f.flock(File::LOCK_EX) f.flock(File::LOCK_EX)
f.rewind f.rewind
#Начинаем сборку #Начинаем сборку
build_path = File.join(proj_path, PROJECTS_STRUCTURE[:LOGS], git_name[:reponame])
repo_path = File.join(proj_path, PROJECTS_STRUCTURE[:REPO])
git_source = File.join(proj_path, PROJECTS_STRUCTURE[:SRC], git_name[:reponame])
@db.create_build_task(prj_id, git_id, build_path) @db.create_build_task(prj_id, git_id, build_path)
build_id = @db.last_id build_id = @db.last_id
repo_path = File.join(proj_path, PROJECTS_STRUCTURE[:REPO])
git_source = File.join(proj_path, PROJECTS_STRUCTURE[:SRC], git_name[:reponame])
f.puts(build_id) f.puts(build_id)
f.flush f.flush
proj_info = get_project(prj_id) proj_info = get_project(prj_id)
@ -325,7 +321,8 @@ class ProjectsActions
mock = MockManager.new(prepare_path, get_project_config(prj_id), counter_file, @db, build_path, repo_path, git_source, build_id, prep_script, spec_file, repo_lock, git_id, tmp_bld) mock = MockManager.new(prepare_path, get_project_config(prj_id), counter_file, @db, build_path, repo_path, git_source, build_id, prep_script, spec_file, repo_lock, git_id, tmp_bld)
bld_id = build_id bld_id = build_id
@db.update_build_task_error_log(build_id, mock.get_build_process_log) @db.update_build_task_error_log(build_id, mock.get_build_process_log)
mock.build_task @db.update_build_task_status(build_id, 3)
mock.build_task(build_lock)
end end
end end
bld_id bld_id

@ -142,9 +142,9 @@ class RepoManager
if nresult.key?("SRPMS") if nresult.key?("SRPMS")
last_update_src = nresult["SRPMS"].map do |record| last_update_src = nresult["SRPMS"].map do |record|
{ fname: record[:fname], stat: record[:stat] } { fname: record[:fname], stat: record[:stat] }
end.sort_by! do |item| end.sort_by do |item|
[item[:stat], -item[:fname].downcase.ord] [item[:stat], item[:fname].downcase.ord]
end.map do |record| end.reverse.map do |record|
if record[:stat].nil? if record[:stat].nil?
["нет даты", record[:fname]] ["нет даты", record[:fname]]
else else

@ -12,6 +12,9 @@ old = 3
[counter] [counter]
path = "locks/counter" path = "locks/counter"
[build]
path = "locks/build"
[configs] [configs]
hide=open,amazon,anolis,circle,custom,euro,fedora,mageia,navy,alma,rocky hide=open,amazon,anolis,circle,custom,euro,fedora,mageia,navy,alma,rocky
selected=msvsphere selected=msvsphere

@ -8,7 +8,14 @@
![Список сборок2](../img/mockgui_build10.png) ![Список сборок2](../img/mockgui_build10.png)
Где можно увидеть вес файлы логов с ошибками и без, пакеты собранные при сборке и т.д. Где можно увидеть все файлы логов с ошибками и без, пакеты собранные при сборке и т.д.
Сборка может находится в таком состоянии:
* Идет сборка - проект собирается
* Ожидает сборки - одновременно может происходить только одна сборка, поэтому все проекты требующие сборки будут ожидать очереди. В этот момент сборку можно отменить
* Отменена - сборка была запланирована, но потом отменена
* Ошибка сборки - сборка завершилась с ошибкой
* Сборка успешно завершена - успешная сборка с пакетами
Список сборок может быть: Список сборок может быть:
* общим * общим

@ -25,6 +25,12 @@
when 2 when 2
st = "Сборка успешно завершена" st = "Сборка успешно завершена"
cl = "text-bg-success" cl = "text-bg-success"
when 3
st = "Ожидает сборки"
cl = "text-bg-secondary"
when 4
st = "Отменена"
cl = "text-bg-light"
else else
st = "Неизвестно" st = "Неизвестно"
cl = "text-bg-light" cl = "text-bg-light"
@ -39,7 +45,15 @@
<td class="text-center <%= cl %>"> <td class="text-center <%= cl %>">
<%= st %> <%= st %>
</td> </td>
<td class="text-center"><a href="/buildinfof/<%= ERB::Util.url_encode(item[:buildid]) %>">Детальнее</a></td> <td class="text-center">
<% if item[:state] == 3 %>
<a href="/buildterm/<%= ERB::Util.url_encode(item[:buildid]) %>">Отменить</a>
<% elsif item[:state] == 4 %>
Нет информации
<% else %>
<a href="/buildinfof/<%= ERB::Util.url_encode(item[:buildid]) %>">Детальнее</a>
<% end %>
</td>
</tr> </tr>
<% end %> <% end %>
</tbody> </tbody>

@ -26,11 +26,17 @@
when 2 when 2
st = "Сборка успешно завершена" st = "Сборка успешно завершена"
cl = "text-bg-success" cl = "text-bg-success"
when 3
st = "Ожидает сборки"
cl = "text-bg-secondary"
when 4
st = "Отменена"
cl = "text-bg-light"
else else
st = "Неизвестно" st = "Неизвестно"
cl = "text-bg-light" cl = "text-bg-light"
end end
%> %> end
<tr> <tr>
<td scope="row"><%= item[:buildid] %></td> <td scope="row"><%= item[:buildid] %></td>
<td class="text-center"><a href="/prjedit/<%= ERB::Util.url_encode(item[:projid]) %>"><%= item[:prjname] %></a></td> <td class="text-center"><a href="/prjedit/<%= ERB::Util.url_encode(item[:projid]) %>"><%= item[:prjname] %></a></td>
@ -40,7 +46,15 @@
<td class="text-center <%= cl %>"> <td class="text-center <%= cl %>">
<%= st %> <%= st %>
</td> </td>
<td class="text-center"><a href="/buildinfof/<%= ERB::Util.url_encode(item[:buildid]) %>">Детальнее</a></td> <td class="text-center">
<% if item[:state] == 3 %>
<a href="/buildterm/<%= ERB::Util.url_encode(item[:buildid]) %>">Отменить</a>
<% elsif item[:state] == 4 %>
Нет информации
<% else %>
<a href="/buildinfof/<%= ERB::Util.url_encode(item[:buildid]) %>">Детальнее</a>
<% end %>
</td>
</tr> </tr>
<% end %> <% end %>
</tbody> </tbody>

@ -26,6 +26,12 @@
when 2 when 2
st = "Сборка успешно завершена" st = "Сборка успешно завершена"
cl = "text-bg-success" cl = "text-bg-success"
when 3
st = "Ожидает сборки"
cl = "text-bg-secondary"
when 4
st = "Отменена"
cl = "text-bg-light"
else else
st = "Неизвестно" st = "Неизвестно"
cl = "text-bg-light" cl = "text-bg-light"
@ -40,7 +46,15 @@
<td class="text-center <%= cl %>"> <td class="text-center <%= cl %>">
<%= st %> <%= st %>
</td> </td>
<td class="text-center"><a href="/buildinfof/<%= ERB::Util.url_encode(item[:buildid]) %>">Детальнее</a></td> <td class="text-center">
<% if item[:state] == 3 %>
<a href="/buildterm/<%= ERB::Util.url_encode(item[:buildid]) %>">Отменить</a>
<% elsif item[:state] == 4 %>
Нет информации
<% else %>
<a href="/buildinfof/<%= ERB::Util.url_encode(item[:buildid]) %>">Детальнее</a>
<% end %>
</td>
</tr> </tr>
<% end %> <% end %>
</tbody> </tbody>

Loading…
Cancel
Save