123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 |
- #coding=UTF-8
-
- ## Collection of helpers for Build scripts ##
-
- import sys, argparse, subprocess, platform
- from xml.etree import ElementTree
- from os.path import join, isdir, isfile, basename, exists
- from os import listdir, makedirs
- from shutil import copy, rmtree
- from glob import glob
-
- # Directory where the resulting war files are stored
- # TODO: deploy results
- resultPath = join("result", "demos")
-
- if not exists(resultPath):
- makedirs(resultPath)
- elif not isdir(resultPath):
- print("Result path is not a directory.")
- sys.exit(1)
-
- args = None
-
- # Default argument parser
- parser = argparse.ArgumentParser(description="Automated staging validation")
- group = parser.add_mutually_exclusive_group(required=True)
- group.add_argument("--version", help="Vaadin version to use")
-
- parser.add_argument("--maven", help="Additional maven command line parameters", default=None)
- parser.add_argument("--fwRepo", help="Framework staging repository URL", default=None)
- parser.add_argument("--pluginRepo", help="Maven plugin repository URL", default=None)
-
- # Parse command line arguments <version>
- def parseArgs():
- # If no args, give help
- if len(sys.argv) == 1:
- args = parser.parse_args(["-h"])
- else:
- args = parser.parse_args()
- return args
-
- # Function for determining the path for maven executable
- def getMavenCommand():
- # This method uses .split("\n")[0] which basically chooses the first result where/which returns.
- # Fixes the case with multiple maven installations available on PATH
- if platform.system() == "Windows":
- try:
- return subprocess.check_output(["where", "mvn.cmd"], universal_newlines=True).split("\n")[0]
- except:
- try:
- return subprocess.check_output(["where", "mvn.bat"], universal_newlines=True).split("\n")[0]
- except:
- print("Unable to locate mvn with where. Is the maven executable in your PATH?")
- else:
- try:
- return subprocess.check_output(["which", "mvn"], universal_newlines=True).split("\n")[0]
- except:
- print("Unable to locate maven executable with which. Is the maven executable in your PATH?")
- return None
-
- mavenCmd = getMavenCommand()
-
- # Get command line arguments. Parses arguments if needed.
- def getArgs():
- global args
- if args is None:
- args = parseArgs()
- return args
-
- # Maven Package and Validation
- def mavenValidate(artifactId, mvnCmd = mavenCmd, logFile = sys.stdout, version = None, mavenParams = None):
- if version is None:
- version = getArgs().version
- if mavenParams is None:
- mavenParams = getArgs().maven
-
- print("Do maven clean package validate")
- cmd = [mvnCmd]
- cmd.append("-Dvaadin.version=%s" % (version))
- if mavenParams is not None:
- cmd.extend(mavenParams.strip('"').split(" "))
- cmd.extend(["clean", "package", "validate"])
- print("executing: %s" % (" ".join(cmd)))
- subprocess.check_call(cmd, cwd=join(resultPath, artifactId), stdout=logFile)
-
- # Collect .war files to given folder with given naming
- def copyWarFiles(artifactId, resultDir = resultPath, name = None):
- if name is None:
- name = artifactId
- copiedWars = []
- warFiles = glob(join(resultDir, artifactId, "target", "*.war"))
- warFiles.extend(glob(join(resultDir, artifactId, "*", "target", "*.war")))
- for warFile in warFiles:
- if len(warFiles) == 1:
- deployName = "%s.war" % (name)
- else:
- deployName = "%s-%d.war" % (name, warFiles.index(warFile))
- print("Copying .war file %s as %s to result folder" % (basename(warFile), deployName))
- copy(warFile, join(resultDir, deployName))
- copiedWars.append(join(resultDir, deployName))
- return copiedWars
-
- def readPomFile(pomFile):
- # pom.xml namespace workaround
- root = ElementTree.parse(pomFile).getroot()
- nameSpace = root.tag[1:root.tag.index('}')]
- ElementTree.register_namespace('', nameSpace)
-
- # Read the pom.xml correctly
- return ElementTree.parse(pomFile), nameSpace
-
- # Recursive pom.xml update script
- def updateRepositories(path, repoUrl = None, version = None, postfix = "staging"):
- # If versions are not supplied, parse arguments
- if version is None:
- version = getArgs().version
-
- # Read pom.xml
- pomXml = join(path, "pom.xml")
- if isfile(pomXml):
- # Read the pom.xml correctly
- tree, nameSpace = readPomFile(pomXml)
-
- # NameSpace needed for finding the repositories node
- repoNode = tree.getroot().find("{%s}repositories" % (nameSpace))
- else:
- return
-
- if repoNode is not None:
- print("Add staging repositories to " + pomXml)
-
- # Add framework staging repository
- addRepo(repoNode, "repository", "vaadin-%s-%s" % (version, postfix), repoUrl)
-
- # Find the correct pluginRepositories node
- pluginRepo = tree.getroot().find("{%s}pluginRepositories" % (nameSpace))
- if pluginRepo is None:
- # Add pluginRepositories node if needed
- pluginRepo = ElementTree.SubElement(tree.getroot(), "pluginRepositories")
-
- # Add plugin staging repository
- addRepo(pluginRepo, "pluginRepository", "vaadin-%s-%s" % (version, postfix), repoUrl)
-
- # Overwrite the modified pom.xml
- tree.write(pomXml, encoding='UTF-8')
-
- # Recursive pom.xml search.
- for i in listdir(path):
- file = join(path, i)
- if isdir(file):
- updateRepositories(join(path, i), repoUrl, version, postfix)
-
- # Add a repository of repoType to given repoNode with id and URL
- def addRepo(repoNode, repoType, id, url):
- newRepo = ElementTree.SubElement(repoNode, repoType)
- idElem = ElementTree.SubElement(newRepo, "id")
- idElem.text = id
- urlElem = ElementTree.SubElement(newRepo, "url")
- urlElem.text = url
-
- # Get a logfile for given artifact
- def getLogFile(artifact, resultDir = resultPath):
- return open(join(resultDir, "%s.log" % (artifact)), 'w')
-
- def removeDir(subdir):
- if '..' in subdir or '/' in subdir:
- # Dangerous relative paths.
- return
- rmtree(join(resultPath, subdir))
-
- def mavenInstall(pomFile, jarFile = None, mvnCmd = mavenCmd, logFile = sys.stdout):
- cmd = [mvnCmd, "install:install-file"]
- cmd.append("-Dfile=%s" % (jarFile if jarFile is not None else pomFile))
- cmd.append("-DpomFile=%s" % (pomFile))
- print("executing: %s" % (" ".join(cmd)))
- subprocess.check_call(cmd, stdout=logFile)
|