From 00d14f1396d5fab6537245698ddae99312e29700 Mon Sep 17 00:00:00 2001 From: donghee yang Date: Tue, 2 Apr 2013 15:40:48 +0900 Subject: [PATCH] [Title] Refactored the code for remote build request --- src/build_server/BuildServerException.rb | 3 +- src/build_server/RemoteBuilder.rb | 140 ++++++++++++------- src/build_server/SocketJobRequestListener.rb | 1 - src/common/BuildComm.rb | 17 ++- 4 files changed, 102 insertions(+), 59 deletions(-) diff --git a/src/build_server/BuildServerException.rb b/src/build_server/BuildServerException.rb index 966c18d..08d82a2 100644 --- a/src/build_server/BuildServerException.rb +++ b/src/build_server/BuildServerException.rb @@ -21,7 +21,8 @@ class BuildServerException < Exception "ERR017" => "Project locked!", "ERR018" => "Connection failed!", - "ERR019" => "Receiving log data failed!", + "ERR019" => "Receiving data failed!", + "ERR020" => "Sending data failed!", "ERR900" => "Cancel event received!", "ERR901" => "Job already upload status. Cancel failed!" diff --git a/src/build_server/RemoteBuilder.rb b/src/build_server/RemoteBuilder.rb index 8e3bea1..f10c73e 100644 --- a/src/build_server/RemoteBuilder.rb +++ b/src/build_server/RemoteBuilder.rb @@ -63,9 +63,19 @@ class RemoteBuilder @log = job.log # build - ret = build(@job.get_project().repository, @job.source_path, @job.os, - @job.is_rev_build_check_job(), @job.git_commit, @job.no_reverse, - local_pkgs, @job.get_project().dist_name,"admin@user" ) + options = init_options() + options[:git_repos] = @job.get_project().repository + options[:git_commit] = @job.git_commit + options[:src_path] = @job.source_path + options[:os] = @job.os + options[:noreverse] = @job.no_reverse + options[:local_pkgs] = local_pkgs + options[:dist] = @job.get_project().dist_name + options[:user] = "admin@user" + options[:is_rev_build] = @job.is_rev_build_check_job() + options[:dock] = Utils.create_uniq_name() + + ret = build( options ) # reset job @job = nil @@ -77,18 +87,15 @@ class RemoteBuilder # build - def build( git_repos, source_path, os, is_rev_build, srcinfo, no_reverse, local_pkgs, dist_name, user_email ) + def build( options ) @log.info( "Start to build on remote server...", Log::LV_USER ) - # create unique dock number - dock = Utils.create_uniq_name() - # send local packages begin @server.add_file_transfer() - local_pkgs.each do |pkg_path| + options[:local_pkgs].each do |pkg_path| @log.info( "Sending file... : #{pkg_path}", Log::LV_USER ) - result = send_file_to_remote( pkg_path, dock ) + result = send_file_to_remote( pkg_path, options[:dock] ) if not result then @log.error( "File transfering failed!", Log::LV_USER ) @server.remove_file_transfer() @@ -102,14 +109,13 @@ class RemoteBuilder # send build request @log.info( "Sending build request to remote server...", Log::LV_USER ) - result = send_build_request(git_repos, os, is_rev_build, - srcinfo, no_reverse, local_pkgs, dock, dist_name, user_email) + result = send_build_request( options ) if not result then @log.error( "Building job request on remote server failed!", Log::LV_USER ) return false end - result, result_files = send_monitor_request(is_rev_build) + result, result_files = send_monitor_request(options[:is_rev_build]) if not result then @log.error( "Building job on remote server failed!", Log::LV_USER ) @@ -131,7 +137,7 @@ class RemoteBuilder # receive binary package result_files.each do |file_name| @log.info( "Receiving file from remote server : #{file_name}", Log::LV_USER ) - result = receive_file_from_remote( "#{source_path}/#{file_name}", dock ) + result = receive_file_from_remote( "#{options[:src_path]}/#{file_name}", options[:dock] ) if not result then @log.error( "File transfering failed! : #{file_name}", Log::LV_USER ) return false @@ -142,6 +148,23 @@ class RemoteBuilder end + protected + def init_options() + options = {} + options[:git_repos] = nil + options[:git_commit] = nil + options[:src_path] = nil + options[:os] = nil + options[:noreverse] = false + options[:local_pkgs] = [] + options[:dist] = nil + options[:user] = "admin@user" + options[:is_rev_build] = false + + return options + end + + # upload binary packages that is need to be overwrite # before remote package protected @@ -179,55 +202,68 @@ class RemoteBuilder # send build request protected - def send_build_request(git_repos, os, is_rev_build, commit, no_reverse, local_pkgs, dock, dist_name, user_email) - - client = BuildCommClient.create( @addr, @port, @log ) - if client.nil? then - @log.error( "Creating communication client failed!", Log::LV_USER) - return false - end - - # get local package names - local_pkg_names = local_pkgs.map { |path| File.basename(path) } - - # send - # 0 | 1 | 2 | 3 | 4| 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 - # format: BUILD|GIT|repository|passwd|os|async|no_reverse|dist_name|user_email|rebuild|internal|rev-build|commit|pkgs|dock_num - # value : BUILD|GIT|repository| |os|NO |no_reverse|dist_name|user_email|YES |YES |rev-build|commit|pkgs|dock_num + def send_build_request( options ) result = true - commit = commit.nil? ? "":commit - pkg_list = local_pkg_names.join(",") - rev = is_rev_build ? "YES":"NO" - msg = "BUILD|GIT|#{git_repos}||#{os}|NO|#{no_reverse}|#{dist_name}|#{user_email}|NO|YES|#{rev}|#{commit}|#{pkg_list}|#{dock}" - result = client.send( msg ) - if not result then - @log.error( "Communication failed! #{client.get_error_msg()}", Log::LV_USER) - return false - end + begin + client = BuildCommClient.create( @addr, @port, @log ) + if client.nil? then + raise BuildServerException.new("ERR018"), "#{@addr}:#{@port}" + end - job_id = nil - result = client.read_lines do |line| - if line.strip.start_with?("=JOB_START") then - @job.remote_id = line.strip.split(",")[1] - next + # send + commit = options[:git_commit].nil? ? "":options[:git_commit] + pkg_list = options[:local_pkgs].map { |path| File.basename(path) }.join(",") + # format: BUILD|GIT|repository|passwd|os|async| + # no_reverse|dist_name| + # user_email|rebuild|internal|rev-build| + # commit|pkgs|dock_num + msg = "BUILD|GIT|#{options[:git_repos]}||#{options[:os]}|NO|"+ + "#{options[:no_reverse] ? "YES" : "NO"}|#{options[:dist]}|"+ + "#{options[:user]}|NO|YES|#{options[:is_rev_build] ? "YES":"NO"}|"+ + "#{commit}|#{pkg_list}|#{options[:dock]}" + + if not client.send( msg ) then + raise BuildServerException.new("ERR020"), "#{client.get_error_msg()}" + end + + job_id = nil + job_status = "" + job_error = "" + result = client.read_lines do |line| + if line.strip.start_with?("=JOB_START") then + job_id = line.strip.split(",")[1] + elsif line.strip.start_with?("=JOB_STATUS") then + data = line.strip.split(",") + job_status = data[1] + job_error = data[2] + else + @log.output( line.strip, Log::LV_USER) + end end - # write log first - @log.output( line.strip, Log::LV_USER) - end - if not result then - @log.error( "Communication failed! #{client.get_error_msg()}", Log::LV_USER) - elsif @job.remote_id.nil? then + if not result then + raise BuildServerException.new("ERR019"), "#{client.get_error_msg()}" + elsif job_id.nil? then + raise BuildServerException.new("ERR019"), "#{job_error}" + end + + @job.remote_id = job_id + @job.remote_status = job_status + @job.remote_error_msg = job_error + rescue BuildServerException => e + @log.error( e.err_message(""), Log::LV_USER ) + result = false + rescue => e + @log.error( "#{e.message()}", Log::LV_USER ) result = false - @log.error( "Can't find remote job id", Log::LV_USER) + ensure + client.terminate if not client.nil? end - # close socket - client.terminate - return result end + # send monitor request protected def send_monitor_request(is_rev_build) diff --git a/src/build_server/SocketJobRequestListener.rb b/src/build_server/SocketJobRequestListener.rb index c20f605..ec7a4f5 100644 --- a/src/build_server/SocketJobRequestListener.rb +++ b/src/build_server/SocketJobRequestListener.rb @@ -963,7 +963,6 @@ class SocketJobRequestListener # get package name new_name = filename.sub(/(.*)_(.*)_(.*)\.zip/,'\1,\2,\3') pkg_name = new_name.split(",")[0] -puts "========> #{filename} , #{new_name}, #{pkg_name}" prj = @parent_server.prjmgr.get_project_from_package_name(pkg_name, dist_name) if prj.nil? then raise BuildServerException.new("ERR013"), "#{pkg_name} #{dist_name}" diff --git a/src/common/BuildComm.rb b/src/common/BuildComm.rb index e23c810..4bb603c 100644 --- a/src/common/BuildComm.rb +++ b/src/common/BuildComm.rb @@ -399,8 +399,13 @@ class BuildCommClient @error_msg = "Connection is not available!" return false end + begin + @socket.puts( msg ) + rescue => e + @error_msg = e.message + return false + end - @socket.puts( msg ) return true end @@ -408,6 +413,7 @@ class BuildCommClient # handle def read_lines(begin_timeout = nil, data_timeout = nil) + result = true begin # get first line l = nil @@ -431,7 +437,6 @@ class BuildCommClient end # get contents - result = true while true line = nil if not data_timeout.nil? then @@ -443,6 +448,8 @@ class BuildCommClient end if line.nil? then + @error_msg = "Disconnected by remote server!" + result = false break elsif line.strip == "=END" then break @@ -455,14 +462,14 @@ class BuildCommClient end rescue Timeout::Error @error_msg = "Connection timed out!" - return false + result = false rescue => e @error_msg = e.message - return false + result = false end - return true + return result end -- 2.34.1