[Title] remove resolve
authorjiil.hyoun <jiil.hyoun@samsung.com>
Tue, 29 Jan 2013 02:04:11 +0000 (11:04 +0900)
committerjiil.hyoun <jiil.hyoun@samsung.com>
Tue, 29 Jan 2013 02:04:11 +0000 (11:04 +0900)
[Type] Feature
[Module] Toolchain /
[Priority] Major
[Jira#]
[Redmine#]
[Problem]
[Cause]
[Solution]
[TestCase]

Change-Id: I27f98015a7bd063ba693737933f111b506ab372b

12 files changed:
build-cli
src/build_server/BuildClientOptionParser.rb
src/build_server/BuildJob.rb
src/build_server/JobManager.rb
src/build_server/ReverseBuildChecker.rb
src/build_server/SocketJobRequestListener.rb
test/build-server.basic1/build-cli-01.testcase
test/build-server.basic1/testsuite
test/build-server.multi-svr1/buildsvr1.init
test/build-server.multi-svr2/buildsvr.init
test/build-server.multi_dist2/build-svr3-03.testcase
test/build-server.multi_dist2/buildsvr.init

index fb9758e2be8d7efbad2e182a6795bd82ec67a559..aae884d4f60184f9821f83fc732727d26f38b678 100755 (executable)
--- a/build-cli
+++ b/build-cli
@@ -171,22 +171,22 @@ begin
                        puts "Connection to server failed!"
                        exit 1
                end
-       when "resolve"
-               result = Utils.parse_server_addr(option[:domain])
-               if result.nil? then
-                       puts "Server address is incorrect. (#{option[:domain]})"
-                       puts "Tune as following format."
-                       puts " <ip>:<port>"
-                       exit 1
-               end
-               client = BuildCommClient.create( result[0], result[1], nil, 0 )
-               if not client.nil? then
-                       client.send "RESOLVE|GIT|#{option[:project]}|#{option[:passwd]}|#{option[:os]}|#{option[:async]}|#{option[:dist]}|#{option[:user]}|#{option[:verbose]}"
-                       if not client.print_stream then
-                               puts "ERROR: #{client.get_error_msg()}"
-                       end
-                       client.terminate
-               end
+#      when "resolve"
+#              result = Utils.parse_server_addr(option[:domain])
+#              if result.nil? then
+#                      puts "Server address is incorrect. (#{option[:domain]})"
+#                      puts "Tune as following format."
+#                      puts " <ip>:<port>"
+#                      exit 1
+#              end
+#              client = BuildCommClient.create( result[0], result[1], nil, 0 )
+#              if not client.nil? then
+#                      client.send "RESOLVE|GIT|#{option[:project]}|#{option[:passwd]}|#{option[:os]}|#{option[:async]}|#{option[:dist]}|#{option[:user]}|#{option[:verbose]}"
+#                      if not client.print_stream then
+#                              puts "ERROR: #{client.get_error_msg()}"
+#                      end
+#                      client.terminate
+#              end
        when "query"
                result = Utils.parse_server_addr(option[:domain])
                if result.nil? then
index 63fb3da215e59ee23b62ca2154c3a91b35acc503..81d58e9f354570fc7c17f375ea5670fae90ca17c 100644 (file)
@@ -32,7 +32,7 @@ require 'utils'
 
 class BuildClientUsage
        BUILD="build-cli build -N <project name> -d <server address> [-o <os>] [-w <password>] [--async] [-D <distribution name>] [-U user-email] [-V]"
-       RESOLVE="build-cli resolve -N <project name> -d <server address> [-o <os>] [-w <password>] [--async] [-D <distribution name>] [-U user-email] [-V]"
+       #RESOLVE="build-cli resolve -N <project name> -d <server address> [-o <os>] [-w <password>] [--async] [-D <distribution name>] [-U user-email] [-V]"
        QUERY="build-cli query -d <server address>"
        QUERY_SYSTEM="build-cli query-system -d <server address>"
        QUERY_PROJECT="build-cli query-project -d <server address>"
@@ -51,12 +51,12 @@ def option_error_check( options )
                        raise ArgumentError, "Usage: " + BuildClientUsage::BUILD
                end
 
-       when "resolve" then
-               if options[:project].nil? or options[:project].empty? or
-                       options[:domain].nil?  or options[:domain].empty? then
-                       raise ArgumentError, "Usage: " + BuildClientUsage::RESOLVE
-               end
-
+#      when "resolve" then
+#              if options[:project].nil? or options[:project].empty? or
+#                      options[:domain].nil?  or options[:domain].empty? then
+#                      raise ArgumentError, "Usage: " + BuildClientUsage::RESOLVE
+#              end
+#
        when "query" then
                if options[:domain].nil? or options[:domain].empty? then
                        raise ArgumentError, "Usage: " + BuildClientUsage::QUERY
@@ -103,7 +103,6 @@ def option_parse
                + "\n" + "Usage: build-cli <SUBCOMMAND> [OPTS] or build-cli (-h|-v)" + "\n" \
                + "\n" + "Subcommands:" + "\n" \
                + "\t" + "build         Build and create package." + "\n" \
-               + "\t" + "resolve       Request change to resolve-status for build-conflict." + "\n" \
                + "\t" + "query         Query information about build-server." + "\n" \
                + "\t" + "query-system  Query system information about build-server." + "\n" \
                + "\t" + "query-project Query project information about build-server." + "\n" \
@@ -112,7 +111,6 @@ def option_parse
                + "\t" + "register      Register the package to the build-server." + "\n" \
                + "\n" + "Subcommand usage:" + "\n" \
                + "\t" + BuildClientUsage::BUILD + "\n" \
-               + "\t" + BuildClientUsage::RESOLVE + "\n" \
                + "\t" + BuildClientUsage::QUERY + "\n" \
                + "\t" + BuildClientUsage::QUERY_SYSTEM + "\n" \
                + "\t" + BuildClientUsage::QUERY_PROJECT + "\n" \
@@ -120,6 +118,8 @@ def option_parse
                + "\t" + BuildClientUsage::CANCEL + "\n" \
                + "\t" + BuildClientUsage::REGISTER + "\n" \
                + "\n" + "Options:" + "\n"
+               #+ "\t" + "resolve       Request change to resolve-status for build-conflict." + "\n" \
+               #+ "\t" + BuildClientUsage::RESOLVE + "\n" \
 
        optparse = OptionParser.new(nil, 32, ' '*8) do|opts|
 
@@ -203,7 +203,7 @@ def option_parse
 
        cmd = ARGV[0]
 
-       if cmd.eql? "build" or cmd.eql? "resolve" or
+       if cmd.eql? "build" or #cmd.eql? "resolve" or
                cmd.eql? "query" or cmd.eql? "query-system" or
                cmd.eql? "query-project" or cmd.eql? "query-job" or
                cmd.eql? "cancel" or
@@ -227,3 +227,7 @@ def option_parse
        return options
 end
 
+I, [2013-01-29T10:51:55.734874 #22762]  INFO -- : sh: build_server/BinaryUploadProject.rb: Permission denied
+
+I, [2013-01-29T10:52:30.442258 #22796]  INFO -- : sh: src/build_server/BinaryUploadProject.rb: Permission denied
+
index 71c348524f23f25af07a1a0cb1c189fbcfe082fe..ddb14e215a1c0376a6a474a96942cc6a7cd24338 100644 (file)
@@ -46,8 +46,9 @@ class BuildJob < CommonJob
 
        attr_accessor :pkginfo, :source_path
        attr_accessor :pkgsvr_client, :thread
-       attr_accessor :rev_fail_projects, :rev_success_jobs
-       attr_accessor :pending_ancestor, :cancel_state
+#      attr_accessor :rev_fail_projects, :rev_success_jobs
+       #attr_accessor :pending_ancestor, :cancel_state
+       attr_accessor :cancel_state
        attr_accessor :no_reverse
        attr_accessor :remote_id
 
@@ -59,7 +60,7 @@ class BuildJob < CommonJob
                @type = "BUILD"
 
                @cancel_state = "NONE"
-               @resolve = false
+               #@resolve = false
                @host_os = Utils::HOST_OS
                if not @server.distmgr.nil? then
                        @pkgsvr_url = @server.distmgr.get_distribution(project.dist_name).pkgsvr_url
@@ -83,13 +84,13 @@ class BuildJob < CommonJob
                @parent = nil # for job hierachy
 
                #for cancel operation
-               @pending_ancestor = nil # for cancel pending job
+               #@pending_ancestor = nil # for cancel pending job
                @remote_id = nil # for cancel remote_working job
                @build_dep_prjs = nil # for cacnel pending job
 
-               # for resolving build-break
-               @rev_fail_projects = [] # list of [project,os]
-               @rev_success_jobs = [] # list of job
+               ## for resolving build-break
+               #@rev_fail_projects = [] # list of [project,os]
+               #@rev_success_jobs = [] # list of job
 
                # remote build
                @remote_server = nil
@@ -157,10 +158,10 @@ class BuildJob < CommonJob
        end
 
 
-       # set option for waiting for resolve
-       def set_resolve_flag()
-               @resolve = true
-       end
+       ## set option for waiting for resolve
+       #def set_resolve_flag()
+       #       @resolve = true
+       #end
 
 
        # set force rebuild
@@ -215,36 +216,36 @@ class BuildJob < CommonJob
                                end
                                client.terminate
                        end
-               when "PENDING" then
-                       if @pending_ancestor.nil? then
-                               #resolve pending job
-                               pending_descendants = @server.jobmgr.jobs.select do |j|
-                                       (not j.pending_ancestor.nil?) and "#{j.pending_ancestor.id}" == "#{@id}"
-                               end
-                               pending_descendants.each do |pd|
-                                       pd.cancel_state = "INIT"
-                               end
-                       else
-                               # remove myself from success job if exist
-                               # and add myself into rev_fail_project list if not exist
-                               @pending_ancestor.remove_rev_success_job(self)
-                               @pending_ancestor.add_rev_fail_project( @project, @os )
-
-                               # remove the project that depends on me if exist
-                               # and add it into rev_fail_project list if not exist
-                               p_sub_jobs = @server.jobmgr.jobs.select do |j|
-                                       ( not j.pending_ancestor.nil? and
-                                        "#{j.pending_ancestor.id}" == "#{@pending_ancestor.id}" and
-                                        j.is_build_dependent_project(@project, @os) )
-                               end
-                               p_sub_jobs.each do |d|
-                                       @pending_ancestor.remove_rev_success_job(d)
-                                       @pending_ancestor.add_rev_fail_project( d.get_project, d.os )
-
-                                       if not d.thread.nil? then d.thread.terminate end
-                                       d.status = "WAITING"
-                               end
-                       end
+               #when "PENDING" then
+               #       if @pending_ancestor.nil? then
+               #               #resolve pending job
+               #               pending_descendants = @server.jobmgr.jobs.select do |j|
+               #                       (not j.pending_ancestor.nil?) and "#{j.pending_ancestor.id}" == "#{@id}"
+               #               end
+               #               pending_descendants.each do |pd|
+               #                       pd.cancel_state = "INIT"
+               #               end
+               #       else
+               #               # remove myself from success job if exist
+               #               # and add myself into rev_fail_project list if not exist
+               #               @pending_ancestor.remove_rev_success_job(self)
+               #               @pending_ancestor.add_rev_fail_project( @project, @os )
+
+               #               # remove the project that depends on me if exist
+               #               # and add it into rev_fail_project list if not exist
+               #               p_sub_jobs = @server.jobmgr.jobs.select do |j|
+               #                       ( not j.pending_ancestor.nil? and
+               #                        "#{j.pending_ancestor.id}" == "#{@pending_ancestor.id}" and
+               #                        j.is_build_dependent_project(@project, @os) )
+               #               end
+               #               p_sub_jobs.each do |d|
+               #                       @pending_ancestor.remove_rev_success_job(d)
+               #                       @pending_ancestor.add_rev_fail_project( d.get_project, d.os )
+
+               #                       if not d.thread.nil? then d.thread.terminate end
+               #                       d.status = "WAITING"
+               #               end
+               #       end
                when "WORKING", "WAITING" , "INITIALIZING" , "JUST_CREATED" then
                        #just log
                else # ERROR | FINISHED | RESOLVED
@@ -413,54 +414,54 @@ class BuildJob < CommonJob
        end
 
 
-       # remove job from reverse success job
-       def remove_rev_success_job( job )
-               @rev_success_jobs.delete job if @rev_success_jobs.include? job
-       end
+       ## remove job from reverse success job
+       #def remove_rev_success_job( job )
+       #       @rev_success_jobs.delete job if @rev_success_jobs.include? job
+       #end
 
 
-       # check [project,os] is in reverse fail project list
-       def is_rev_fail_project( prj, os )
-               # check the project already exist
-               @rev_fail_projects.each do |p|
-                       if p[0] == prj and p[1] == os then
-                               return true
-                       end
-               end
+       ## check [project,os] is in reverse fail project list
+       #def is_rev_fail_project( prj, os )
+       #       # check the project already exist
+       #       @rev_fail_projects.each do |p|
+       #               if p[0] == prj and p[1] == os then
+       #                       return true
+       #               end
+       #       end
 
-               return false
-       end
+       #       return false
+       #end
 
 
-       # add [project,os] to reverse fail project list
-       def add_rev_fail_project( prj, os )
-               # check the project already exist
-               @rev_fail_projects.each do |p|
-                       if p[0] == prj and p[1] == os then
-                               return
-                       end
-               end
-               # if not, add it
-               @rev_fail_projects.push [prj,os]
-       end
+       ## add [project,os] to reverse fail project list
+       #def add_rev_fail_project( prj, os )
+       #       # check the project already exist
+       #       @rev_fail_projects.each do |p|
+       #               if p[0] == prj and p[1] == os then
+       #                       return
+       #               end
+       #       end
+       #       # if not, add it
+       #       @rev_fail_projects.push [prj,os]
+       #end
 
 
-       # remove [project,os] from reverse fail project list
-       def remove_rev_fail_project( prj, os )
-               remove_list = []
+       ## remove [project,os] from reverse fail project list
+       #def remove_rev_fail_project( prj, os )
+       #       remove_list = []
 
-               # check project and os name
-               @rev_fail_projects.each do |p|
-                       if p[0] == prj and p[1] == os then
-                               remove_list.push p
-                       end
-               end
+       #       # check project and os name
+       #       @rev_fail_projects.each do |p|
+       #               if p[0] == prj and p[1] == os then
+       #                       remove_list.push p
+       #               end
+       #       end
 
-               # remove
-               remove_list.each do |r|
-                       @rev_fail_projects.delete r
-               end
-       end
+       #       # remove
+       #       remove_list.each do |r|
+       #               @rev_fail_projects.delete r
+       #       end
+       #end
 
 
        # get project that my job is dependent on
@@ -673,44 +674,47 @@ class BuildJob < CommonJob
        # build clean
        def     build()
 
-               # check there are pending packages which wait for me
-               # it will return nil if not exist
-               # this process must be skip if it is sub-job
-               if not @is_rev_build_check_job and not @is_internal_job then
-                       @server.cancel_lock.synchronize do
-                               @pending_ancestor = get_pending_ancestor_job()
-                       end
-               end
+               ## check there are pending packages which wait for me
+               ## it will return nil if not exist
+               ## this process must be skip if it is sub-job
+               #if not @is_rev_build_check_job and not @is_internal_job then
+               #       @server.cancel_lock.synchronize do
+               #               @pending_ancestor = get_pending_ancestor_job()
+               #       end
+               #end
+
+               #if not @pending_ancestor.nil? then
+               #       # resolve other pending job
+               #       resolve()
+               #elsif @resolve then
+               #       # wait for being resolved by other jobs
+               #       # this condition must be placed after checking pending status
+               #       wait_resolve()
+               #else
+               #       # build
+               #       build_normal()
+               #end
 
-               if not @pending_ancestor.nil? then
-                       # resolve other pending job
-                       resolve()
-               elsif @resolve then
-                       # wait for being resolved by other jobs
-                       # this condition must be placed after checking pending status
-                       wait_resolve()
-               else
-                       # build
-                       build_normal()
-               end
+               # build
+               build_normal()
        end
 
 
-       # return pending job that wait for me
-       def get_pending_ancestor_job()
-               @server.jobmgr.get_pending_jobs.each do |job|
-                       # must have same distribution
-                       if get_distribution_name() != job.get_distribution_name() then
-                               next
-                       end
+       ## return pending job that wait for me
+       #def get_pending_ancestor_job()
+       #       @server.jobmgr.get_pending_jobs.each do |job|
+       #               # must have same distribution
+       #               if get_distribution_name() != job.get_distribution_name() then
+       #                       next
+       #               end
 
-                       if job.is_rev_fail_project(@project,@os) then
-                               return job
-                       end
-               end
+       #               if job.is_rev_fail_project(@project,@os) then
+       #                       return job
+       #               end
+       #       end
 
-               return nil
-       end
+       #       return nil
+       #end
 
 
        # check whether build this job or not
@@ -854,172 +858,172 @@ class BuildJob < CommonJob
        end
 
 
-       # wait to be resolved by other jobs
-       def wait_resolve()
-               @log.info( "Started to build this job and wait for being resolved...", Log::LV_USER)
-
-               # create builder
-               if @is_remote_job then
-                       builder = RemoteBuilder.new("JB#{@id}", @remote_server, @server.ftp_addr, @server.ftp_port, @server.ftp_username, @server.ftp_passwd)
-                       @log.info( "JobBuilder##{@id} is created", Log::LV_USER)
-                       @log.info( " - Remote Server : #{@remote_server.ip}:#{@remote_server.port}" )
-                       if not @server.ftp_addr.nil? then
-                               @log.info( " - FTP Server : #{@server.ftp_addr}" )
-                       end
-               else
-                       builder = Builder.create( "JB#{@id}", @pkgsvr_url, nil,
-                                                                        "#{@buildroot_dir}/#{@os}", @server.build_cache_dir )
-                       if builder.nil?
-                               @log.error( "Creating job builder failed", Log::LV_USER)
-                               return false
-                       end
-                       @log.info( "JobBuilder##{@id} is created", Log::LV_USER)
-                       @log.info( " - Package Server : #{@pkgsvr_url}" )
-                       @log.info( " - Build Cache Path : #{@server.build_cache_dir}" )
-               end
-               @log.info( " - Log Path : #{@log.path}" )
-
-               # build
-               if @is_remote_job then
-                       result = builder.build_job(self, [])
-               else
-                       result =  builder.build_job(self, true, [], false )
-               end
-               if not result then
-                       @log.error( "Building job failed", Log::LV_USER)
-                       write_log_url()
-                       return false
-               end
-
-               # check reverse dependecy
-               @rev_fail_projects = ReverseBuildChecker.check(self, false)
-               if @rev_fail_projects.empty? then
-                       # if no problem?, it OK
-                       return true
-               end
-
-               # pending
-               @status = "PENDING"
-               @log.info( "Entered the PENDING state ...", Log::LV_USER)
-               old_msg = ""
-               while @status == "PENDING"
-                       new_msg = @rev_fail_projects.map {|p| "#{p[0].name}(#{p[1]})"}.join(", ")
-                       if old_msg != new_msg then
-                               @log.error( " * Waiting for building next projects: #{new_msg}", Log::LV_USER)
-                               old_msg = new_msg
-                       end
-                       sleep 1
-               end
-
-               return true
-       end
-
-
-       # resolve other pending job
-       def     resolve()
-
-               # wait for other build-dependent projects are resolved
-               old_msg = ""
-               wait_prjs = @pending_ancestor.rev_fail_projects.select {|p| is_build_dependent_project(p[0], p[1])}
-               @log.info("Checking build dependency before RESOLVE", Log::LV_USER)
-               while not wait_prjs.empty?
-                       @status = "PENDING"
-                       new_msg = wait_prjs.map {|p| "#{p[0].name}(#{p[1]})"}.join(", ")
-                       if new_msg != old_msg then
-                               @log.info(" * Waiting for building next projects: #{new_msg}", Log::LV_USER)
-                               old_msg = new_msg
-                       end
-                       sleep 1
-                       wait_prjs = @pending_ancestor.rev_fail_projects.select {|p| is_build_dependent_project(p[0], p[1])}
-               end
-
-               # return back to "WORKING"
-               @status = "WORKING"
-
-               @log.info( "Started to build this job and resolve other pending job...", Log::LV_USER)
-
-               # create builder
-               if @is_remote_job then
-                       builder = RemoteBuilder.new("JB#{@id}", @remote_server, @server.ftp_addr, @server.ftp_port, @server.ftp_username, @server.ftp_passwd)
-                       @log.info( "JobBuilder##{@id} is created", Log::LV_USER)
-                       @log.info( " - Remote Server : #{@remote_server.ip}:#{@remote_server.port}" )
-                       if not @server.ftp_addr.nil? then
-                               @log.info( " - FTP Server : #{@server.ftp_addr}" )
-                       end
-               else
-                       builder = Builder.create( "JB#{@id}", @pkgsvr_url, nil,
-                                                                        "#{@buildroot_dir}/#{@os}", @server.build_cache_dir )
-                       if builder.nil?
-                               @log.error( "Creating job builder failed", Log::LV_USER)
-                               return false
-                       end
-                       @log.info( "JobBuilder##{@id} is created", Log::LV_USER)
-                       @log.info( " - Package Server : #{@pkgsvr_url}" )
-                       @log.info( " - Build Cache Path : #{@server.build_cache_dir}" )
-               end
-               @log.info( " - Log Path : #{@log.path}" )
-
-               # get local packages to overwite
-               # they must be composed of packages of pending jobs and its success list
-               local_pkgs=[]
-               local_pkgs += @external_pkgs
-               src_path = @pending_ancestor.source_path
-               ver = @pending_ancestor.pkginfo.get_version()
-               @pending_ancestor.pkginfo.get_target_packages(@os).each do |pkg|
-                       local_pkgs.push "#{src_path}/#{pkg.package_name}_#{ver}_#{@os}.zip"
-               end
-               @pending_ancestor.rev_success_jobs.each do |job|
-                       src_path = job.source_path
-                       ver = job.pkginfo.get_version()
-                       job.pkginfo.get_target_packages(@os).each do |pkg|
-                               local_pkgs.push "#{src_path}/#{pkg.package_name}_#{ver}_#{@os}.zip"
-                       end
-               end
-
-               # build
-               if @is_remote_job then
-                       result = builder.build_job(self, local_pkgs)
-               else
-                       result = builder.build_job(self, true, local_pkgs, false )
-               end
-               if not result then
-                       @log.error( "Building job failed", Log::LV_USER)
-                       write_log_url()
-                       return false
-               end
-
-               # check reverse dependecy and update parent rev_fail_project list
-               new_fail_projects = ReverseBuildChecker.check(self, false)
-               new_fail_projects.each do |p|
-                       @pending_ancestor.add_rev_fail_project(p[0], p[1])
-               end
-
-               # update the status of pending job
-               @status = "PENDING"
-               @pending_ancestor.remove_rev_fail_project(@project, @os)
-               @pending_ancestor.rev_success_jobs.push self
-               if @pending_ancestor.rev_fail_projects.empty? then
-                       @pending_ancestor.status = "RESOLVED"
-                       @pending_ancestor.rev_success_jobs.each do |job|
-                               job.status = "RESOLVED"
-                       end
-               else
-                       @log.info( "Entered the PENDING state ...", Log::LV_USER)
-                       old_msg = ""
-                       while @status == "PENDING"
-                               new_msg = @pending_ancestor.rev_fail_projects.map {|p| "#{p[0].name}(#{p[1]})"}.join(", ")
-
-                               if new_msg != old_msg then
-                                       @log.info(" * Waiting for building next projects: #{new_msg}", Log::LV_USER)
-                                       old_msg = new_msg
-                               end
-
-                               sleep 1
-                       end
-               end
-
-               return true
-       end
+       ## wait to be resolved by other jobs
+       #def wait_resolve()
+       #       @log.info( "Started to build this job and wait for being resolved...", Log::LV_USER)
+
+       #       # create builder
+       #       if @is_remote_job then
+       #               builder = RemoteBuilder.new("JB#{@id}", @remote_server, @server.ftp_addr, @server.ftp_port, @server.ftp_username, @server.ftp_passwd)
+       #               @log.info( "JobBuilder##{@id} is created", Log::LV_USER)
+       #               @log.info( " - Remote Server : #{@remote_server.ip}:#{@remote_server.port}" )
+       #               if not @server.ftp_addr.nil? then
+       #                       @log.info( " - FTP Server : #{@server.ftp_addr}" )
+       #               end
+       #       else
+       #               builder = Builder.create( "JB#{@id}", @pkgsvr_url, nil,
+       #                                                                "#{@buildroot_dir}/#{@os}", @server.build_cache_dir )
+       #               if builder.nil?
+       #                       @log.error( "Creating job builder failed", Log::LV_USER)
+       #                       return false
+       #               end
+       #               @log.info( "JobBuilder##{@id} is created", Log::LV_USER)
+       #               @log.info( " - Package Server : #{@pkgsvr_url}" )
+       #               @log.info( " - Build Cache Path : #{@server.build_cache_dir}" )
+       #       end
+       #       @log.info( " - Log Path : #{@log.path}" )
+
+       #       # build
+       #       if @is_remote_job then
+       #               result = builder.build_job(self, [])
+       #       else
+       #               result =  builder.build_job(self, true, [], false )
+       #       end
+       #       if not result then
+       #               @log.error( "Building job failed", Log::LV_USER)
+       #               write_log_url()
+       #               return false
+       #       end
+
+       #       # check reverse dependecy
+       #       @rev_fail_projects = ReverseBuildChecker.check(self, false)
+       #       if @rev_fail_projects.empty? then
+       #               # if no problem?, it OK
+       #               return true
+       #       end
+
+       #       # pending
+       #       @status = "PENDING"
+       #       @log.info( "Entered the PENDING state ...", Log::LV_USER)
+       #       old_msg = ""
+       #       while @status == "PENDING"
+       #               new_msg = @rev_fail_projects.map {|p| "#{p[0].name}(#{p[1]})"}.join(", ")
+       #               if old_msg != new_msg then
+       #                       @log.error( " * Waiting for building next projects: #{new_msg}", Log::LV_USER)
+       #                       old_msg = new_msg
+       #               end
+       #               sleep 1
+       #       end
+
+       #       return true
+       #end
+
+
+       ## resolve other pending job
+       #def    resolve()
+
+       #       # wait for other build-dependent projects are resolved
+       #       old_msg = ""
+       #       wait_prjs = @pending_ancestor.rev_fail_projects.select {|p| is_build_dependent_project(p[0], p[1])}
+       #       @log.info("Checking build dependency before RESOLVE", Log::LV_USER)
+       #       while not wait_prjs.empty?
+       #               @status = "PENDING"
+       #               new_msg = wait_prjs.map {|p| "#{p[0].name}(#{p[1]})"}.join(", ")
+       #               if new_msg != old_msg then
+       #                       @log.info(" * Waiting for building next projects: #{new_msg}", Log::LV_USER)
+       #                       old_msg = new_msg
+       #               end
+       #               sleep 1
+       #               wait_prjs = @pending_ancestor.rev_fail_projects.select {|p| is_build_dependent_project(p[0], p[1])}
+       #       end
+
+       #       # return back to "WORKING"
+       #       @status = "WORKING"
+
+       #       @log.info( "Started to build this job and resolve other pending job...", Log::LV_USER)
+
+       #       # create builder
+       #       if @is_remote_job then
+       #               builder = RemoteBuilder.new("JB#{@id}", @remote_server, @server.ftp_addr, @server.ftp_port, @server.ftp_username, @server.ftp_passwd)
+       #               @log.info( "JobBuilder##{@id} is created", Log::LV_USER)
+       #               @log.info( " - Remote Server : #{@remote_server.ip}:#{@remote_server.port}" )
+       #               if not @server.ftp_addr.nil? then
+       #                       @log.info( " - FTP Server : #{@server.ftp_addr}" )
+       #               end
+       #       else
+       #               builder = Builder.create( "JB#{@id}", @pkgsvr_url, nil,
+       #                                                                "#{@buildroot_dir}/#{@os}", @server.build_cache_dir )
+       #               if builder.nil?
+       #                       @log.error( "Creating job builder failed", Log::LV_USER)
+       #                       return false
+       #               end
+       #               @log.info( "JobBuilder##{@id} is created", Log::LV_USER)
+       #               @log.info( " - Package Server : #{@pkgsvr_url}" )
+       #               @log.info( " - Build Cache Path : #{@server.build_cache_dir}" )
+       #       end
+       #       @log.info( " - Log Path : #{@log.path}" )
+
+       #       # get local packages to overwite
+       #       # they must be composed of packages of pending jobs and its success list
+       #       local_pkgs=[]
+       #       local_pkgs += @external_pkgs
+       #       src_path = @pending_ancestor.source_path
+       #       ver = @pending_ancestor.pkginfo.get_version()
+       #       @pending_ancestor.pkginfo.get_target_packages(@os).each do |pkg|
+       #               local_pkgs.push "#{src_path}/#{pkg.package_name}_#{ver}_#{@os}.zip"
+       #       end
+       #       @pending_ancestor.rev_success_jobs.each do |job|
+       #               src_path = job.source_path
+       #               ver = job.pkginfo.get_version()
+       #               job.pkginfo.get_target_packages(@os).each do |pkg|
+       #                       local_pkgs.push "#{src_path}/#{pkg.package_name}_#{ver}_#{@os}.zip"
+       #               end
+       #       end
+
+       #       # build
+       #       if @is_remote_job then
+       #               result = builder.build_job(self, local_pkgs)
+       #       else
+       #               result = builder.build_job(self, true, local_pkgs, false )
+       #       end
+       #       if not result then
+       #               @log.error( "Building job failed", Log::LV_USER)
+       #               write_log_url()
+       #               return false
+       #       end
+
+       #       # check reverse dependecy and update parent rev_fail_project list
+       #       new_fail_projects = ReverseBuildChecker.check(self, false)
+       #       new_fail_projects.each do |p|
+       #               @pending_ancestor.add_rev_fail_project(p[0], p[1])
+       #       end
+
+       #       # update the status of pending job
+       #       @status = "PENDING"
+       #       @pending_ancestor.remove_rev_fail_project(@project, @os)
+       #       @pending_ancestor.rev_success_jobs.push self
+       #       if @pending_ancestor.rev_fail_projects.empty? then
+       #               @pending_ancestor.status = "RESOLVED"
+       #               @pending_ancestor.rev_success_jobs.each do |job|
+       #                       job.status = "RESOLVED"
+       #               end
+       #       else
+       #               @log.info( "Entered the PENDING state ...", Log::LV_USER)
+       #               old_msg = ""
+       #               while @status == "PENDING"
+       #                       new_msg = @pending_ancestor.rev_fail_projects.map {|p| "#{p[0].name}(#{p[1]})"}.join(", ")
+
+       #                       if new_msg != old_msg then
+       #                               @log.info(" * Waiting for building next projects: #{new_msg}", Log::LV_USER)
+       #                               old_msg = new_msg
+       #                       end
+
+       #                       sleep 1
+       #               end
+       #       end
+
+       #       return true
+       #end
 
 
        def upload()
index dc6dbae8ee865e5ae3be300e959c581f539617a6..382c24dad49b333c995e144b4992d9ca25c551c1 100644 (file)
@@ -333,7 +333,7 @@ class JobManager
                        end
 
                        # check the connection if job is not asynchronous job
-                       if ( job.status == "WAITING" or job.status == "REMOTE_WORKING" or job.status == "PENDING") and
+                       if ( job.status == "WAITING" or job.status == "REMOTE_WORKING" ) and #or job.status == "PENDING") and
                                not job.is_asynchronous_job? and
                                not job.is_connected? then
 
@@ -478,16 +478,16 @@ class JobManager
        end
 
 
-       def get_pending_jobs
-               result = []
-               @jobs.each do |job|
-                       if job.status == "PENDING" then
-                               result.push job
-                       end
-               end
+       #def get_pending_jobs
+       #       result = []
+       #       @jobs.each do |job|
+       #               if job.status == "PENDING" then
+       #                       result.push job
+       #               end
+       #       end
 
-               return result
-       end
+       #       return result
+       #end
 
        def save_job_status(job)
                now = @server.db_now
@@ -510,7 +510,7 @@ class JobManager
                jobs.each do |job|
                        if job.cancel_state != "NONE" then next end
 
-                       if job.status == "WORKING" or job.status == "REMOTE_WORKING" or job.status == "PENDING" then
+                       if job.status == "WORKING" or job.status == "REMOTE_WORKING" then # or job.status == "PENDING" then
                                check_dep_jobs.push job
                        elsif ( check_dep_wait and job.status == "WAITING") then
                                check_dep_jobs.push job
@@ -531,10 +531,10 @@ class JobManager
                                if (cjob.status == "WORKING" or cjob.status == "REMOTE_WORKING" ) and
                                        (job.has_build_dependency?( cjob ) or job.is_compatible_with?( cjob)) then
                                        pre_jobs.push cjob
-                                       # In case that "PENDING" job is depends on me (not depended )
-                               elsif cjob.status == "PENDING"  and (not job.does_depend_on? cjob) and
-                                       (job.has_build_dependency?( cjob ) or job.is_compatible_with?( cjob)) then
-                                       pre_jobs.push cjob
+                       #       # In case that "PENDING" job is depends on me (not depended )
+                       #       elsif cjob.status == "PENDING"  and (not job.does_depend_on? cjob) and
+                       #               (job.has_build_dependency?( cjob ) or job.is_compatible_with?( cjob)) then
+                       #               pre_jobs.push cjob
                                elsif check_dep_wait and cjob.status == "WAITING" and
                                        (job.does_depend_on? cjob or
                                         (job.id > cjob.id and job.is_compatible_with? cjob) ) then
index 49dde687d1668b3a113d7e2ea467175ecc91def9..c8b3cf3cfaa725137b2b9fbb5dc5e7a5b58a9116 100644 (file)
@@ -81,22 +81,23 @@ class ReverseBuildChecker
 
                        # if not "GIT" project, ignore it
                        if rev_prj.type != "GIT" then next end
-
-                       # if job on resolve process, its unresolved project
-                       #of pending ancestor must be excluded.
-                       if job.type == "BUILD" and not job.pending_ancestor.nil? then
-                               found = false
-                               job.pending_ancestor.rev_fail_projects.each do  |fp|
-                                       f_prj = fp[0]
-                                       f_os =  fp[1]
-
-                                       if rev_prj == f_prj and rev_os == f_os then
-                                               found = true
-                                               break
-                                       end
-                               end
-                               if found then next end
-                       end
+                       found = false
+
+                       ## if job on resolve process, its unresolved project
+                       ##of pending ancestor must be excluded.
+                       #if job.type == "BUILD" and not job.pending_ancestor.nil? then
+                       #       found = false
+                       #       job.pending_ancestor.rev_fail_projects.each do  |fp|
+                       #               f_prj = fp[0]
+                       #               f_os =  fp[1]
+
+                       #               if rev_prj == f_prj and rev_os == f_os then
+                       #                       found = true
+                       #                       break
+                       #               end
+                       #       end
+                       #       if found then next end
+                       #end
 
                        # if this is sub job, all other sibling job must be excluded
                        if job.is_sub_job? then
index dc18da6f6697d66102a7dbc42627fecc86d91ec8..e711fe571890699d5de39f0ccde3d05ef9a09fba 100644 (file)
@@ -126,8 +126,8 @@ class SocketJobRequestListener
                case  cmd
                when "BUILD"
                        handle_cmd_build( req_line, req )
-               when "RESOLVE"
-                       handle_cmd_resolve( req_line, req )
+               #when "RESOLVE"
+               #       handle_cmd_resolve( req_line, req )
                when "QUERY"
                        handle_cmd_query( req_line, req )
                when "CANCEL"
@@ -348,104 +348,104 @@ class SocketJobRequestListener
        end
 
 
-       # "RESOLVE"
-       def handle_cmd_resolve( line, req )
-               @log.info "Received REQ: #{line}"
-
-               begin
-                       handle_cmd_resolve_internal( line, req )
-               rescue BuildServerException => e
-                       @log.error(e.message)
-                       BuildCommServer.send(req, e.err_message())
-                       BuildCommServer.send_end(req)
-                       BuildCommServer.disconnect(req)
-               end
-
-               @log.info "Handled REQ: #{line}"
-       end
-
-
-       def handle_cmd_resolve_internal( line ,req)
-               tok = line.split("|").map { |x| x.strip }
-               if tok.count < 3 then
-                       raise BuildServerException.new("ERR001"), line
-               end
-
-               case tok[1]
-                       # RESOLVE|GIT|project_name|passwd|os|async|dist_name|user_email|verbose
-               when "GIT"
-
-                       # parse
-                       project_name=tok[2]
-                       passwd=tok[3]
-                       os=tok[4]
-                       async = tok[5].eql? "YES"
-                       dist_name = tok[6]
-                       user_email = (not tok[7].nil? and not tok[7].empty?) ? tok[7].strip : ""
-                       verbose = tok[8].eql? "YES"
-                       if (dist_name.nil? or dist_name.empty?) then
-                               dist_name = @parent_server.distmgr.get_default_distribution_name()
-                       end
-
-                       # check distribution
-                       check_distribution(dist_name, req)
-
-                       # check project
-                       prj = check_project_exist(project_name, dist_name, req)
-
-                       # check passwd
-                       check_project_password(prj, passwd, req)
-
-                       # check os
-                       os_list = check_supported_os( [os] , req )
-                       os = os_list[0]
-
-                       # check user email
-                       user_id = @parent_server.check_user_id_from_email( user_email )
-                       if user_id == -1 then
-                               raise BuildServerException.new("ERR004"), user_email
-                       end
-
-                       # check user accessable
-                       if not check_project_user_id(project_name,dist_name,user_id) then
-                               raise BuildServerException.new("ERR005"), "#{user_email} -> #{project_name}"
-                       end
-
-                       # create new job
-                       new_job = create_new_job( project_name, os, dist_name )
-                       if new_job.nil? then
-                               raise BuildServerException.new("ERR006"), "Resolve job #{project_name} #{os}"
-                       end
-                       @log.info "Received a request for resolving this project : #{project_name}, #{os}"
-
-                       new_job.user_id = user_id
-
-                       # resolve
-                       new_job.set_resolve_flag()
-
-                       # create logger and set
-                       if async then
-                               new_job.create_logger( nil, verbose)
-                               BuildCommServer.send(req,"Info: Added new job \"#{new_job.id}\" for #{new_job.os}!")
-                               if not @parent_server.job_log_url.empty? then
-                                       BuildCommServer.send(req,"Info:  * Log URL : #{@parent_server.job_log_url}/#{new_job.id}/log")
-                               end
-                               BuildCommServer.send(req,"Info: Above job(s) will be processed asynchronously!")
-                               BuildCommServer.send_end(req)
-                               BuildCommServer.disconnect(req)
-                       else
-                               logger = new_job.create_logger( req, verbose)
-                               logger.info( "Added new job \"#{new_job.id}\" for #{new_job.os}!", Log::LV_USER)
-                               if not @parent_server.job_log_url.empty? then
-                                       logger.info( " * Log URL : #{@parent_server.job_log_url}/#{new_job.id}/log", Log::LV_USER)
-                               end
-                       end
-
-                       @parent_server.jobmgr.add_job( new_job )
-               else
-                       raise BuildServerException.new("ERR001"), line
-               end
-       end
+       ## "RESOLVE"
+       #def handle_cmd_resolve( line, req )
+       #       @log.info "Received REQ: #{line}"
+
+       #       begin
+       #               handle_cmd_resolve_internal( line, req )
+       #       rescue BuildServerException => e
+       #               @log.error(e.message)
+       #               BuildCommServer.send(req, e.err_message())
+       #               BuildCommServer.send_end(req)
+       #               BuildCommServer.disconnect(req)
+       #       end
+
+       #       @log.info "Handled REQ: #{line}"
+       #end
+
+
+       #def handle_cmd_resolve_internal( line ,req)
+       #       tok = line.split("|").map { |x| x.strip }
+       #       if tok.count < 3 then
+       #               raise BuildServerException.new("ERR001"), line
+       #       end
+
+       #       case tok[1]
+       #               # RESOLVE|GIT|project_name|passwd|os|async|dist_name|user_email|verbose
+       #       when "GIT"
+
+       #               # parse
+       #               project_name=tok[2]
+       #               passwd=tok[3]
+       #               os=tok[4]
+       #               async = tok[5].eql? "YES"
+       #               dist_name = tok[6]
+       #               user_email = (not tok[7].nil? and not tok[7].empty?) ? tok[7].strip : ""
+       #               verbose = tok[8].eql? "YES"
+       #               if (dist_name.nil? or dist_name.empty?) then
+       #                       dist_name = @parent_server.distmgr.get_default_distribution_name()
+       #               end
+
+       #               # check distribution
+       #               check_distribution(dist_name, req)
+
+       #               # check project
+       #               prj = check_project_exist(project_name, dist_name, req)
+
+       #               # check passwd
+       #               check_project_password(prj, passwd, req)
+
+       #               # check os
+       #               os_list = check_supported_os( [os] , req )
+       #               os = os_list[0]
+
+       #               # check user email
+       #               user_id = @parent_server.check_user_id_from_email( user_email )
+       #               if user_id == -1 then
+       #                       raise BuildServerException.new("ERR004"), user_email
+       #               end
+
+       #               # check user accessable
+       #               if not check_project_user_id(project_name,dist_name,user_id) then
+       #                       raise BuildServerException.new("ERR005"), "#{user_email} -> #{project_name}"
+       #               end
+
+       #               # create new job
+       #               new_job = create_new_job( project_name, os, dist_name )
+       #               if new_job.nil? then
+       #                       raise BuildServerException.new("ERR006"), "Resolve job #{project_name} #{os}"
+       #               end
+       #               @log.info "Received a request for resolving this project : #{project_name}, #{os}"
+
+       #               new_job.user_id = user_id
+
+       #               # resolve
+       #               new_job.set_resolve_flag()
+
+       #               # create logger and set
+       #               if async then
+       #                       new_job.create_logger( nil, verbose)
+       #                       BuildCommServer.send(req,"Info: Added new job \"#{new_job.id}\" for #{new_job.os}!")
+       #                       if not @parent_server.job_log_url.empty? then
+       #                               BuildCommServer.send(req,"Info:  * Log URL : #{@parent_server.job_log_url}/#{new_job.id}/log")
+       #                       end
+       #                       BuildCommServer.send(req,"Info: Above job(s) will be processed asynchronously!")
+       #                       BuildCommServer.send_end(req)
+       #                       BuildCommServer.disconnect(req)
+       #               else
+       #                       logger = new_job.create_logger( req, verbose)
+       #                       logger.info( "Added new job \"#{new_job.id}\" for #{new_job.os}!", Log::LV_USER)
+       #                       if not @parent_server.job_log_url.empty? then
+       #                               logger.info( " * Log URL : #{@parent_server.job_log_url}/#{new_job.id}/log", Log::LV_USER)
+       #                       end
+       #               end
+
+       #               @parent_server.jobmgr.add_job( new_job )
+       #       else
+       #               raise BuildServerException.new("ERR001"), line
+       #       end
+       #end
 
 
        # "QUERY"
@@ -494,16 +494,17 @@ class SocketJobRequestListener
 
                                case job.type
                                when "BUILD"
-                                       if status == "PENDING" then
-                                               if job.pending_ancestor.nil? then
-                                                       ids = "/"
-                                               else
-                                                       ids = job.pending_ancestor.id
-                                               end
-                                               BuildCommServer.send(req,"#{status}:#{ids},#{job.id},#{job.get_project().name},#{job.os} #{job.progress},#{job.get_distribution_name}")
-                                       else
-                                               BuildCommServer.send(req,"#{status},#{job.id},#{job.get_project().name},#{job.os} #{job.progress},#{job.get_distribution_name}")
-                                       end
+                                       #if status == "PENDING" then
+                                       #       if job.pending_ancestor.nil? then
+                                       #               ids = "/"
+                                       #       else
+                                       #               ids = job.pending_ancestor.id
+                                       #       end
+                                       #       BuildCommServer.send(req,"#{status}:#{ids},#{job.id},#{job.get_project().name},#{job.os} #{job.progress},#{job.get_distribution_name}")
+                                       #else
+                                       #       BuildCommServer.send(req,"#{status},#{job.id},#{job.get_project().name},#{job.os} #{job.progress},#{job.get_distribution_name}")
+                                       #end
+                                       BuildCommServer.send(req,"#{status},#{job.id},#{job.get_project().name},#{job.os} #{job.progress},#{job.get_distribution_name}")
                                when "REGISTER"
                                        if job.pkg_type == "BINARY" and not job.get_project().nil? then
                                                BuildCommServer.send(req,"#{status},#{job.id},#{job.get_project().name},#{job.os} #{job.progress},#{job.get_distribution_name}")
index 90e5080d3b208e85e43b4451ecd1d0924f0ba16b..84610513193469bfebf0e71d875b5c7a4032ca11 100644 (file)
@@ -9,7 +9,6 @@ Usage: build-cli <SUBCOMMAND> [OPTS] or build-cli (-h|-v)
 
 Subcommands:
 build         Build and create package.
-resolve       Request change to resolve-status for build-conflict.
 query         Query information about build-server.
 query-system  Query system information about build-server.
 query-project Query project information about build-server.
@@ -19,7 +18,6 @@ register      Register the package to the build-server.
 
 Subcommand usage:
 build-cli build -N <project name> -d <server address> [-o <os>] [-w <password>] [--async] [-D <distribution name>] [-U user-email] [-V]
-build-cli resolve -N <project name> -d <server address> [-o <os>] [-w <password>] [--async] [-D <distribution name>] [-U user-email] [-V]
 build-cli query -d <server address>
 build-cli query-system -d <server address>
 build-cli query-project -d <server address>
index b5b590390cefcd6bef537798069d7849fbb09323..478f8048951eb6d578a27b1814a707a04e9043e6 100644 (file)
@@ -10,7 +10,6 @@ build-cli-09.testcase
 build-cli-10.testcase
 build-cli-11.testcase
 build-cli-12.testcase
-build-cli-12_1.testcase
 build-cli-13.testcase
 build-cli-14.testcase
 build-cli-15.testcase
index 9b0af28c15c2948d21a3bf615229a0dffc1d9ea2..e4d9802aa513657b7fe5f0a0b549453694d8c9d7 100755 (executable)
@@ -19,7 +19,7 @@ rm -rf ~/.build_tools/build_server/testserver3
 ../../build-svr remove -n testserver3
 mkdir buildsvr01
 cd buildsvr01
-${RUBY} ../../../build-svr create -n testserver3 -t ftp://ftpuser:ftpuser@127.0.0.1
+${RUBY} ../../../build-svr create -n testserver3 #-t ftp://ftpuser:ftpuser@127.0.0.1
 echo "DROP DATABASE testserver3;" > a
 mysql -u root -p --password=$DB_PASSWD -h localhost < a
 ${RUBY} ../../../build-svr migrate -n testserver3 --dsn Mysql:testserver3:localhost --dbuser root --dbpassword $DB_PASSWD
index b0859c98c700fcdcd7dbea2609ff79dd5aafda0d..fd6a79c9e1d77e383960930fe00da3418b8dcb1e 100755 (executable)
@@ -18,7 +18,7 @@ rm -rf ~/.build_tools/build_server/testserver3
 ../../build-svr remove -n testserver3
 mkdir buildsvr01
 cd buildsvr01
-${RUBY} ../../../build-svr create -n testserver3 -t ftp://ftpuser:ftpuser@127.0.0.1
+${RUBY} ../../../build-svr create -n testserver3 #-t ftp://ftpuser:ftpuser@127.0.0.1
 echo "DROP DATABASE testserver3;" > a
 mysql -u root -p --password=$DB_PASSWD -h localhost < a
 ${RUBY} ../../../build-svr migrate -n testserver3 --dsn Mysql:testserver3:localhost --dbuser root --dbpassword $DB_PASSWD
index be7df44ec28e5cfd3e5f141981e15a825946eba6..fd3d663934bc266208a1783e19751b1547314b17 100644 (file)
@@ -1,6 +1,6 @@
 #PRE-EXEC
 #EXEC
-../../build-cli register -d 127.0.0.1:2223 -P bin/bin_0.0.0_ubuntu-32.zip -D unstable2 -t ftp://ftpuser:ftpuser@127.0.0.1
+../../build-cli register -d 127.0.0.1:2223 -P bin/bin_0.0.0_ubuntu-32.zip -D unstable2 #-t ftp://ftpuser:ftpuser@127.0.0.1
 #POST-EXEC
 #EXPECT
 I, [
@@ -8,14 +8,6 @@ I, [
 I, [
 I, [
 I, [
-I, [
-I, [
-I, [
-I, [
-I, [
-I, [
-I, [
-I, [
 Info: Added new job
 Info: Initializing job...
 Info: Checking package version ...
index 5d4bc035c0dbe0670faacefe2f18d93761bb4d39..11e9162f399a69ec35e83c1e4e4add9f83050d90 100755 (executable)
@@ -18,7 +18,7 @@ rm -rf ~/.build_tools/build_server/testserver3
 ../../build-svr remove -n testserver3
 mkdir buildsvr01
 cd buildsvr01
-${RUBY} ../../../build-svr create -n testserver3 -t ftp://ftpuser:ftpuser@127.0.0.1
+${RUBY} ../../../build-svr create -n testserver3 #-t ftp://ftpuser:ftpuser@127.0.0.1
 echo "DROP DATABASE testserver3;" > a
 mysql -u root -p --password=$DB_PASSWD -h localhost < a
 ${RUBY} ../../../build-svr migrate -n testserver3 --dsn Mysql:testserver3:localhost --dbuser root --dbpassword $DB_PASSWD