diff options
author | Teemu Suo-Anttila <tsuoanttila@users.noreply.github.com> | 2017-08-16 15:00:58 +0300 |
---|---|---|
committer | Henri Sara <henri.sara@gmail.com> | 2017-08-16 15:00:58 +0300 |
commit | 318fb10f6a4ad9cc1cd7f31f574fa4c50eec951e (patch) | |
tree | 38c7a8ac3671760f1396b9a2e5be0d7b6bc10531 | |
parent | 4cd7965fda54a124ea01066b5e9f6d9ee124ab1b (diff) | |
download | vaadin-framework-318fb10f6a4ad9cc1cd7f31f574fa4c50eec951e.tar.gz vaadin-framework-318fb10f6a4ad9cc1cd7f31f574fa4c50eec951e.zip |
Build docker image for testing demos (#9826)
This patch allows the demo build script to wrap the resulting war files into docker image. The image contains a jetty with the provided war files deployed on start.
-rw-r--r-- | scripts/BuildDemos.py | 18 | ||||
-rw-r--r-- | scripts/BuildHelpers.py | 68 | ||||
-rw-r--r-- | scripts/DeployHelpers.py | 12 |
3 files changed, 78 insertions, 20 deletions
diff --git a/scripts/BuildDemos.py b/scripts/BuildDemos.py index fd4c84fc32..f691f851d0 100644 --- a/scripts/BuildDemos.py +++ b/scripts/BuildDemos.py @@ -44,7 +44,7 @@ if __name__ == "__main__": 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 + from BuildHelpers import updateRepositories, mavenValidate, copyWarFiles, getLogFile, removeDir, getArgs, mavenInstall, resultPath, readPomFile, parser, dockerWrap from DeployHelpers import deployWar # Add command line agrument for ignoring failing demos parser.add_argument("--ignore", type=str, help="Ignored demos", default="") @@ -82,12 +82,16 @@ if __name__ == "__main__": pass print("") - for war in wars: - try: - deployWar(war) - except Exception as e: - log_status("War %s failed to deploy: %s" % (war, e)) - demosFailed = True + if args.deploy_mode: + for war in wars: + try: + deployWar(war) + except Exception as e: + log_status("War %s failed to deploy: %s" % (war, e)) + demosFailed = True + else: + dockerWrap(args.version) + if demosFailed: dump_status(True) diff --git a/scripts/BuildHelpers.py b/scripts/BuildHelpers.py index 02fddc7af3..9803e310fc 100644 --- a/scripts/BuildHelpers.py +++ b/scripts/BuildHelpers.py @@ -10,7 +10,6 @@ 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): @@ -39,26 +38,27 @@ def parseArgs(): args = parser.parse_args() return args -# Function for determining the path for maven executable -def getMavenCommand(): +# Function for determining the path for an executable +def getCommand(command): # 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] + return subprocess.check_output(["where", "%s.cmd" % (command)], universal_newlines=True).split("\n")[0] except: try: - return subprocess.check_output(["where", "mvn.bat"], universal_newlines=True).split("\n")[0] + return subprocess.check_output(["where", "%s.bat" % (command)], universal_newlines=True).split("\n")[0] except: - print("Unable to locate mvn with where. Is the maven executable in your PATH?") + print("Unable to locate command %s with where. Is it in your PATH?" % (command)) else: try: - return subprocess.check_output(["which", "mvn"], universal_newlines=True).split("\n")[0] + return subprocess.check_output(["which", command], universal_newlines=True).split("\n")[0] except: - print("Unable to locate maven executable with which. Is the maven executable in your PATH?") + print("Unable to locate command %s with which. Is it in your PATH?" % (command)) return None -mavenCmd = getMavenCommand() +mavenCmd = getCommand("mvn") +dockerCmd = getCommand("docker") # Get command line arguments. Parses arguments if needed. def getArgs(): @@ -176,3 +176,53 @@ def mavenInstall(pomFile, jarFile = None, mvnCmd = mavenCmd, logFile = sys.stdou 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 + +RUN apk add --update sed + +#Autodeploy folder: +#/var/lib/jetty/webapps/ + +COPY ./*.war /var/lib/jetty/webapps/ +COPY ./index-generate.sh /opt/ +RUN chmod +x /opt/index-generate.sh + +RUN /opt/index-generate.sh + +RUN mkdir -p /var/lib/jetty/webapps/root && \ + cp /opt/index.html /var/lib/jetty/webapps/root && \ + chmod 644 /var/lib/jetty/webapps/root/index.html + +EXPOSE 8080 +""" + indexGenerateScript = """#!/bin/ash + +wars="/var/lib/jetty/webapps" +OUTPUT="/opt/index.html" + +echo "<UL>" > $OUTPUT +cd $wars +for war in `ls -1 *.war`; do + nowar=`echo "$war" | sed -e 's/\(^.*\)\(.war$\)/\\1/'` + echo "<LI><a href=\"/$nowar/\">$nowar</a></LI>" >> $OUTPUT +done +echo "</UL>" >> $OUTPUT +""" + with open(join(resultPath, "Dockerfile"), "w") as dockerFile: + dockerFile.write(dockerFileContent) + with open(join(resultPath, "index-generate.sh"), "w") as indexScript: + indexScript.write(indexGenerateScript) + # build image + cmd = [dockerCmd, "build", "-t", "%s:%s" % (imageName, imageVersion), resultPath] + subprocess.check_call(cmd) + # save to tgz + cmd = [dockerCmd, "save", imageName] + dockerSave = subprocess.Popen(cmd, stdout=subprocess.PIPE) + subprocess.check_call(["gzip"], stdin=dockerSave.stdout, stdout=open(join(resultPath, "%s-%s.tgz" % (imageName, imageVersion)), "w")) + dockerSave.wait() + # delete from docker + cmd = [dockerCmd, "rmi", "%s:%s" % (imageName, imageVersion)] + subprocess.check_call(cmd) diff --git a/scripts/DeployHelpers.py b/scripts/DeployHelpers.py index 038e187b8b..e8079c1df1 100644 --- a/scripts/DeployHelpers.py +++ b/scripts/DeployHelpers.py @@ -14,9 +14,13 @@ from os.path import join, expanduser, basename from BuildHelpers import parser, getArgs from time import sleep -parser.add_argument("--deployUrl", help="Wildfly management URL") -parser.add_argument("--deployUser", help="Deployment user", default=None) -parser.add_argument("--deployPass", help="Deployment password", default=None) +group = parser.add_mutually_exclusive_group(required=True) +group.add_argument("--deploy", dest="deploy_mode", help="Deploy to a remote Wildfly instance", action="store_true") +group.add_argument("--docker", dest="deploy_mode", help="Wrap results into a Docker image", action="store_false") + +parser.add_argument("--deployUrl", help="Wildfly management URL to use with --deploy") +parser.add_argument("--deployUser", help="Deployment user to use with --deploy", default=None) +parser.add_argument("--deployPass", help="Deployment password to use with --deploy", default=None) serverUp = None @@ -120,4 +124,4 @@ def getAuth(): # Read the deploy url file and return the url def getUrl(): return getArgs().deployUrl - + |