@type = "BUILD"
@host_os = Utils::HOST_OS
- if not @server.distmgr.nil? then
+ if not @server.distmgr.nil? and @server.has_db? and
+ not @project.nil? and not @project.is_transferred? then
@pkgsvr_url = @server.distmgr.get_distribution(project.dist_name).pkgsvr_url
@pkgsvr_ip = @server.distmgr.get_distribution(project.dist_name).pkgsvr_ip
@pkgsvr_port = @server.distmgr.get_distribution(project.dist_name).pkgsvr_port
end
- def set_transfered_job( dock_num )
- @is_verified = true
- set_send_result_back( dock_num )
+ def set_verified( value )
+ @is_verified = value
end
end
+ # for transferred project, this will overwite URL
+ def set_package_server_url(url)
+ @pkgsvr_url = url
+ end
+
+
#cancel
def cancel()
# kill sub process if exist?
@remote_servers = []
@req_listener = []
@finish = false
+ @running_port = nil
# status
@status = "INITIALIZING"
# host_os
#DB settring
@db = nil
- @db_dsn = "SQLite3:#{BuildServer::CONFIG_ROOT}/#{@id}/server.db"
+ @db_dsn = nil
@db_user = nil
@db_passwd = nil
@db_version = 3
end
end
+
def port
- result = nil
- get_db_connection() do |db|
- result = db.select_one("SELECT value FROM server_configs WHERE property = 'port'")[0]
- end
- return (result.nil?) ? "" : result
+ return @running_port
end
+
def port=(svr_port)
- get_db_connection() do |db|
- db.do "UPDATE server_configs SET value = '#{svr_port}' WHERE property = 'port'"
+ @running_port = svr_port
+ if has_db? then
+ get_db_connection() do |db|
+ db.do "UPDATE server_configs SET value = '#{svr_port}' WHERE property = 'port'"
+ end
end
end
return (@db_dsn =~ /^Mysql/i) ? db.func(:insert_id).to_s : db.select_one("SELECT last_insert_rowid()")[0]
end
+
+ def has_db?()
+ return (not @db_dsn.nil?)
+ end
+
+
# start server daemon
def start
# set build cache dir
FileUtils.mkdir_p @build_cache_dir
end
+ # init job directory if needed
+ if not File.exist? "#{@path}/jobs" then FileUtils.mkdir_p "#{@path}/jobs" end
+
# init transport path
if not File.exist? @transport_path then FileUtils.mkdir_p @transport_path end
- #lock the build server. Do not run the same server at the same time
- if (not lockServer())
- printErrorMessage("Server \"#{id}\" is already running.")
- return
- end
+ #lock the build server. Do not run the same server at the same time
+ if not lockServer() then
+ printErrorMessage("Server \"#{id}\" is already running.")
+ return
+ end
- #check that the port is open
- if BuildCommServer.port_open? port then
- printErrorMessage("Port \"#{port}\" is already in use.")
- return
- end
+ #check that the port is open
+ if BuildCommServer.port_open? port then
+ printErrorMessage("Port \"#{port}\" is already in use.")
+ return
+ end
# init project mgr
@log.info "Setting Project Manager..."
@cleaner.start
# init latest job id
- get_db_connection() do |db|
- row = db.select_one("SELECT MAX(id) as id FROM jobs")
- @latest_job_id = row['id']
- end
+ if has_db? then
+ @latest_job_id = get_latest_job_id_from_db()
+ else
+ @latest_job_id = get_latest_job_id_from_directory()
+ end
# set package server synchrontizer
@log.info "Setting Package Server Synchronizer..."
- @pkg_sync = PackageServerSynchronizer.new(self)
- @pkg_sync.start
+ if has_db? then
+ @pkg_sync = PackageServerSynchronizer.new(self)
+ @pkg_sync.start
+ end
# update friend server status
@log.info "Initializing Remote Servers..."
- @remote_servers = get_remote_servers()
- @remote_servers.each do |server|
- server.create_system_monitor()
+ if has_db? then
+ @remote_servers = get_remote_servers()
+ @remote_servers.each do |server|
+ server.create_system_monitor()
+ end
end
# main loop
def get_db_connection(transaction=true)
begin
- if @db_dsn =~ /^SQLite3:/ then
+ if @db_dsn.nil? then
+ return false
+ elsif @db_dsn =~ /^SQLite3:/ then
@sqlite3_db_mutex.lock
@db = DBI.connect("DBI:#{@db_dsn}", @db_user, @db_passwd)
else
@db = DBI.connect("DBI:#{@db_dsn}", @db_user, @db_passwd)
end
end
+
@db['AutoCommit'] = false
@db.transaction do |dbh|
yield dbh if block_given?
puts "Server creation failed"
puts errMsg
end
+
+
+ # get latest id from DB
+ private
+ def get_latest_job_id_from_db()
+ job_id = nil
+ get_db_connection() do |db|
+ row = db.select_one("SELECT MAX(id) as id FROM jobs")
+ job_id = row['id']
+ end
+
+ if not job_id.nil? and not job_id.empty? then
+ return job_id
+ else
+ return "0"
+ end
+ end
+
+
+ # get id from "jobs" directory
+ private
+ def get_latest_job_id_from_directory()
+ job_directories = Dir.entries("#{@path}/jobs").select { |dir|
+ not dir.start_with? "." and File.directory?("#{@path}/jobs/#{dir}") and dir.to_s =~ /^\d+$/
+ }
+ max_id = 0
+ job_directories.each do |job_id|
+ if job_id.to_i > max_id then
+ max_id = job_id.to_i
+ end
+ end
+
+ return max_id.to_s
+ end
+
end
# start server
def self.start_server( id, port = 2222 )
server = get_server(id)
- migrate_db(server)
+ #migrate_db(server)
server.jobmgr.cancel_broken_status
# write run port
# start
server.port = port
- server.save_id_to_db(server.id)
- server.save_path_to_db(server.path)
+ if server.has_db? then
+ server.save_id_to_db(server.id)
+ server.save_path_to_db(server.path)
+ end
server.start
end
ftp_port=nil
ftp_username=nil
ftp_passwd=nil
- db_dsn="SQLite3:#{BuildServer::CONFIG_ROOT}/#{id}/server.db"
+ db_dsn=nil
db_user=nil
db_passwd=nil
when /^Mysql:(.*)/i then
db_dsn = "Mysql:#{$1}"
else
- db_dsn = "SQLite3:#{BuildServer::CONFIG_ROOT}/#{id}/server.db"
+ db_dsn = nil
end
elsif l.start_with?("DB_USER=")
db_user = l[idx,length].strip if not l[idx,length].strip.empty?
@project = project
end
+
+ public
+ def is_transferred?
+ if not @project.nil? then
+ return @project.is_transferred?
+ else
+ return false
+ end
+ end
+
public
def get_user_email
return @server.get_email_using_user_id(@user_id)
# initialize
def initialize( name, type, server, os_list, dist_name="BASE", status="OPEN" )
@prj_id = -1
- @name = name
+ if name.nil? then
+ @name = "TRANSFERRED"
+ else
+ @name = name
+ end
@type = type
@passwd = ""
@os_list = os_list
end
+ def is_transferred?
+ return @name == "TRANSFERRED"
+ end
+
+
#return passwd
def is_passwd_set?()
return ( not @passwd.empty? )
# if succeeded, register source info and copy pkginfo.manifest
@log.info( "Updating the source info for project \"#{@project.name}\"" , Log::LV_USER)
- @project.save_source_info( @pkginfo.get_version(), @git_commit)
- @project.save_package_info_from_manifest( @pkginfo.get_version(),
- "#{@source_path}/package/pkginfo.manifest", @os)
+ if not is_transferred? then
+ @project.save_source_info( @pkginfo.get_version(), @git_commit)
+ @project.save_package_info_from_manifest( @pkginfo.get_version(),
+ "#{@source_path}/package/pkginfo.manifest", @os)
+ end
@server.jobmgr.save_job_status(self)
# clean up
@server.cleaner.clean(@id)
protected
def get_source_code_internal()
# check git directory
- git_path = "#{@project.path}/cache/git"
cache_path = "#{@project.path}/cache"
if not File.exist? cache_path then
FileUtils.mkdir_p cache_path
end
+ git_path = "#{cache_path}/#{File.basename(@git_repos)}"
# verify git & check branch name
if File.exist? git_path then
# if no git, clone it
if not File.exist? git_path then
# if "git pull" failed, try to "git clone"
- if not git_cmd("clone #{@git_repos} git", cache_path, @log) then
+ if not git_cmd("clone #{@git_repos}", cache_path, @log) then
@log.error( "Failed on \"git clone #{@git_repos}\"", Log::LV_USER)
return nil
end
end
- #def get_pending_jobs
- # result = []
- # @jobs.each do |job|
- # if job.status == "PENDING" then
- # result.push job
- # end
- # end
-
- # return result
- #end
-
+ # Additionally, "commit" option will assign job number
def commit_job(job)
- result = save_job_status(job)
+ if @server.has_db? and not job.is_transferred? then
+ result = save_job_status(job)
+ else
+ job.id = @server.get_next_job_id()
+ result = true
+ end
return result
end
+
def save_job_status(job)
+ # if transferred job, no need to save
+ if job.is_transferred? then return true end
+
now = @server.db_now
result = @server.get_db_connection() do |db|
job.save(db, now)
# copy result files to transport path
if @send_result_back then
- puts "=========> 1"
copy_result_files_to_master()
- puts "=========> 2"
end
# INFO. don't change this string
end
- def create_unnamed_git_project(repos, dist_name)
- name = "UNNAMED_PRJ_#{get_all_projects().count}"
- branch = "master"
- passwd = nil
- os_list = Utils.get_all_OSs()
- os_list.each do |os|
- @server.add_supported_os(os)
- end
- # add
- add_git_project(name , repos, branch, passwd, os_list, dist_name)
- # get
- return get_project(name, dist_name)
+ # this project will not be saved on DB
+ def create_transferred_git_project(repos, dist_name, os)
+ return GitBuildProject.new(nil, @server, [os], dist_name, repos, "master")
end
options[:is_rev_build] = @job.is_rev_build_check_job()
options[:dock] = Utils.create_uniq_name()
options[:save] = @job.is_rev_build_check_job() ? false : true
+ options[:pkgsvr_url] = @job.server.distmgr.get_distribution(options[:dist]).pkgsvr_url
ret = build( options )
# reset job
options[:save] = false
options[:async] = false
options[:monitor_level] = Log::LV_NORMAL
+ options[:pkgsvr_url] = nil
return options
end
# format: BUILD|GIT|repository|passwd|os|async|
# no_reverse|dist_name|
# user_email|rebuild|internal|rev-build|
- # commit|pkgs|dock_num
+ # commit|pkgs|dock_num|pkgsvr_url
msg = "BUILD|GIT|#{options[:git_repos]}||#{options[:os]}|NO|"+
"#{options[:noreverse] ? "YES" : "NO"}|#{options[:dist]}|"+
"#{options[:user]}|NO|YES|#{options[:is_rev_build] ? "YES":"NO"}|"+
- "#{commit}|#{pkg_list}|#{options[:dock]}"
+ "#{commit}|#{pkg_list}|#{options[:dock]}|#{options[:pkgsvr_url]}"
else
# format: BUILD|GIT|project_list|passwd|
# os|async|
git_commit = (not tok[12].nil? and not tok[12].empty?) ? tok[12] : nil
pkg_files = (not tok[13].nil? and not tok[13].empty?) ? tok[13].split(",") : []
dock_num = (not tok[14].nil? and not tok[14].empty?) ? tok[14].strip : "0"
+ pkgsvr_url = (not tok[15].nil? and not tok[15].empty?) ? tok[15].strip : nil
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)
+ if not is_internal then
+ check_distribution(dist_name, req)
+ end
# check supported os if not internal job
if not is_internal then
end
# 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
+ if not is_internal then
+ user_id = @parent_server.check_user_id_from_email( user_email )
+ if user_id == -1 then
+ raise BuildServerException.new("ERR004"), user_email
+ end
end
raise BuildServerException.new("ERR006"),"No valid sub jobs in Multi-Build job"
end
- # transfered job
+ # transferred job
elsif is_internal then
git_repos = project_name_list[0]
os = os_list[0]
- new_job = create_new_transfered_job(git_repos, os, git_commit, pkg_files, dock_num, dist_name )
+ new_job = create_new_transferred_job(git_repos, os, git_commit, pkg_files, dock_num, dist_name, pkgsvr_url )
if new_job.nil? then
raise BuildServerException.new("ERR006"),"Transfered-Build job"
else
private
- def create_new_transfered_job( git_repos, os, git_commit, pkg_files, dock_num, dist_name )
- prj = @parent_server.prjmgr.get_git_project( git_repos, dist_name )
- if prj.nil? then
- prj = @parent_server.prjmgr.create_unnamed_git_project( git_repos, dist_name )
- end
+ def create_new_transferred_job( git_repos, os, git_commit, pkg_files, dock_num, dist_name, pkgsvr_url )
+ prj = @parent_server.prjmgr.create_transferred_git_project( git_repos, dist_name, os )
new_job = prj.create_new_job(os)
- new_job.set_transfered_job( dock_num )
+ new_job.set_package_server_url(pkgsvr_url)
+ new_job.set_verified( true )
+ new_job.set_send_result_back( dock_num )
new_job.git_commit = git_commit
pkg_files.each do |file|
new_job.add_external_package( file )
rm -rf buildsvr01
mkdir buildsvr01
cd buildsvr01; ../../../build-svr create -n testserver3 -t ftp://dibsftp:coreps2@172.21.111.132
+cd buildsvr01; ../../../build-svr migrate -n testserver3 --dsn SQLite3:`pwd`/server.db
cd buildsvr01; ../../../build-svr add-dist -n testserver3 -D BASE -u `pwd`/../pkgsvr01/unstable -d 127.0.0.1:3333
#EXEC
../../build-svr add-svr -n testserver3 -d 127.0.0.1:2223
mkdir buildsvr01
rm -rf ~/.build_tools/build_server/testserver3
cd buildsvr01; ../../../build-svr create -n testserver3 -t ftp://dibsftp:coreps2@172.21.111.132
+cd buildsvr01; ../../../build-svr migrate -n testserver3 --dsn SQLite3:`pwd`/server.db
cd buildsvr01; ../../../build-svr add-dist -n testserver3 -D BASE -u `pwd`/../pkgsvr01/unstable -d 127.0.0.1:3333
../../build-svr start -n testserver3 -p 2223 &
#EXEC
#PRE-EXEC
mkdir buildsvr01
cd buildsvr01; ../../../build-svr create -n testserver3 -u `pwd`/../pkgsvr01/unstable -d 127.0.0.1:3333 -t ftp://dibsftp:coreps2@172.21.111.132
+cd buildsvr01; ../../../build-svr migrate -n testserver3 --dsn SQLite3:`pwd`/server.db
#EXEC
../../build-svr stop -n testserver3
#POST-EXEC
../../build-svr remove -n testserver3
rm -rf buildsvr01
#EXPECT
-generating
Server is not running!
rm -rf buildsvr01
mkdir buildsvr01
cd buildsvr01; ../../../build-svr create -n testserver3 -t ftp://dibsftp:coreps2@172.21.111.132
+cd buildsvr01; ../../../build-svr migrate -n testserver3 --dsn SQLite3:`pwd`/server.db
cd buildsvr01; ../../../build-svr add-dist -n testserver3 -D BASE -u `pwd`/../pkgsvr01/unstable -d 127.0.0.1:3333
../../build-svr add-os -n testserver3 -o ubuntu-32
#EXEC
rm -rf buildsvr01
mkdir buildsvr01
cd buildsvr01; ../../../build-svr create -n testserver3 -t ftp://dibsftp:coreps2@172.21.111.132
+cd buildsvr01; ../../../build-svr migrate -n testserver3 --dsn SQLite3:`pwd`/server.db
cd buildsvr01; ../../../build-svr add-dist -n testserver3 -D BASE -u `pwd`/../pkgsvr01/unstable -d 127.0.0.1:3333
#EXEC
../../build-svr add-prj -n testserver3 -N testa -g test_git -b test_branch -w 1111
rm -rf ~/.build_tools/build_server/testserver3
mkdir buildsvr01
cd buildsvr01; ../../../build-svr create -n testserver3 -t ftp://ftpuser:ftpuser@127.0.0.1
+cd buildsvr01; ../../../build-svr migrate -n testserver3 --dsn SQLite3:`pwd`/server.db
cd buildsvr01; ../../../build-svr add-dist -n testserver3 -D BASE -u `pwd`/../pkgsvr01/unstable -d 127.0.0.1:3333
../../build-svr add-os -n testserver3 -o ubuntu-32
#EXEC
rm -rf buildsvr01
mkdir buildsvr01
cd buildsvr01; ../../../build-svr create -n testserver3 -t ftp://dibsftp:coreps2@172.21.111.132
+cd buildsvr01; ../../../build-svr migrate -n testserver3 --dsn SQLite3:`pwd`/server.db
cd buildsvr01; ../../../build-svr add-dist -n testserver3 -D BASE -u `pwd`/../pkgsvr01/unstable -d 127.0.0.1:3333
#EXEC
../../build-svr add-os -n testserver3 -o ubuntu-32
rm -rf buildsvr01
mkdir buildsvr01
cd buildsvr01; ../../../build-svr create -n testserver3 -u `pwd`/../pkgsvr01/unstable -d 127.0.0.1:3333 -t ftp://dibsftp:coreps2@172.21.111.132
+cd buildsvr01; ../../../build-svr migrate -n testserver3 --dsn SQLite3:`pwd`/server.db
#EXEC
../../build-svr add-os -n testserver3 -o ubuntu-32
../../build-svr add-os -n testserver3 -o ubuntu-32
../../build-svr remove -n testserver3
rm -rf buildsvr01
#EXPECT
-generating
Target OS is added successfully!
Target OS already exists in list!
rm -rf buildsvr01
mkdir buildsvr01
cd buildsvr01; ../../../build-svr create -n testserver3 -u `pwd`/../pkgsvr01/unstable -d 127.0.0.1:3333 -t ftp://dibsftp:coreps2@172.21.111.132
+cd buildsvr01; ../../../build-svr migrate -n testserver3 --dsn SQLite3:`pwd`/server.db
../../build-svr add-os -n testserver3 -o ubuntu-32
../../build-svr add-os -n testserver3 -o windows-32
#EXEC
rm -rf buildsvr01
mkdir buildsvr01
cd buildsvr01; ../../../build-svr create -n testserver3 -t ftp://ftpuser:ftpuser@172.21.111.124
+cd buildsvr01; ../../../build-svr migrate -n testserver3 --dsn SQLite3:`pwd`/server.db
cd buildsvr01; ../../../build-svr add-dist -n testserver3 -D BASE -u `pwd`/../pkgsvr01/unstable -d 127.0.0.1:3333
../../build-svr add-os -n testserver3 -o ubuntu-32
../../build-svr add-prj -n testserver3 -N bin -P bin -o ubuntu-32
rm -rf buildsvr01
mkdir buildsvr01
cd buildsvr01; ../../../build-svr create -n testserver3 -u `pwd`/../pkgsvr01/unstable -d 127.0.0.1:3333 -t ftp://ftpuser:ftpuser@172.21.111.124
-cd buildsvr01; ../../../build-svr migrate -n testserver3
+cd buildsvr01; ../../../build-svr migrate -n testserver3 --dsn SQLite3:`pwd`/server.db
#EXEC
../../build-svr set-attr -n testserver3 -A MAX_WORKING_JOBS -V 3
../../build-svr get-attr -n testserver3 -A MAX_WORKING_JOBS
Info: *
Info: Job is completed!
Info: Job is FINISHED successfully!
-Info: Updating the source info for project "UNNAMED
+Info: Updating the source info for project "TRANSFERRED"
Info: Receiving file from remote server : a_0.0.1_ubuntu-32.zip
Info: Checking reverse build dependency ...
Info: Uploading ...
Info: *
Info: Job is completed!
Info: Job is FINISHED successfully!
-Info: Updating the source info for project "UNNAMED
+Info: Updating the source info for project "TRANSFERRED"
Info: Receiving file from remote server : b_0.0.1_ubuntu-32.zip
Info: Checking reverse build dependency ...
Info: Uploading ...
RUBY="ruby -d"
fi
-if [ ! "$DB_PASSWD" ] ; then
- read -p "Insert DB password: " input
- export DB_PASSWD=$input
-else
- echo $DB_PASSWD
-fi
-
rm -rf buildsvr02
../../build-svr remove -n testserver4
mkdir buildsvr02
cd buildsvr02
${RUBY} ../../../build-svr create -n testserver4
-echo "DROP DATABASE testserver4;" > a
-mysql -u root -p --password=$DB_PASSWD -h localhost < a
-${RUBY} ../../../build-svr migrate -n testserver4 --dsn Mysql:testserver4:localhost --dbuser root --dbpassword $DB_PASSWD
-rm -f a
cd ..
-${RUBY} ../../build-svr add-dist -n testserver4 -D unstable -u `pwd`/pkgsvr01/unstable -d 127.0.0.1:3333
+#${RUBY} ../../build-svr add-dist -n testserver4 -D unstable -u `pwd`/pkgsvr01/unstable -d 127.0.0.1:3333
${RUBY} ../../build-svr start -n testserver4 -p 2224 --CHILD
rm -rf ~/.build_tools/build_server/testserver3
mkdir buildsvr01
cd buildsvr01;../../../build-svr create -n testserver3 -t ftp://ftpuser:ftpuser@127.0.0.1
+cd buildsvr01; ../../../build-svr migrate -n testserver3 --dsn SQLite3:`pwd`/server.db
../../build-svr add-os -n testserver3 -o ubuntu-32
../../build-svr add-os -n testserver3 -o ubuntu-64
#EXEC