[Title] Refactored the code for remote build request
authordonghee yang <donghee.yang@samsung.com>
Tue, 2 Apr 2013 06:40:48 +0000 (15:40 +0900)
committerdonghee yang <donghee.yang@samsung.com>
Tue, 2 Apr 2013 06:40:48 +0000 (15:40 +0900)
src/build_server/BuildServerException.rb
src/build_server/RemoteBuilder.rb
src/build_server/SocketJobRequestListener.rb
src/common/BuildComm.rb

index 966c18d3bc9855c120df84f04280186470f3125d..08d82a2d2fe8c0ec7e3de4fc72eb329856193580 100644 (file)
@@ -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!"
index 8e3bea182dcc4aeae041a5a80118ffcc5c966501..f10c73e4394e7aca4b5b1df0010cb73a6a3c0502 100644 (file)
@@ -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)
index c20f60544c9178d9bf2550c6e5db13f5696bed04..ec7a4f586893b8ed3e1c6f9b945093b652c5914d 100644 (file)
@@ -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}"
index e23c8108da3004119442a3e1719ef54f8b59a6e7..4bb603cd0f74f2c867df1633328e4e6885d1c4b0 100644 (file)
@@ -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