From df80f003108d5f803717ecd7d8789d865b30731a Mon Sep 17 00:00:00 2001 From: Teemu Suo-Anttila Date: Thu, 7 Sep 2017 16:27:25 +0300 Subject: [PATCH] Combine Archetype and Demo build scripts (#9943) --- scripts/BuildArchetypes.py | 103 ------------------------------------- scripts/BuildDemos.py | 91 +++++++++++++++++++++----------- scripts/BuildHelpers.py | 76 +++++++-------------------- 3 files changed, 81 insertions(+), 189 deletions(-) delete mode 100644 scripts/BuildArchetypes.py diff --git a/scripts/BuildArchetypes.py b/scripts/BuildArchetypes.py deleted file mode 100644 index 802e97c78c..0000000000 --- a/scripts/BuildArchetypes.py +++ /dev/null @@ -1,103 +0,0 @@ -#coding=UTF-8 - -# -# Windows users: -# You need to setup your environment so that you have mvn on your PATH. -# Maven needs that JAVA_HOME environment is set and points to a JDK -# Python3 is required as this script uses some Python3 specific features. -# Might work with Python2, haven't tested. -# -# python BuildArchetypes.py version --repo staging-repo-url -# - -import subprocess, sys -from os.path import join - -## DEFAULT VARIABLES ## - -# ArchetypeGroupId -archetypeGroup = "com.vaadin" - -# List of built archetypes -archetypes = [ - "vaadin-archetype-widget", - "vaadin-archetype-application", - "vaadin-archetype-application-example", - "vaadin-archetype-application-multimodule" -] - -# Maven GroupID -group = "testpkg" - -log = None -args = None - -## BUILDING METHODS ## - -# Generates and modifies a maven pom file -def generateArchetype(archetype, artifactId, repo): - # Generate the required command line for archetype generation - cmd = [mavenCmd, "archetype:generate"] - cmd.append("-DarchetypeGroupId=%s" % (archetypeGroup)) - cmd.append("-DarchetypeArtifactId=%s" % (archetype)) - cmd.append("-DarchetypeVersion=%s" % (args.version)) - if repo is not None: - cmd.append("-DarchetypeRepository=%s" % repo) - cmd.append("-DgroupId=%s" % (group)) - cmd.append("-DartifactId=%s" % (artifactId)) - cmd.append("-Dversion=1.0-SNAPSHOT") - cmd.append("-DinteractiveMode=false") - if hasattr(args, "maven") and args.maven is not None: - cmd.extend(args.maven.strip('"').split(" ")) - - # Generate pom.xml - print("Generating pom.xml for archetype %s" % (archetype)) - subprocess.check_call(cmd, cwd=resultPath, stdout=log) - -def getDeploymentContext(archetype, version): - return "%s-%s" % (archetype.split("-", 2)[2], version) - -## DO THIS IF RUN AS A SCRIPT (not import) ## -if __name__ == "__main__": - from BuildHelpers import mavenValidate, copyWarFiles, getLogFile, mavenCmd, updateRepositories, getArgs, removeDir, parser, resultPath - from DeployHelpers import deployWar - - archetypesFailed = False - - # Parse the arguments - args = getArgs() - - wars = {} - - for archetype in archetypes: - artifactId = "test-%s-%s" % (archetype, args.version.replace(".", "-")) - try: - log = getLogFile(archetype) - generateArchetype(archetype, artifactId, args.pluginRepo) - if hasattr(args, "fwRepo") and args.fwRepo is not None: - updateRepositories(join(resultPath, artifactId), args.fwRepo) - if hasattr(args, "pluginRepo") and args.pluginRepo is not None: - updateRepositories(join(resultPath, artifactId), args.pluginRepo, postfix="plugin") - mavenValidate(artifactId, logFile=log) - warFiles = copyWarFiles(artifactId, name=archetype) - for war in warFiles: - wars[war] = "%s.war" % (getDeploymentContext(archetype, args.version)) - print("%s validation succeeded!" % (archetype)) - except Exception as e: - print("Archetype %s build failed:" % (archetype), e) - archetypesFailed = True - try: - removeDir(artifactId) - except: - pass - print("") - - for i in wars: - try: - deployWar(i, wars[i]) - except Exception as e: - print("War %s failed to deploy: %s" % (war, e)) - archetypesFailed = True - - if archetypesFailed: - sys.exit(1) diff --git a/scripts/BuildDemos.py b/scripts/BuildDemos.py index f691f851d0..faaf116e26 100644 --- a/scripts/BuildDemos.py +++ b/scripts/BuildDemos.py @@ -23,6 +23,14 @@ demos = { # "my-demo" : ("my_demo_url_or_path", "my-demo-dev-branch") } +# List of built archetypes +archetypes = [ + "vaadin-archetype-widget", + "vaadin-archetype-application", + "vaadin-archetype-application-example", + "vaadin-archetype-application-multimodule" +] + status_dump = {"messages": []} def dump_status(error_occurred): @@ -32,55 +40,78 @@ def dump_status(error_occurred): def log_status(log_string): status_dump["messages"].append(log_string) print(log_string) + sys.stdout.flush() def checkout(folder, url, repoBranch = "master"): Repo.clone_from(url, join(resultPath, folder), branch = repoBranch) if __name__ == "__main__": - # Do imports. + # Do imports. try: from git import Repo except: log_status("BuildDemos depends on gitpython. Install it with `pip install gitpython`") dump_status(True) sys.exit(1) - from BuildHelpers import updateRepositories, mavenValidate, copyWarFiles, getLogFile, removeDir, getArgs, mavenInstall, resultPath, readPomFile, parser, dockerWrap + from BuildHelpers import mavenValidate, copyWarFiles, getLogFile, removeDir, getArgs, resultPath, parser, dockerWrap, generateArchetype from DeployHelpers import deployWar # Add command line agrument for ignoring failing demos parser.add_argument("--ignore", type=str, help="Ignored demos", default="") + + # Control to skip demos and archetypes + parser.add_argument("--skipDemos", action="store_true", help="Skip building demos") + parser.add_argument("--skipArchetypes", action="store_true", help="Skip building archetypes") + args = getArgs() demosFailed = False ignoredDemos = args.ignore.split(",") wars = [] - for demo in demos: - print("Validating demo %s" % (demo)) - try: - repo = demos[demo] - if (isinstance(repo, tuple)): - checkout(demo, repo[0], repo[1]) - else: - checkout(demo, repo) - if hasattr(args, "fwRepo") and args.fwRepo is not None: - updateRepositories(join(resultPath, demo), args.fwRepo) - if hasattr(args, "pluginRepo") and args.pluginRepo is not None: - updateRepositories(join(resultPath, demo), args.pluginRepo, postfix="plugin") - mavenValidate(demo, logFile=getLogFile(demo)) - wars.extend(copyWarFiles(demo)) - log_status("%s demo validation succeeded!" % (demo)) - except Exception as e: - log_status("%s demo validation failed: %s" % (demo, e)) - if demo not in ignoredDemos: - demosFailed = True - except EnvironmentError as e: - log_status("%s demo validation failed: %s" % (demo, e)) - if demo not in ignoredDemos: - demosFailed = True - try: - removeDir(demo) - except: - pass - print("") + if not args.skipDemos: + for demo in demos: + print("Validating demo %s" % (demo)) + try: + repo = demos[demo] + if (isinstance(repo, tuple)): + checkout(demo, repo[0], repo[1]) + else: + checkout(demo, repo) + mavenValidate(demo, logFile=getLogFile(demo)) + wars.extend(copyWarFiles(demo)) + log_status("%s demo validation succeeded!" % (demo)) + except Exception as e: + log_status("%s demo validation failed: %s" % (demo, e)) + if demo not in ignoredDemos: + demosFailed = True + except EnvironmentError as e: + log_status("%s demo validation failed: %s" % (demo, e)) + if demo not in ignoredDemos: + demosFailed = True + try: + removeDir(demo) + except: + pass + log_status("") + + if not args.skipArchetypes: + for archetype in archetypes: + artifactId = "test-%s-%s" % (archetype, args.version.replace(".", "-")) + try: + log = getLogFile(archetype) + generateArchetype(archetype, artifactId, args.pluginRepo, log) + mavenValidate(artifactId, logFile=log) + wars.extend(copyWarFiles(artifactId, name=archetype)) + log_status("%s validation succeeded!" % (archetype)) + except Exception as e: + print("Archetype %s build failed:" % (archetype), e) + if archetype not in ignoredDemos: + demosFailed = True + + try: + removeDir(artifactId) + except: + pass + log_status("") if args.deploy_mode: for war in wars: diff --git a/scripts/BuildHelpers.py b/scripts/BuildHelpers.py index 9803e310fc..9dd7ab66e0 100644 --- a/scripts/BuildHelpers.py +++ b/scripts/BuildHelpers.py @@ -102,55 +102,26 @@ def copyWarFiles(artifactId, resultDir = resultPath, name = None): 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) +# Generates and modifies a maven pom file +def generateArchetype(archetype, artifactId, repo, logFile, group="testpkg", archetypeGroup="com.vaadin"): + # Generate the required command line for archetype generation + args = getArgs() + cmd = [mavenCmd, "archetype:generate"] + cmd.append("-DarchetypeGroupId=%s" % (archetypeGroup)) + cmd.append("-DarchetypeArtifactId=%s" % (archetype)) + cmd.append("-DarchetypeVersion=%s" % (args.version)) + if repo is not None: + cmd.append("-DarchetypeRepository=%s" % repo) + cmd.append("-DgroupId=%s" % (group)) + cmd.append("-DartifactId=%s" % (artifactId)) + cmd.append("-Dversion=1.0-SNAPSHOT") + cmd.append("-DinteractiveMode=false") + if hasattr(args, "maven") and args.maven is not None: + cmd.extend(args.maven.strip('"').split(" ")) + + # Generate pom.xml + print("Generating archetype %s" % (archetype)) + subprocess.check_call(cmd, cwd=resultPath, stdout=logFile) # Add a repository of repoType to given repoNode with id and URL def addRepo(repoNode, repoType, id, url): @@ -170,13 +141,6 @@ def removeDir(subdir): 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) - def dockerWrap(imageVersion, imageName = "demo-validation"): dockerFileContent = """FROM jetty:jre8-alpine MAINTAINER FrameworkTeam -- 2.39.5