require "FileTransferViaDirect"
require "JobLog"
require "BuildServerException"
+require "RemoteBuilder"
#option parsing
exit 1
end
- # Request build
- begin
- client = BuildCommClient.create( addr[0], addr[1], nil, 0 )
- if client.nil? then
- puts "Connection to server failed!"
- exit 1
- end
-
- cmd = "BUILD|GIT|#{option[:project]}|#{option[:passwd]}|#{option[:os]}|#{option[:async]}|#{option[:noreverse]}|#{option[:dist]}|#{option[:user]}|#{option[:rebuild]}"
-
- client.send(cmd)
-
- 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
- # print log
- puts line
- end
- end
-
- if not result then
- puts "Error: Communication failed! #{client.get_error_msg()}"
- elsif job_id.nil? then
- puts job_error
- result = false
- end
- rescue => e
- puts "ERROR: #{e}"
- exit 1
- ensure
- client.terminate if not client.nil?
- end
+ builder = RemoteBuilder.new(addr[0], addr[1], nil, nil, nil, nil)
+ options = RemoteBuilder.init_options()
+ options[:projects] = option[:project]
+ options[:passwd] = option[:passwd]
+ options[:os] = option[:os]
+ options[:noreverse] = (option[:noreverse] == "YES") ? true : false
+ options[:dist] = option[:dist]
+ options[:user] = option[:user]
+ options[:rebuild] = (option[:rebuild] == "YES") ? true : false
+ options[:async] = (option[:async] == "YES") ? true : false
+ options[:monitor_level] = Log::LV_USER
+ result = builder.build(options)
if not result then exit(-1) end
- # Query log in case sync
- job_status = ""
- job_error = ""
- if result and option[:async].eql? "NO" then
- begin
- result = JobLog.monitor(addr[0], addr[1], job_id) do |line,status,errmsg|
- job_status = status
- job_error = errmsg
- if line.nil? then
- next
- end
-
- category, level, contents = JobLog.parse_log(line)
- if level < Log::LV_USER then next end
-
- if category == "INFO" then
- puts "Info: #{contents}"
- elsif category == "WARN" then
- puts "Warn: #{contents}"
- elsif category == "ERROR" then
- puts "Error: #{contents}"
- else
- next
- end
- end
-
- # Check job status
- if not job_status.eql? "FINISHED" then
- result = false
- end
- rescue BuildServerException => e
- puts e.err_message()
- result = false
- rescue => e
- puts "ERROR: #{e}"
- result = false
- end
- end
-
- if not result then exit(1) end
-
when "query"
result = Utils.parse_server_addr(option[:domain])
if result.nil? then
class RemoteBuilder
- attr_accessor :id, :log
+ attr_accessor :log
# initialize
- def initialize( id, server,ftp_addr, ftp_port, ftp_username, ftp_passwd)
- @id = id
- @server = server
- @addr = server.ip
- @port = server.port
+ def initialize( addr, port ,ftp_addr, ftp_port, ftp_username, ftp_passwd)
+ @addr = addr
+ @port = port
@ftp_addr = ftp_addr
@ftp_port = ftp_port
@ftp_username = ftp_username
@ftp_passwd = ftp_passwd
- @log = DummyLog.new
+
+ @log = StandardOutLogPrinter.new
@job = nil
end
+ def RemoteBuilder.create_from_server(rserver, ftp_addr, ftp_port, ftp_username, ftp_passwd)
+
+ return RemoteBuilder.new(rserver.ip, rserver.port, ftp_addr, ftp_port, ftp_username, ftp_passwd)
+ end
+
+
# build_job
def build_job( job, local_pkgs )
# set job
@log = job.log
# build
- options = init_options()
+ options = RemoteBuilder.init_options()
options[:git_repos] = @job.get_project().repository
options[:git_commit] = @job.git_commit
options[:src_path] = @job.source_path
options[:user] = "admin@user"
options[:is_rev_build] = @job.is_rev_build_check_job()
options[:dock] = Utils.create_uniq_name()
-
+ options[:save_local] = @job.is_rev_build_check_job() ? false : true
ret = build( options )
# reset job
# build
def build( options )
- @log.info( "Start to build on remote server...", Log::LV_USER )
+ @log.info( "Start to build on remote server...", Log::LV_USER ) if not @job.nil?
- # send local packages
- begin
- @server.add_file_transfer()
- options[:local_pkgs].each do |pkg_path|
- @log.info( "Sending file... : #{pkg_path}", Log::LV_USER )
- 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()
- return false
+ # send local packages if build is invoked from JOB
+ if not @job.nil? and not options[:local_pkgs].empty? then
+ begin
+ @job.get_remote_server().add_file_transfer()
+ options[:local_pkgs].each do |pkg_path|
+ @log.info( "Sending file... : #{pkg_path}", Log::LV_USER )
+ result = send_file_to_remote( pkg_path, options[:dock] )
+ if not result then
+ @log.error( "File transfering failed!", Log::LV_USER )
+ @job.get_remote_server().remove_file_transfer()
+ return false
+ end
end
+ ensure
+ @job.get_remote_server().remove_file_transfer()
end
- ensure
- @server.remove_file_transfer()
end
# send build request
- @log.info( "Sending build request to remote server...", Log::LV_USER )
+ @log.info( "Sending build request to remote server...", Log::LV_USER ) if not @job.nil?
- result = send_build_request( options )
+ result, job_id, job_error = send_build_request( options )
if not result then
- @log.error( "Building job request on remote server failed!", Log::LV_USER )
+ @log.error( job_error, Log::LV_USER ) if not job_error.nil?
+ @log.error( "Building job request on remote server failed!", Log::LV_USER ) if not @job.nil?
return false
end
- result, result_files = send_monitor_request(options[:is_rev_build])
+ if options[:async] then return result end
+
+ result, result_files = send_monitor_request(job_id, options[:monitor_level])
if not result then
@log.error( "Building job on remote server failed!", Log::LV_USER )
#Cancel remote job
- begin
- client = BuildCommClient.create( @addr, @port, @log )
- if not client.nil? then
- client.send "CANCEL|#{@job.remote_id}|#{@job.get_project.passwd}|admin@user"
- client.receive_data()
- client.terminate
+ if not @job.nil? then
+ begin
+ client = BuildCommClient.create( @addr, @port, @log )
+ if not client.nil? then
+ client.send "CANCEL|#{@job.remote_id}|#{@job.get_project.passwd}|admin@user"
+ client.receive_data()
+ client.terminate
+ end
+ rescue e
+ @log.error(e, Log::LV_USER)
end
- rescue e
- @log.error(e, Log::LV_USER)
end
return false
end
- # 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( "#{options[:src_path]}/#{file_name}", options[:dock] )
- if not result then
- @log.error( "File transfering failed! : #{file_name}", Log::LV_USER )
- return false
+ # receive binary package if not reverse build
+ if options[:save_local] then
+ result_files.each do |file_name|
+ @log.info( "Receiving file from remote server : #{file_name}", Log::LV_USER )
+ 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
end
end
protected
- def init_options()
+ def RemoteBuilder.init_options()
options = {}
+ options[:projects] = nil
+ options[:passwd] = nil
options[:git_repos] = nil
options[:git_commit] = nil
options[:src_path] = nil
options[:dist] = nil
options[:user] = "admin@user"
options[:is_rev_build] = false
+ options[:rebuild] = false
+ options[:save_local] = false
+ options[:async] = false
+ options[:monitor_level] = Log::LV_NORMAL
return options
end
protected
def send_build_request( options )
result = true
+ job_id = nil
+ job_status = ""
+ job_error = nil
+
begin
client = BuildCommClient.create( @addr, @port, @log )
if client.nil? then
raise BuildServerException.new("ERR018"), "#{@addr}:#{@port}"
end
- # 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 options[:git_repos].nil? then
+ 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]}"
+ else
+ # format: BUILD|GIT|project_list|passwd|
+ # os|async|
+ # no_reverse|dist_name|
+ # user_email|
+ # rebuild
+ msg = "BUILD|GIT|#{options[:projects]}|#{options[:passwd]}|"+
+ "#{options[:os]}|"+
+ "#{options[:async] ? "YES" : "NO"}|"+
+ "#{options[:no_reverse] ? "YES" : "NO"}|#{options[:dist]}|"+
+ "#{options[:user]}|"+
+ "#{options[:rebuild] ? "YES" : "NO"}"
+ end
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]
if not result then
raise BuildServerException.new("ERR019"), "#{client.get_error_msg()}"
- elsif job_id.nil? then
- raise BuildServerException.new("ERR019"), "#{job_error}"
+ end
+ if job_id.nil? then
+ result = false
end
- @job.remote_id = job_id
- @job.remote_status = job_status
- @job.remote_error_msg = job_error
+ @job.remote_id = job_id if not @job.nil?
+ @job.remote_status = job_status if not @job.nil?
+ @job.remote_error_msg = job_error if not @job.nil?
rescue BuildServerException => e
@log.error( e.err_message(""), Log::LV_USER )
result = false
client.terminate if not client.nil?
end
- return result
+ return result, job_id, job_error
end
# send monitor request
protected
- def send_monitor_request(is_rev_build)
+ def send_monitor_request(job_id, min_level)
result_files = []
result = true
+ job_status = "JUST_CREATED"
begin
- result = JobLog.monitor(@addr, @port,@job.remote_id) do |line,status,errmsg|
- @job.remote_status = status
- @job.remote_error_msg = errmsg
+ result = JobLog.monitor(@addr, @port, job_id) do |line,status,errmsg|
+ job_status = status
+ @job.remote_status = status if not @job.nil?
+ @job.remote_error_msg = errmsg if not @job.nil?
if line.nil? then
next
end
category, level, contents = JobLog.parse_log(line)
+ if level < min_level then next end
if category == "INFO" then
@log.info( contents, level )
# gather result files if not reverse build
- if not is_rev_build and line =~ /Creating package file \.\.\. (.*)/ then
+ if line =~ /Creating package file \.\.\. (.*)/ then
file_name = $1
result_files.push file_name
end
result = false
end
- if @job.remote_status != "FINISHED" then
- @log.error( "Remote job is finished with \"#{@job.remote_status}\"! #{@job.remote_error_msg}", Log::LV_USER)
+ if job_status != "FINISHED" then
+ if not @job.nil? then
+ @log.error( "Remote job is finished with \"#{@job.remote_status}\"! #{@job.remote_error_msg}", Log::LV_USER)
+ end
result = false
end