- Добавлена поддержка ожидания сборки
- Изменен порядок сортировки новых пакетов в repoview
This commit is contained in:
1
Gemfile
1
Gemfile
@@ -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"
|
||||||
|
|
||||||
|
|||||||
4
VERSION
4
VERSION
@@ -1,3 +1,7 @@
|
|||||||
|
0.3-1
|
||||||
|
* Добавлена возможность добавлять сборки в состоянии ожидания
|
||||||
|
* Изменена сортировка пакетов в repoview
|
||||||
|
|
||||||
0.2-1
|
0.2-1
|
||||||
* Добавлена поддержка проектов для тестовых сборок (версия меняется каждую сборку)
|
* Добавлена поддержка проектов для тестовых сборок (версия меняется каждую сборку)
|
||||||
* Доработан вывод repoview
|
* Доработан вывод repoview
|
||||||
|
|||||||
15
app.rb
15
app.rb
@@ -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 @@
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
Где можно увидеть вес файлы логов с ошибками и без, пакеты собранные при сборке и т.д.
|
Где можно увидеть все файлы логов с ошибками и без, пакеты собранные при сборке и т.д.
|
||||||
|
|
||||||
|
Сборка может находится в таком состоянии:
|
||||||
|
* Идет сборка - проект собирается
|
||||||
|
* Ожидает сборки - одновременно может происходить только одна сборка, поэтому все проекты требующие сборки будут ожидать очереди. В этот момент сборку можно отменить
|
||||||
|
* Отменена - сборка была запланирована, но потом отменена
|
||||||
|
* Ошибка сборки - сборка завершилась с ошибкой
|
||||||
|
* Сборка успешно завершена - успешная сборка с пакетами
|
||||||
|
|
||||||
Список сборок может быть:
|
Список сборок может быть:
|
||||||
* общим
|
* общим
|
||||||
|
|||||||
0
locks/build
Normal file
0
locks/build
Normal file
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user