#!/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] [--front-end=dirname ...] [--sdk-only] [--front-end-only] [clean] [prepare] [package] [deploy]" % (path.basename(script_name))
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, output)
def run_build_scripts(target, build_sdk, build_front_end, sdk_build_script, exec_args, front_end_dirs):
exec_args[4] = target
if build_sdk:
exec_args[0] = sdk_build_script
cipres.exec_command(exec_args)
if build_front_end:
for dir_name in front_end_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
build_sdk = True
build_front_end = True
conf_dir = None
prop_file = None
front_end_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] == "--sdk-only":
build_sdk = True
build_front_end = False
elif pair[0] == "--front-end-only":
build_sdk = False
build_front_end = True
elif pair[0] == "--conf-dir":
conf_dir = pair[1]
elif pair[0] == "--prop-file":
prop_file = pair[1]
elif pair[0] == "--front-end":
front_end_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
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(front_end_dirs) == 0:
front_end_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")
sdk_build_script = path.join(top_dir, "sdk", "build.py")
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")
if clean_target:
print "\nremoving build output..."
if path.exists(build_dir):
shutil.rmtree(build_dir)
exec_args[0] = sdk_build_script
exec_args[4] = "clean"
cipres.exec_command(exec_args)
for dir_name in front_end_dirs:
exec_args[0] = path.join(dir_name, "build.py")
cipres.exec_command(exec_args)
if prepare_target:
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)
build_props["use.rest.callback"] = "false"
build_props["portal2.protected.pages"] = "/statistics.action"
# Default is to assume we're doing a portal build. rest/build.py overrides these settings.
# If you build both the portal and the rest api, you will get the rest tools and not the portal tools,
# in both the portal and the rest web apps.
build_props["rest.tools.disable"] = "true"
build_props["portal.tools.disable"] = "false"
tmp = cipres.shell_command("svn info | grep ^URL | awk '{print $NF}'")
build_props["scigap.svn.top"] = tmp
build_props.saveToFile(build_prop_file)
run_build_scripts("prepare-props", build_sdk, build_front_end, sdk_build_script, exec_args, front_end_dirs)
pom_props = {"build.pom.properties" : "%s%s%s" %
(top_dir, build_prop_file, build_props["build.portal.staticUrl"])}
cipres.filter_file(pom_props, path.join(top_dir, "default", "pom.xml.template"), build_pom_file)
run_build_scripts("prepare", build_sdk, build_front_end, sdk_build_script, exec_args, front_end_dirs)
if package_target:
print "\nbuilding...\n"
cipres.exec_command(["mvn", "-f", build_pom_file, "install"])
run_build_scripts("package", build_sdk, build_front_end, sdk_build_script, exec_args, front_end_dirs)
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", build_sdk, build_front_end, sdk_build_script, exec_args, front_end_dirs)
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))