@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
# 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()
# 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 )
# 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
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
# 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)