From 103be7f40206a980e891f93a96d2b69b9527351f Mon Sep 17 00:00:00 2001 From: alexey Date: Tue, 11 Mar 2025 23:54:19 +0300 Subject: [PATCH] Added mock build. Part 2 --- app.rb | 2 +- classes/config.rb | 8 ++++++++ classes/db.rb | 12 ++++++++++++ classes/mock.rb | 6 ++++-- classes/projects.rb | 35 ++++++++++++++++++++++++++++++++++- config.ini | 3 +++ locks/counter | 1 + 7 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 locks/counter diff --git a/app.rb b/app.rb index e8a7876..b0b63b9 100644 --- a/app.rb +++ b/app.rb @@ -751,7 +751,7 @@ get "/gitbld/:id/:git_id" do @proj_descr = prj_info[:descr] @git_name = git_info[:reponame] - prj.build_projects_git(prj_info[:id], git_info[:id]) + prj.build_projects_git(prj_info[:id], git_info[:id], cfg.get_counter_path) erb :prjbld end diff --git a/classes/config.rb b/classes/config.rb index 17a1bae..75dbb7b 100644 --- a/classes/config.rb +++ b/classes/config.rb @@ -62,4 +62,12 @@ class IniConfig "projects" end end + + def get_counter_path() + unless @config["counter"]["path"].nil? + @config["counter"]["path"].to_s + else + "locks/counter" + end + end end diff --git a/classes/db.rb b/classes/db.rb index 49ce891..9d945eb 100644 --- a/classes/db.rb +++ b/classes/db.rb @@ -204,4 +204,16 @@ class DBase @last_id = id end end + + def get_git_recips(git_id) + res = [] + recip = RepocRecips.where(repo_id: git_id.to_i).all + unless recip.nil? + res = recip.map do |item| + rcp_info = Recips[item[:recip_id]] + rcp_info + end + end + res + end end diff --git a/classes/mock.rb b/classes/mock.rb index 3bd4d7c..a156b71 100644 --- a/classes/mock.rb +++ b/classes/mock.rb @@ -2,9 +2,9 @@ require_relative "spork" require_relative "runner" class MockManager - attr :path, :config, :error, :last_status, :last_pid, :prep_dir + attr :path, :config, :error, :last_status, :last_pid, :prep_dir, :db - def initialize(path, config, cfg_counter_path) + def initialize(path, config, cfg_counter_path, db) @error = nil unless File.exist? (path) Dir.mkdir(path) @@ -12,6 +12,7 @@ class MockManager @path = path @config = config cntr = 0 + @db = db File.open(cfg_counter_path, "r+") do |f| f.flock(File::LOCK_EX) @@ -23,5 +24,6 @@ class MockManager end tmp_name = (0...10).map { ("a".."z").to_a[rand(26)] }.join @prep_dir = File.join(path, "#{cntr}_#{tmp_name}") + pp @prep_dir end end diff --git a/classes/projects.rb b/classes/projects.rb index a267787..a6f7b0d 100644 --- a/classes/projects.rb +++ b/classes/projects.rb @@ -131,6 +131,7 @@ class ProjectsActions config_opts['plugin_conf']['root_cache_enable'] = True config_opts['plugin_conf']['showrc_enable'] = True config_opts['plugin_conf']['yum_cache_enable'] = True + config_opts['chroot_setup_cmd'] += " procenv gcc gcc-c++ make" PRJ_CFG File.open(proj_conf_path, "w") { |f| f << proj_config } generate_linked_repos(id, proj_path, proj_name, prj_incl_path) @@ -241,6 +242,38 @@ class ProjectsActions end end - def build_projects_git(prj_id, git_id) + def build_projects_git(prj_id, git_id, counter_file) + build_ok = true + proj_path = get_project_path(prj_id) + git_name = @db.get_repo_info_by_id(git_id) + prep_script = @db.get_git_recips(git_id) + prepare_path = File.join(proj_path, PROJECTS_STRUCTURE[:SRCPRP], git_name[:reponame]) + if File.exist?(prepare_path) + lockf_path = File.join(prepare_path, "lock") + File.open(lockf_path, File::RDWR | File::CREAT) do |f| + result = f.flock(File::LOCK_EX | File::LOCK_NB) + unless result + #Файл заблокирован считать id и вывести сведения о сборке + build_ok = false + else + #Сборка завершилась, но каталог не подчистился + FileUtils.rm_rf(prepare_path) + f.flock(File::LOCK_UN) + build_ok = true + end + end + end + + #Верная ситуация + if build_ok + Dir.mkdir(prepare_path) + lockf_path = File.join(prepare_path, "lock") + File.open(lockf_path, File::RDWR | File::CREAT) do |f| + f.flock(File::LOCK_EX) + #Начинаем сборку + mock = MockManager.new(prepare_path, get_project_config(prj_id), counter_file, @db) + FileUtils.rm_rf(prepare_path) + end + end end end diff --git a/config.ini b/config.ini index a2734dc..c45fcdd 100644 --- a/config.ini +++ b/config.ini @@ -9,6 +9,9 @@ repo = "repo" path = "projects" old = 3 +[counter] +path = "locks/counter" + [configs] hide=open,amazon,anolis,circle,custom,euro,fedora,mageia,navy,alma,rocky selected=msvsphere \ No newline at end of file diff --git a/locks/counter b/locks/counter new file mode 100644 index 0000000..56a6051 --- /dev/null +++ b/locks/counter @@ -0,0 +1 @@ +1 \ No newline at end of file