#!/usr/bin/env python
import os
import shutil
import sys
from os import path
if __name__ == "__main__":
sys.path.insert(0, path.join(path.dirname(path.abspath(sys.argv[0])), "lib", "python"))
import cipres
def get_usage_message(script_name):
return ("usage: %s [-h | --help] [--conf-dir=dirname] [--prop-file=filename] [--module=dirname ...] "
"[--no-deps] [clean] [prepare] [package] [deploy] [only-deploy]") % (path.basename(script_name))
def add_module(dir_name, build_list, index):
if dir_name in build_list:
return False
build_list.insert(index, dir_name)
return True
def add_dependencies(exec_args, dir_name, build_list, index):
exec_args[0] = path.join(dir_name, "build.py")
exec_args[4] = "dependencies"
output = cipres.shell_command(" ".join(exec_args))
if len(output) > 0:
dependencies = output.strip().split("\n")
for module in dependencies:
dep_dir_name = path.abspath(module)
if add_module(dep_dir_name, build_list, index):
add_dependencies(exec_args, dep_dir_name, build_list, index)
index += 1
def write_build_properties(defaults, overrides, output):
default_props = cipres.Properties(defaults)
if overrides != defaults:
override_props = cipres.Properties(overrides)
for key, value in override_props.iteritems():
default_props[key] = value
cipres.filter_props(default_props, default_props, output)
def building_module(module_dirs, module_name):
search_name = "%s%s" % (path.sep, module_name)
name_length = len(search_name)
for module in module_dirs:
if module[-name_length:] == search_name:
return True
return False
def run_build_scripts(target, exec_args, module_dirs):
exec_args[4] = target
for dir_name in module_dirs:
exec_args[0] = path.join(dir_name, "build.py")
cipres.exec_command(exec_args)
def main(argv):
try:
clean_target = False
prepare_target = False
package_target = False
deploy_target = False
add_deps = True
conf_dir = None
prop_file = None
module_dirs = []
top_dir = path.dirname(path.abspath(argv[0]))
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
for arg in argv[1:]:
pair = arg.split("=")
if pair[0] == "-h" or pair[0] == "--help":
print get_usage_message(argv[0])
return 0
elif pair[0] == "--no-deps":
add_deps = False
elif pair[0] == "--conf-dir":
conf_dir = pair[1]
elif pair[0] == "--prop-file":
prop_file = pair[1]
elif pair[0] == "--module" or pair[0] == "--front-end":
module_dirs.append(path.abspath(pair[1]))
elif pair[0] == "clean":
clean_target = True
elif pair[0] == "prepare":
prepare_target = True
elif pair[0] == "package":
package_target = True
prepare_target = True
elif pair[0] == "deploy":
deploy_target = True
prepare_target = True
package_target = True
elif pair[0] == "only-deploy":
deploy_target = True
else:
raise cipres.BuildError("unknown argument %s\n%s" % (arg, get_usage_message(argv[0])))
if not clean_target and not prepare_target and not package_target and not deploy_target:
package_target = True
prepare_target = True
if len(module_dirs) == 0:
module_dirs.append(path.join(top_dir, "portal"))
if conf_dir is None:
conf_dir = path.join(top_dir, "example")
else:
conf_dir = path.abspath(conf_dir)
if prop_file is None:
prop_file = path.join(conf_dir, "build.properties")
else:
prop_file = path.join(conf_dir, prop_file)
build_dir = path.join(top_dir, "build")
build_prop_file = path.join(build_dir, "build.properties")
build_pom_file = path.join(build_dir, "pom.xml")
exec_args = ["", top_dir, conf_dir, build_prop_file, ""]
java_opts = " -Dlog4jdbc.debug.stack.prefix=org.ngbw -Dlog4jdbc.sqltiming.warn.threshold=40 -Dlog4jdbc.sqltiming.error.threshold=40 "
if "JAVA_OPTS" in os.environ:
java_opts = "%s%s" % (os.environ["JAVA_OPTS"], java_opts)
os.environ["JAVA_OPTS"] = java_opts
os.environ["PYTHONPATH"] = path.join(top_dir, "lib", "python")
module_build_list = [ ]
for dir_name in module_dirs:
index = len(module_build_list)
if add_module(dir_name, module_build_list, index) and add_deps:
add_dependencies(exec_args, dir_name, module_build_list, index)
if clean_target:
print "\nremoving build output..."
exec_args[4] = "clean"
for dir_name in module_build_list:
exec_args[0] = path.join(dir_name, "build.py")
cipres.exec_command(exec_args)
if path.exists(build_dir):
shutil.rmtree(build_dir)
if prepare_target:
print "\npreparing...\n"
if not path.exists(build_dir):
os.mkdir(build_dir, 0775)
write_build_properties(path.join(top_dir, "default", "build.properties.template"), prop_file, build_prop_file)
build_props = cipres.Properties(build_prop_file)
# Default is to assume we're doing a portal build
build_props["use.rest.callback"] = "false"
build_props["portal2.protected.pages"] = "/statistics.action"
build_props["rest.tools.disable"] = "true"
build_props["portal.tools.disable"] = "false"
if building_module(module_build_list, "rest"):
build_props["rest.tools.disable"] = "false"
if not building_module(module_build_list, "portal"):
build_props["use.rest.callback"] = "true"
build_props["portal2.protected.pages"] = "/*"
build_props["portal.tools.disable"] = "true"
tmp = cipres.shell_command("svn info | grep ^URL | awk '{print $NF}'")
build_props["scigap.svn.top"] = tmp
build_props.saveToFile(build_prop_file)
pom_props = {"build.pom.properties" : "%s%s%s%s%s" %
(top_dir, build_prop_file, build_props["build.portal.staticUrl"], build_props["build.portal.appName"], build_props["build.rest.appName"])}
cipres.filter_file(pom_props, path.join(top_dir, "default", "pom.xml.template"), build_pom_file)
run_build_scripts("prepare", exec_args, module_build_list)
if package_target:
print "\nbuilding...\n"
cipres.exec_command(["mvn", "-f", build_pom_file, "install"])
run_build_scripts("package", exec_args, module_build_list)
if deploy_target:
print "\ndeploying...\n"
build_props = cipres.Properties(build_prop_file)
tomcat_dir = build_props.get("build.portal.tomcatDir", os.environ.get("CATALINA_HOME"))
if tomcat_dir is None or len(tomcat_dir) == 0:
raise cipres.BuildError("property build.portal.tomcatDir is missing or empty")
tomcat_bin_dir = path.join(tomcat_dir, "bin")
print "\nshutting down tomcat...\n"
try:
cipres.exec_command([path.join(tomcat_bin_dir, "shutdown.sh")])
except (cipres.BuildError) as err:
sys.stderr.write("%s\n" % str(err))
sys.stderr.write("Continuing anyway.\n")
print "\nrunning build.py scripts\n"
run_build_scripts("deploy", exec_args, module_build_list)
print "\nstarting tomcat...\n"
cipres.exec_command([path.join(tomcat_bin_dir, "startup.sh")])
return 0
except (IOError, OSError, cipres.BuildError) as err:
sys.stderr.write("%s\n" % str(err))
return 1
if __name__ == "__main__":
sys.exit(main(sys.argv))