From 118bd3470e70f0a1e229c3f2907b60304d500cfd Mon Sep 17 00:00:00 2001 From: Ryan Murray Date: Wed, 7 Oct 2020 11:57:11 +0100 Subject: [PATCH 01/11] attempt at gradle plugin --- .gitignore | 2 + pom.xml | 1 + .../apprunner-gradle-plugin-test/build.gradle | 30 +++ .../gradle/wrapper/gradle-wrapper.properties | 24 +++ tools/apprunner-gradle-plugin-test/gradlew | 176 ++++++++++++++++ .../settings.gradle | 29 +++ .../com/dremio/nessie/gradle/TestURL.java | 59 ++++++ tools/apprunner-gradle-plugin/build.gradle | 42 ++++ .../gradle/wrapper/gradle-wrapper.properties | 24 +++ tools/apprunner-gradle-plugin/gradlew | 176 ++++++++++++++++ tools/apprunner-gradle-plugin/settings.gradle | 21 ++ .../nessie/quarkus/gradle/QuarkusApp.java | 188 ++++++++++++++++++ .../quarkus/gradle/QuarkusAppExtension.java | 32 +++ .../quarkus/gradle/QuarkusAppPlugin.java | 70 +++++++ .../nessie/quarkus/gradle/StartTask.java | 108 ++++++++++ .../org.projectnessie.nessie-apprunner | 1 + 16 files changed, 983 insertions(+) create mode 100644 tools/apprunner-gradle-plugin-test/build.gradle create mode 100644 tools/apprunner-gradle-plugin-test/gradle/wrapper/gradle-wrapper.properties create mode 100755 tools/apprunner-gradle-plugin-test/gradlew create mode 100644 tools/apprunner-gradle-plugin-test/settings.gradle create mode 100644 tools/apprunner-gradle-plugin-test/src/test/java/com/dremio/nessie/gradle/TestURL.java create mode 100644 tools/apprunner-gradle-plugin/build.gradle create mode 100644 tools/apprunner-gradle-plugin/gradle/wrapper/gradle-wrapper.properties create mode 100755 tools/apprunner-gradle-plugin/gradlew create mode 100644 tools/apprunner-gradle-plugin/settings.gradle create mode 100644 tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java create mode 100644 tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java create mode 100644 tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppPlugin.java create mode 100644 tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java create mode 100644 tools/apprunner-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.projectnessie.nessie-apprunner diff --git a/.gitignore b/.gitignore index 92a424c3b51..004a405153f 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,5 @@ node_modules/ .project .settings .checkstyle +.gradle +build diff --git a/pom.xml b/pom.xml index 8b452c697ce..2f900139af5 100644 --- a/pom.xml +++ b/pom.xml @@ -826,6 +826,7 @@ limitations under the License. **/*.gz **/*.xls **/META-INF/services/** + **/META-INF/gradle-plugins/** **/*.md **/*.xls **/*.doc diff --git a/tools/apprunner-gradle-plugin-test/build.gradle b/tools/apprunner-gradle-plugin-test/build.gradle new file mode 100644 index 00000000000..15be41cb753 --- /dev/null +++ b/tools/apprunner-gradle-plugin-test/build.gradle @@ -0,0 +1,30 @@ +plugins { + id 'java-gradle-plugin' + id 'org.projectnessie' version '1.1' +} + +allprojects { + group = "org.projectnessie" + version = '1.1' + repositories { + mavenCentral() + mavenLocal() + } +} + +repositories { + mavenCentral() +} + +dependencies { + testCompile "junit:junit:4.+" + quarkusAppRunnerConfig "org.projectnessie:nessie-quarkus:0.1-SNAPSHOT" +// testCompile "" +} + +apply plugin: 'org.projectnessie' + + +tasks.test.dependsOn("quarkus-start").finalizedBy("quarkus-stop") + + diff --git a/tools/apprunner-gradle-plugin-test/gradle/wrapper/gradle-wrapper.properties b/tools/apprunner-gradle-plugin-test/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..1277f7dac0f --- /dev/null +++ b/tools/apprunner-gradle-plugin-test/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,24 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip diff --git a/tools/apprunner-gradle-plugin-test/gradlew b/tools/apprunner-gradle-plugin-test/gradlew new file mode 100755 index 00000000000..e718f9c62b8 --- /dev/null +++ b/tools/apprunner-gradle-plugin-test/gradlew @@ -0,0 +1,176 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +if [ ! -e $APP_HOME/gradle/wrapper/gradle-wrapper.jar ]; then + curl -o $APP_HOME/gradle/wrapper/gradle-wrapper.jar https://raw.githubusercontent.com/gradle/gradle/v5.4.1/gradle/wrapper/gradle-wrapper.jar +fi + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/tools/apprunner-gradle-plugin-test/settings.gradle b/tools/apprunner-gradle-plugin-test/settings.gradle new file mode 100644 index 00000000000..708cc573217 --- /dev/null +++ b/tools/apprunner-gradle-plugin-test/settings.gradle @@ -0,0 +1,29 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + } +} + +includeBuild '../apprunner-gradle-plugin' +rootProject.name = 'nessie-apprunner-test' + diff --git a/tools/apprunner-gradle-plugin-test/src/test/java/com/dremio/nessie/gradle/TestURL.java b/tools/apprunner-gradle-plugin-test/src/test/java/com/dremio/nessie/gradle/TestURL.java new file mode 100644 index 00000000000..24f515cda8d --- /dev/null +++ b/tools/apprunner-gradle-plugin-test/src/test/java/com/dremio/nessie/gradle/TestURL.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2020 Dremio + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.dremio.nessie.gradle; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; + +import org.junit.Assert; +import org.junit.Test; + +public class TestURL { + + @Test + public void testUrl() { + URL url; + + try { + // get URL content + + String a="http://localhost:19120/api/v1/trees/tree/main"; + url = new URL(a); + URLConnection conn = url.openConnection(); + + // open the stream and put it into BufferedReader + BufferedReader br = new BufferedReader( + new InputStreamReader(conn.getInputStream())); + + String inputLine; + while ((inputLine = br.readLine()) != null) { + System.out.println(inputLine); + } + br.close(); + + System.out.println("Done"); + + } catch (IOException e) { + e.printStackTrace(); + Assert.fail(); + } + + } +} diff --git a/tools/apprunner-gradle-plugin/build.gradle b/tools/apprunner-gradle-plugin/build.gradle new file mode 100644 index 00000000000..7d3a21e2bbc --- /dev/null +++ b/tools/apprunner-gradle-plugin/build.gradle @@ -0,0 +1,42 @@ +plugins { + id 'java-gradle-plugin' + id 'maven-publish' +} + +allprojects { + group = "org.projectnessie" + version = '1.1' + repositories { + mavenCentral() + mavenLocal() + } +} + +gradlePlugin { + plugins { + simplePlugin { + id = 'org.projectnessie' + implementationClass = 'com.dremio.nessie.quarkus.gradle.QuarkusAppPlugin' + } + } +} + +repositories { + mavenCentral() +} + +dependencies { + compile "io.quarkus:quarkus-bootstrap-core:1.8.1.Final" +} + +publishing { + publications { + maven(MavenPublication) { + groupId = 'org.projectnessie' + artifactId = 'nessie-apprunner' + version = '1.1' + + from components.java + } + } +} diff --git a/tools/apprunner-gradle-plugin/gradle/wrapper/gradle-wrapper.properties b/tools/apprunner-gradle-plugin/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..1277f7dac0f --- /dev/null +++ b/tools/apprunner-gradle-plugin/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,24 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip diff --git a/tools/apprunner-gradle-plugin/gradlew b/tools/apprunner-gradle-plugin/gradlew new file mode 100755 index 00000000000..e718f9c62b8 --- /dev/null +++ b/tools/apprunner-gradle-plugin/gradlew @@ -0,0 +1,176 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +if [ ! -e $APP_HOME/gradle/wrapper/gradle-wrapper.jar ]; then + curl -o $APP_HOME/gradle/wrapper/gradle-wrapper.jar https://raw.githubusercontent.com/gradle/gradle/v5.4.1/gradle/wrapper/gradle-wrapper.jar +fi + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/tools/apprunner-gradle-plugin/settings.gradle b/tools/apprunner-gradle-plugin/settings.gradle new file mode 100644 index 00000000000..7a30cc1899a --- /dev/null +++ b/tools/apprunner-gradle-plugin/settings.gradle @@ -0,0 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +rootProject.name = 'nessie-apprunner' + diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java new file mode 100644 index 00000000000..5dfe2021846 --- /dev/null +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2020 Dremio + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.dremio.nessie.quarkus.gradle; + +import java.io.File; +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.function.Consumer; + +import org.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.Dependency; +import org.gradle.api.artifacts.ModuleVersionIdentifier; +import org.gradle.api.artifacts.ResolvedArtifact; +import org.gradle.api.internal.artifacts.dependencies.DefaultExternalModuleDependency; +import org.gradle.api.internal.artifacts.ivyservice.DefaultUnresolvedDependency; +import org.gradle.tooling.GradleConnector; +import org.gradle.tooling.ModelBuilder; +import org.gradle.tooling.ProjectConnection; + +import io.quarkus.bootstrap.app.CuratedApplication; +import io.quarkus.bootstrap.app.QuarkusBootstrap; +import io.quarkus.bootstrap.app.QuarkusBootstrap.Mode; +import io.quarkus.bootstrap.app.RunningQuarkusApplication; +import io.quarkus.bootstrap.app.StartupAction; +import io.quarkus.bootstrap.model.AppArtifact; +import io.quarkus.bootstrap.model.AppDependency; +import io.quarkus.bootstrap.model.AppModel; +import io.quarkus.bootstrap.resolver.AppModelResolverException; +import io.quarkus.bootstrap.resolver.QuarkusGradleModelFactory; +import io.quarkus.bootstrap.resolver.model.QuarkusModel; +import io.quarkus.bootstrap.util.QuarkusModelHelper; + +import com.google.common.collect.ImmutableList; + + +/** + * Test. + */ +public class QuarkusApp implements AutoCloseable { + + private final RunningQuarkusApplication runningApp; + + private QuarkusApp(RunningQuarkusApplication runningApp) { + this.runningApp = runningApp; + } + + public static QuarkusApp newApplication(Configuration configuration, Configuration deploy, Project project) { + + final AppModel appModel; +// try { +// AppArtifact appArtifact = toDependency(configuration.getDependencies().stream().findFirst().get()); +// Optional path = configuration.getFiles().stream().map(File::getAbsolutePath).filter(x->x.contains(appArtifact.getArtifactId())) +// .filter(x->x.contains(appArtifact.getGroupId().replace(".", File.separator))) +// .filter(x->x.contains(appArtifact.getVersion())) +// .findFirst(); +// appArtifact.setPath(Paths.get(path.orElseThrow(() -> new UnsupportedOperationException("xxx")))); +// QuarkusModel qm = QuarkusGradleModelFactory.create(project.getProjectDir(), "test"); +// appModel = QuarkusModelHelper.convert(qm, appArtifact); +// } catch (Exception e) { +// throw new RuntimeException(e); +// } + + appModel = convert(configuration, deploy); + + URL[] urls = appModel.getFullDeploymentDeps().stream().map(QuarkusApp::toUrl).toArray(URL[]::new); + ClassLoader cl = new URLClassLoader(urls, QuarkusApp.class.getClassLoader()); + final QuarkusBootstrap bootstrap = QuarkusBootstrap.builder() + .setAppArtifact(appModel.getAppArtifact()) + .setBaseClassLoader(QuarkusApp.class.getClassLoader()).setExistingModel(appModel) + .setProjectRoot(project.getProjectDir().toPath()) + .setTargetDirectory(Paths.get(project.getBuildDir().getPath())).setIsolateDeployment(true) + .setMode(Mode.TEST).build(); + + try { + final CuratedApplication app = bootstrap.bootstrap(); + StartupAction startupAction = app.createAugmentor().createInitialRuntimeApplication(); + exitHandler(startupAction); + RunningQuarkusApplication runningApp = startupAction.runMainClass(); + return new QuarkusApp(runningApp); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + private static URL toUrl(AppDependency dep) { + try { + return dep.getArtifact().getPaths().getSinglePath().toUri().toURL(); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + private static void exitHandler(StartupAction startupAction) throws ReflectiveOperationException { + Consumer consumer = i -> { + }; + Method exitHandler = Arrays + .stream(startupAction.getClassLoader() + .loadClass("io.quarkus.runtime.ApplicationLifecycleManager").getMethods()) + .filter(x -> x.getName().equals("setDefaultExitCodeHandler")).findFirst() + .orElseThrow(NoSuchMethodException::new); + exitHandler.invoke(null, consumer); + } + + @Override + public void close() throws Exception { + runningApp.close(); + } + + public static AppModel convert(Configuration configuration, Configuration deploy) { + + AppModel.Builder appBuilder = new AppModel.Builder(); + + final Set userDeps = new HashSet<>(); + final Set deployDeps = new HashSet<>(); + configuration.getResolvedConfiguration() + .getResolvedArtifacts() + .stream() + .map(QuarkusApp::toDependency).forEach(userDeps::add); + configuration.getResolvedConfiguration() + .getResolvedArtifacts() + .stream() + .filter(x -> x.getName().contains("quarkus")) + .map(x -> new DefaultExternalModuleDependency(x.getModuleVersion().getId().getGroup(), x.getName() + ((x.getName().contains("deployment")) ? "" : "-deployment"), x.getModuleVersion().getId().getVersion())) + .forEach(x -> deploy.getDependencies().add(x)); + + Configuration newDeploy = deploy.copy(); + newDeploy.getResolvedConfiguration().getLenientConfiguration().getUnresolvedModuleDependencies().forEach(x -> deploy.getDependencies().remove(unresolvedToExternal((DefaultUnresolvedDependency) x))); + deploy.getResolvedConfiguration().getResolvedArtifacts().stream() + .map(QuarkusApp::toDependency).forEach(deployDeps::add); + AppArtifact appArtifact = toDependency(configuration.getDependencies().stream().findFirst().get()); + Optional path = configuration.getFiles().stream().map(File::getAbsolutePath).filter(x->x.contains(appArtifact.getArtifactId())) + .filter(x->x.contains(appArtifact.getGroupId().replace(".", File.separator))) + .filter(x->x.contains(appArtifact.getVersion())) + .findFirst(); + appArtifact.setPath(Paths.get(path.orElseThrow(() -> new UnsupportedOperationException("xxx")))); + //deployDeps.removeAll(userDeps); + List userDeps2 = new ArrayList<>(userDeps); + userDeps.addAll(deployDeps); + List allDeps = new ArrayList<>(userDeps); + appBuilder.addRuntimeDeps(new ArrayList<>(userDeps2)) + .addFullDeploymentDeps(allDeps) + .addDeploymentDeps(new ArrayList<>(deployDeps)) + .setAppArtifact(appArtifact); + return appBuilder.build(); + } + + private static Dependency unresolvedToExternal(DefaultUnresolvedDependency dependency) { + return new DefaultExternalModuleDependency(dependency.getSelector().getGroup(), dependency.getSelector().getName(), dependency.getSelector().getVersion()); + } + private static AppArtifact toDependency(Dependency dependency) { + AppArtifact artifact = new AppArtifact(dependency.getGroup(), dependency.getName(), null, + "jar", dependency.getVersion()); +// artifact.setPaths(QuarkusModelHelper.toPathsCollection(ImmutableList.of(dependency.getFile()))); + return artifact; + } + + private static AppDependency toDependency(ResolvedArtifact dependency) { + ModuleVersionIdentifier id = dependency.getModuleVersion().getId(); + AppArtifact artifact = new AppArtifact(id.getGroup(), dependency.getName(), dependency.getClassifier(), + dependency.getType(), id.getVersion()); + artifact.setPaths(QuarkusModelHelper.toPathsCollection(ImmutableList.of(dependency.getFile()))); + return new AppDependency(artifact, "runtime"); + } +} diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java new file mode 100644 index 00000000000..18f2b8c441d --- /dev/null +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2020 Dremio + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.dremio.nessie.quarkus.gradle; + +import org.gradle.api.Project; +import org.gradle.api.provider.Property; + +public class QuarkusAppExtension { + private final Property quarkusAppCoordinates; + + public QuarkusAppExtension(Project project) { + quarkusAppCoordinates = project.getObjects().property(String.class); + } + + public Property getQuarkusAppCoordinates() { + return quarkusAppCoordinates; + } +} diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppPlugin.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppPlugin.java new file mode 100644 index 00000000000..11d842debd5 --- /dev/null +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppPlugin.java @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2020 Dremio + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.dremio.nessie.quarkus.gradle; + + +import org.gradle.api.Action; +import org.gradle.api.Plugin; +import org.gradle.api.Project; +import org.gradle.api.Task; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.DependencySet; + + +public class QuarkusAppPlugin implements Plugin { + + private String foo = "Bar"; + + + @Override + public void apply(Project target) { +// QuarkusAppExtension extension = target.getExtensions().create("quarkusAppRunner", QuarkusAppExtension.class, target); + + final Configuration config = target.getConfigurations().create("quarkusAppRunnerConfig") + .setVisible(false) + .setDescription("The config for the Quarkus Runner."); + + config.defaultDependencies(new Action() { + public void execute(DependencySet dependencies) { + dependencies.add(target.getDependencies().create("org.projectnessie:nessie-quarkus:0.1-SNAPSHOT")); + } + }); + + final Configuration configDeploy = target.getConfigurations().create("quarkusAppRunnerDeploy") + .setVisible(false) + .setDescription("The config for the Quarkus Runner."); + + configDeploy.defaultDependencies(new Action() { + public void execute(DependencySet dependencies) { + dependencies.add(target.getDependencies().create("io.quarkus:quarkus-bootstrap-core:1.8.1.Final")); + } + }); + + target.getTasks().register("quarkus-start", StartTask.class, new Action() { + @Override + public void execute(StartTask task) { + task.setConfig(config, configDeploy); + } + }); + target.getTasks().register("quarkus-stop", new Action() { + @Override + public void execute(Task task) { + + } + }); + + } +} diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java new file mode 100644 index 00000000000..60589975805 --- /dev/null +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2020 Dremio + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.dremio.nessie.quarkus.gradle; + +import io.quarkus.bootstrap.model.AppArtifactCoords; +import io.quarkus.bootstrap.model.AppModel; +import io.quarkus.bootstrap.resolver.AppModelResolverException; +import io.quarkus.bootstrap.resolver.model.QuarkusModel; +import io.quarkus.bootstrap.utils.BuildToolHelper; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.nio.file.Paths; + +import org.apache.maven.artifact.Artifact; +import org.gradle.api.DefaultTask; +import org.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.file.ConfigurableFileCollection; +import org.gradle.api.file.FileCollection; +import org.gradle.api.provider.Property; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.InputFiles; +import org.gradle.api.tasks.TaskAction; + +public class StartTask extends DefaultTask { + private Configuration dataFiles; + private Configuration configDeploy; + + public StartTask() { + + } + + @TaskAction + public void start() { + getLogger().info("Starting Quarkus application."); + + final URL[] urls = getDataFiles().getFiles().stream().map(StartTask::toURL).toArray(URL[]::new); + + // Use MavenProject classloader as parent classloader as Maven classloader hierarchy is not linear + final URLClassLoader mirrorCL = new URLClassLoader(urls, this.getClass().getClassLoader()); + + final AutoCloseable quarkusApp; // = QuarkusApp.newApplication(dataFiles, configDeploy, getProject()); + try { + Class clazz = mirrorCL.loadClass(QuarkusApp.class.getName()); + Method newApplicationMethod = clazz.getMethod("newApplication", Configuration.class, Configuration.class, Project.class); + quarkusApp = (AutoCloseable) newApplicationMethod.invoke(null, dataFiles, configDeploy, getProject()); + } catch (ReflectiveOperationException e) { + e.printStackTrace(); + } + + getLogger().info("Quarkus application started."); + +// // Make sure classloader is closed too when the app is stopped +// setApplicationHandle(() -> { +// try { +// quarkusApp.close(); +// } finally { +// mirrorCL.close(); +// } +// }); + } + + @InputFiles + private FileCollection getDataFiles() { + return dataFiles; + } + + public void setConfig(Configuration files, Configuration configDeploy) { + this.dataFiles = files; + this.configDeploy = configDeploy; + } + +// protected void setApplicationHandle(AutoCloseable application) { +// final String key = getContextKey(); +// final Object previous = project.getContextValue(key); +// if (previous != null) { +// getLogger().warn(String.format("Found a previous application for execution id %s.", getExecutionId())); +// } +// project.setContextValue(key, application); +// } + + private static URL toURL(File artifact) { + try { + return artifact.toURI().toURL(); + } catch (MalformedURLException e) { + throw new IllegalArgumentException(e); + } + } +} diff --git a/tools/apprunner-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.projectnessie.nessie-apprunner b/tools/apprunner-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.projectnessie.nessie-apprunner new file mode 100644 index 00000000000..9c04426ffc3 --- /dev/null +++ b/tools/apprunner-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.projectnessie.nessie-apprunner @@ -0,0 +1 @@ +implementation=com.dremio.nessie.quarkus.gradle.QuarkusAppPlugin From dc2903ca3ee4a098c6eaec445af9bc8daa1c85c8 Mon Sep 17 00:00:00 2001 From: Ryan Murray Date: Fri, 9 Oct 2020 19:25:11 +0100 Subject: [PATCH 02/11] pre-cleanup commit. Working plugin --- .github/workflows/main.yml | 28 +++ .github/workflows/pull-request.yml | 22 +++ .gitignore | 9 + pom.xml | 6 + .../apprunner-gradle-plugin-test/build.gradle | 30 --- .../gradle/wrapper/gradle-wrapper.properties | 24 --- tools/apprunner-gradle-plugin-test/gradlew | 176 ------------------ .../settings.gradle | 29 --- .../com/dremio/nessie/gradle/TestURL.java | 59 ------ tools/apprunner-gradle-plugin/build.gradle | 17 +- tools/apprunner-gradle-plugin/settings.gradle | 2 +- .../nessie/quarkus/gradle/QuarkusApp.java | 140 +++++++++----- .../quarkus/gradle/QuarkusAppExtension.java | 32 ---- .../quarkus/gradle/QuarkusAppPlugin.java | 29 +-- .../nessie/quarkus/gradle/StartTask.java | 60 +++--- .../nessie/quarkus/gradle/StopTask.java | 52 ++++++ ...jectnessie.nessie-apprunner-gradle-plugin} | 0 tools/pom.xml | 29 +++ 18 files changed, 283 insertions(+), 461 deletions(-) delete mode 100644 tools/apprunner-gradle-plugin-test/build.gradle delete mode 100644 tools/apprunner-gradle-plugin-test/gradle/wrapper/gradle-wrapper.properties delete mode 100755 tools/apprunner-gradle-plugin-test/gradlew delete mode 100644 tools/apprunner-gradle-plugin-test/settings.gradle delete mode 100644 tools/apprunner-gradle-plugin-test/src/test/java/com/dremio/nessie/gradle/TestURL.java delete mode 100644 tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java create mode 100644 tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java rename tools/apprunner-gradle-plugin/src/main/resources/META-INF/gradle-plugins/{org.projectnessie.nessie-apprunner => org.projectnessie.nessie-apprunner-gradle-plugin} (100%) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 24d2f8d5ff3..2475cc2123e 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -57,6 +57,34 @@ jobs: with: flags: java + gradle: + name: Java/Gradle + runs-on: ubuntu-latest + needs: java + env: + working-directory: ./tools/apprunner-gradle-plugin + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Cache Gradle packages + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + restore-keys: ${{ runner.os }}-gradle + - name: Build with Gradle + run: ./gradlew build + working-directory: ${{env.working-directory}} + - name: Setup publish + run: | + echo '${{ secrets.GRADLE_PUBLISH_KEY }}' >> ~/.gradle/gradle.properties + echo '${{ secrets.GRADLE_PUBLISH_SECRET }}' >> ~/.gradle/gradle.properties + - name: Deploy Plugin snapshot + run: ./gradlew publishPlugins + python: name: Python runs-on: ubuntu-latest diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index cf5f81d3d1a..e7c23a42b81 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -78,6 +78,28 @@ jobs: with: flags: java + gradle: + name: Java/Gradle + runs-on: ubuntu-latest + needs: java + env: + working-directory: ./tools/apprunner-gradle-plugin + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Cache Gradle packages + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + restore-keys: ${{ runner.os }}-gradle + - name: Build with Gradle + run: ./gradlew build + working-directory: ${{env.working-directory}} + python: name: Python runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 004a405153f..4fa107e2b07 100644 --- a/.gitignore +++ b/.gitignore @@ -48,3 +48,12 @@ node_modules/ .checkstyle .gradle build + +# gradle + +tools/apprunner-gradle-plugin/.gradle +tools/apprunner-gradle-plugin/build +tools/apprunner-gradle-plugin/gradle/ +tools/apprunner-gradle-plugin/out +tools/apprunner-gradle-plugin/gradle/wrapper/gradle-wrapper.jar +tools/apprunner-gradle-plugin/version.txt diff --git a/pom.xml b/pom.xml index 2f900139af5..3f2b41b4f64 100644 --- a/pom.xml +++ b/pom.xml @@ -632,6 +632,11 @@ quarkus-maven-plugin ${quarkus.version} + + ru.yaal.maven + write-text-files-maven-plugin + 1.1 + @@ -876,6 +881,7 @@ limitations under the License. **/q **/c.java **/swagger-ui/** + **/gradlew **/node_modules/** diff --git a/tools/apprunner-gradle-plugin-test/build.gradle b/tools/apprunner-gradle-plugin-test/build.gradle deleted file mode 100644 index 15be41cb753..00000000000 --- a/tools/apprunner-gradle-plugin-test/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -plugins { - id 'java-gradle-plugin' - id 'org.projectnessie' version '1.1' -} - -allprojects { - group = "org.projectnessie" - version = '1.1' - repositories { - mavenCentral() - mavenLocal() - } -} - -repositories { - mavenCentral() -} - -dependencies { - testCompile "junit:junit:4.+" - quarkusAppRunnerConfig "org.projectnessie:nessie-quarkus:0.1-SNAPSHOT" -// testCompile "" -} - -apply plugin: 'org.projectnessie' - - -tasks.test.dependsOn("quarkus-start").finalizedBy("quarkus-stop") - - diff --git a/tools/apprunner-gradle-plugin-test/gradle/wrapper/gradle-wrapper.properties b/tools/apprunner-gradle-plugin-test/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 1277f7dac0f..00000000000 --- a/tools/apprunner-gradle-plugin-test/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,24 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip diff --git a/tools/apprunner-gradle-plugin-test/gradlew b/tools/apprunner-gradle-plugin-test/gradlew deleted file mode 100755 index e718f9c62b8..00000000000 --- a/tools/apprunner-gradle-plugin-test/gradlew +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env sh - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -if [ ! -e $APP_HOME/gradle/wrapper/gradle-wrapper.jar ]; then - curl -o $APP_HOME/gradle/wrapper/gradle-wrapper.jar https://raw.githubusercontent.com/gradle/gradle/v5.4.1/gradle/wrapper/gradle-wrapper.jar -fi - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/tools/apprunner-gradle-plugin-test/settings.gradle b/tools/apprunner-gradle-plugin-test/settings.gradle deleted file mode 100644 index 708cc573217..00000000000 --- a/tools/apprunner-gradle-plugin-test/settings.gradle +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -pluginManagement { - repositories { - mavenLocal() - gradlePluginPortal() - } -} - -includeBuild '../apprunner-gradle-plugin' -rootProject.name = 'nessie-apprunner-test' - diff --git a/tools/apprunner-gradle-plugin-test/src/test/java/com/dremio/nessie/gradle/TestURL.java b/tools/apprunner-gradle-plugin-test/src/test/java/com/dremio/nessie/gradle/TestURL.java deleted file mode 100644 index 24f515cda8d..00000000000 --- a/tools/apprunner-gradle-plugin-test/src/test/java/com/dremio/nessie/gradle/TestURL.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2020 Dremio - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.dremio.nessie.gradle; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URL; -import java.net.URLConnection; - -import org.junit.Assert; -import org.junit.Test; - -public class TestURL { - - @Test - public void testUrl() { - URL url; - - try { - // get URL content - - String a="http://localhost:19120/api/v1/trees/tree/main"; - url = new URL(a); - URLConnection conn = url.openConnection(); - - // open the stream and put it into BufferedReader - BufferedReader br = new BufferedReader( - new InputStreamReader(conn.getInputStream())); - - String inputLine; - while ((inputLine = br.readLine()) != null) { - System.out.println(inputLine); - } - br.close(); - - System.out.println("Done"); - - } catch (IOException e) { - e.printStackTrace(); - Assert.fail(); - } - - } -} diff --git a/tools/apprunner-gradle-plugin/build.gradle b/tools/apprunner-gradle-plugin/build.gradle index 7d3a21e2bbc..fa188a0cc95 100644 --- a/tools/apprunner-gradle-plugin/build.gradle +++ b/tools/apprunner-gradle-plugin/build.gradle @@ -1,11 +1,14 @@ plugins { id 'java-gradle-plugin' id 'maven-publish' + id 'com.gradle.plugin-publish' version '0.12.0' } +version = file('version.txt').text.trim() + allprojects { group = "org.projectnessie" - version = '1.1' + version = version repositories { mavenCentral() mavenLocal() @@ -17,6 +20,8 @@ gradlePlugin { simplePlugin { id = 'org.projectnessie' implementationClass = 'com.dremio.nessie.quarkus.gradle.QuarkusAppPlugin' + displayName = 'Quarkus App Runner' + description = 'Start and stop a quarkus app as gradle tasks for integration testing' } } } @@ -29,12 +34,18 @@ dependencies { compile "io.quarkus:quarkus-bootstrap-core:1.8.1.Final" } +pluginBundle { + website = 'https://projectnessie.org' + vcsUrl = 'https://github.com/projectnessie/nessie' + tags = ['test', 'integration', 'quarkus'] +} + publishing { publications { maven(MavenPublication) { groupId = 'org.projectnessie' - artifactId = 'nessie-apprunner' - version = '1.1' + artifactId = 'nessie-apprunner-gradle-plugin' + version = version from components.java } diff --git a/tools/apprunner-gradle-plugin/settings.gradle b/tools/apprunner-gradle-plugin/settings.gradle index 7a30cc1899a..295bd994380 100644 --- a/tools/apprunner-gradle-plugin/settings.gradle +++ b/tools/apprunner-gradle-plugin/settings.gradle @@ -17,5 +17,5 @@ * under the License. */ -rootProject.name = 'nessie-apprunner' +rootProject.name = 'quarkus-apprunner' diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java index 5dfe2021846..5476ffebf60 100644 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java @@ -16,31 +16,42 @@ package com.dremio.nessie.quarkus.gradle; +import static io.quarkus.bootstrap.resolver.maven.DeploymentInjectingDependencyVisitor.toArtifact; + +import java.io.BufferedReader; import java.io.File; +import java.io.IOException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; +import java.nio.file.FileSystem; +import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Optional; +import java.util.Properties; import java.util.Set; import java.util.function.Consumer; +import java.util.stream.Collectors; +import org.eclipse.aether.artifact.Artifact; +import org.gradle.api.GradleException; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Dependency; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradle.api.artifacts.ResolvedArtifact; import org.gradle.api.internal.artifacts.dependencies.DefaultExternalModuleDependency; -import org.gradle.api.internal.artifacts.ivyservice.DefaultUnresolvedDependency; -import org.gradle.tooling.GradleConnector; -import org.gradle.tooling.ModelBuilder; -import org.gradle.tooling.ProjectConnection; +import com.google.common.collect.ImmutableList; + +import io.quarkus.bootstrap.BootstrapConstants; import io.quarkus.bootstrap.app.CuratedApplication; import io.quarkus.bootstrap.app.QuarkusBootstrap; import io.quarkus.bootstrap.app.QuarkusBootstrap.Mode; @@ -49,40 +60,24 @@ import io.quarkus.bootstrap.model.AppArtifact; import io.quarkus.bootstrap.model.AppDependency; import io.quarkus.bootstrap.model.AppModel; -import io.quarkus.bootstrap.resolver.AppModelResolverException; -import io.quarkus.bootstrap.resolver.QuarkusGradleModelFactory; -import io.quarkus.bootstrap.resolver.model.QuarkusModel; import io.quarkus.bootstrap.util.QuarkusModelHelper; - -import com.google.common.collect.ImmutableList; +import io.quarkus.bootstrap.util.ZipUtils; /** - * Test. + * Start and Stop quarkus. */ public class QuarkusApp implements AutoCloseable { - private final RunningQuarkusApplication runningApp; private QuarkusApp(RunningQuarkusApplication runningApp) { this.runningApp = runningApp; } - public static QuarkusApp newApplication(Configuration configuration, Configuration deploy, Project project) { + public static QuarkusApp newApplication(Configuration configuration, Project project) { + Configuration deploy = project.getConfigurations().create("quarkusAppDeploy"); final AppModel appModel; -// try { -// AppArtifact appArtifact = toDependency(configuration.getDependencies().stream().findFirst().get()); -// Optional path = configuration.getFiles().stream().map(File::getAbsolutePath).filter(x->x.contains(appArtifact.getArtifactId())) -// .filter(x->x.contains(appArtifact.getGroupId().replace(".", File.separator))) -// .filter(x->x.contains(appArtifact.getVersion())) -// .findFirst(); -// appArtifact.setPath(Paths.get(path.orElseThrow(() -> new UnsupportedOperationException("xxx")))); -// QuarkusModel qm = QuarkusGradleModelFactory.create(project.getProjectDir(), "test"); -// appModel = QuarkusModelHelper.convert(qm, appArtifact); -// } catch (Exception e) { -// throw new RuntimeException(e); -// } appModel = convert(configuration, deploy); @@ -90,7 +85,7 @@ public static QuarkusApp newApplication(Configuration configuration, Configurati ClassLoader cl = new URLClassLoader(urls, QuarkusApp.class.getClassLoader()); final QuarkusBootstrap bootstrap = QuarkusBootstrap.builder() .setAppArtifact(appModel.getAppArtifact()) - .setBaseClassLoader(QuarkusApp.class.getClassLoader()).setExistingModel(appModel) + .setBaseClassLoader(cl).setExistingModel(appModel) .setProjectRoot(project.getProjectDir().toPath()) .setTargetDirectory(Paths.get(project.getBuildDir().getPath())).setIsolateDeployment(true) .setMode(Mode.TEST).build(); @@ -102,8 +97,7 @@ public static QuarkusApp newApplication(Configuration configuration, Configurati RunningQuarkusApplication runningApp = startupAction.runMainClass(); return new QuarkusApp(runningApp); } catch (Exception e) { - e.printStackTrace(); - return null; + throw new GradleException("Unable to start Quarkus", e); } } @@ -114,6 +108,7 @@ private static URL toUrl(AppDependency dep) { throw new RuntimeException(e); } } + private static void exitHandler(StartupAction startupAction) throws ReflectiveOperationException { Consumer consumer = i -> { }; @@ -136,45 +131,104 @@ public static AppModel convert(Configuration configuration, Configuration deploy final Set userDeps = new HashSet<>(); final Set deployDeps = new HashSet<>(); - configuration.getResolvedConfiguration() - .getResolvedArtifacts() + // set of dependencies requested by the user (usually the artifact that contains the quarkus app) + Set baseConfigs = configuration.getDependencies() .stream() - .map(QuarkusApp::toDependency).forEach(userDeps::add); + .map(QuarkusApp::toDependency) + .collect(Collectors.toSet()); + assert baseConfigs.size() == 1; // currently we only know how to support the single quarkus app artifact + AppArtifact appArtifact = baseConfigs.iterator().next(); + // resolve all dependencies of the artifacts from above. configuration.getResolvedConfiguration() .getResolvedArtifacts() .stream() - .filter(x -> x.getName().contains("quarkus")) - .map(x -> new DefaultExternalModuleDependency(x.getModuleVersion().getId().getGroup(), x.getName() + ((x.getName().contains("deployment")) ? "" : "-deployment"), x.getModuleVersion().getId().getVersion())) + .map(QuarkusApp::toDependency) + .filter(x -> !appArtifact.equals(x.getArtifact())) // remove base deps, accounted for below + .forEach(userDeps::add); + + // for each user dependency check if it has any associated deployment deps and add those to the deploy config + userDeps.stream() + .map(x -> QuarkusApp.handleMetaInf(appBuilder, x)) + .filter(Objects::nonNull) + .map(x -> new DefaultExternalModuleDependency(x.getGroupId(), x.getArtifactId(), x.getVersion())) .forEach(x -> deploy.getDependencies().add(x)); - Configuration newDeploy = deploy.copy(); - newDeploy.getResolvedConfiguration().getLenientConfiguration().getUnresolvedModuleDependencies().forEach(x -> deploy.getDependencies().remove(unresolvedToExternal((DefaultUnresolvedDependency) x))); + // resolve the deployment deps and their dependencies deploy.getResolvedConfiguration().getResolvedArtifacts().stream() .map(QuarkusApp::toDependency).forEach(deployDeps::add); - AppArtifact appArtifact = toDependency(configuration.getDependencies().stream().findFirst().get()); - Optional path = configuration.getFiles().stream().map(File::getAbsolutePath).filter(x->x.contains(appArtifact.getArtifactId())) + + + // find the path of the base app artifact + Optional path = configuration.getFiles().stream().map(File::getAbsolutePath) + .filter(x->x.contains(appArtifact.getArtifactId())) .filter(x->x.contains(appArtifact.getGroupId().replace(".", File.separator))) .filter(x->x.contains(appArtifact.getVersion())) .findFirst(); appArtifact.setPath(Paths.get(path.orElseThrow(() -> new UnsupportedOperationException("xxx")))); - //deployDeps.removeAll(userDeps); - List userDeps2 = new ArrayList<>(userDeps); - userDeps.addAll(deployDeps); + + // combine user and deploy deps and build app model List allDeps = new ArrayList<>(userDeps); - appBuilder.addRuntimeDeps(new ArrayList<>(userDeps2)) + allDeps.addAll(deployDeps); + appBuilder.addRuntimeDeps(new ArrayList<>(userDeps)) .addFullDeploymentDeps(allDeps) .addDeploymentDeps(new ArrayList<>(deployDeps)) .setAppArtifact(appArtifact); return appBuilder.build(); } - private static Dependency unresolvedToExternal(DefaultUnresolvedDependency dependency) { - return new DefaultExternalModuleDependency(dependency.getSelector().getGroup(), dependency.getSelector().getName(), dependency.getSelector().getVersion()); + /** + * for each dependent artifact read its META-INF looking for quarkus metadata + */ + private static AppArtifact handleMetaInf(AppModel.Builder appBuilder, AppDependency dependency) { + try { + Path path = dependency.getArtifact().getPaths().getSinglePath(); + try (FileSystem artifactFs = ZipUtils.newFileSystem(path)) { + Path metaInfPath = artifactFs.getPath(BootstrapConstants.META_INF); + final Path p = metaInfPath.resolve(BootstrapConstants.DESCRIPTOR_FILE_NAME); + return Files.exists(p) ? processPlatformArtifact(appBuilder, dependency.getArtifact(), p) : null; + } + } catch (IOException e) { + throw new GradleException("couldn't read artifact", e); + } } + + /** + * Search for quarkus metadata and if found augment the AppModel builder. Return any deployment deps. + */ + private static AppArtifact processPlatformArtifact(AppModel.Builder appBuilder, AppArtifact node, Path descriptor) throws IOException { + final Properties rtProps = resolveDescriptor(descriptor); + if (rtProps == null) { + return null; + } + appBuilder.handleExtensionProperties(rtProps, node.toString()); + final String value = rtProps.getProperty(BootstrapConstants.PROP_DEPLOYMENT_ARTIFACT); + if (value == null) { + return null; + } + Artifact deploymentArtifact = toArtifact(value); + if (deploymentArtifact.getVersion() == null || deploymentArtifact.getVersion().isEmpty()) { + deploymentArtifact = deploymentArtifact.setVersion(node.getVersion()); + } + + return new AppArtifact(deploymentArtifact.getGroupId(), deploymentArtifact.getArtifactId(), deploymentArtifact.getClassifier(), "jar", deploymentArtifact.getVersion()); + } + + private static Properties resolveDescriptor(final Path path) throws IOException { + final Properties rtProps; + if (!Files.exists(path)) { + // not a platform artifact + return null; + } + rtProps = new Properties(); + try (BufferedReader reader = Files.newBufferedReader(path)) { + rtProps.load(reader); + } + return rtProps; + } + private static AppArtifact toDependency(Dependency dependency) { AppArtifact artifact = new AppArtifact(dependency.getGroup(), dependency.getName(), null, "jar", dependency.getVersion()); -// artifact.setPaths(QuarkusModelHelper.toPathsCollection(ImmutableList.of(dependency.getFile()))); return artifact; } diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java deleted file mode 100644 index 18f2b8c441d..00000000000 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2020 Dremio - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.dremio.nessie.quarkus.gradle; - -import org.gradle.api.Project; -import org.gradle.api.provider.Property; - -public class QuarkusAppExtension { - private final Property quarkusAppCoordinates; - - public QuarkusAppExtension(Project project) { - quarkusAppCoordinates = project.getObjects().property(String.class); - } - - public Property getQuarkusAppCoordinates() { - return quarkusAppCoordinates; - } -} diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppPlugin.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppPlugin.java index 11d842debd5..93ef2021242 100644 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppPlugin.java +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppPlugin.java @@ -22,49 +22,26 @@ import org.gradle.api.Task; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.DependencySet; +import org.gradle.api.tasks.TaskProvider; public class QuarkusAppPlugin implements Plugin { - private String foo = "Bar"; - - @Override public void apply(Project target) { -// QuarkusAppExtension extension = target.getExtensions().create("quarkusAppRunner", QuarkusAppExtension.class, target); final Configuration config = target.getConfigurations().create("quarkusAppRunnerConfig") .setVisible(false) .setDescription("The config for the Quarkus Runner."); - config.defaultDependencies(new Action() { - public void execute(DependencySet dependencies) { - dependencies.add(target.getDependencies().create("org.projectnessie:nessie-quarkus:0.1-SNAPSHOT")); - } - }); - - final Configuration configDeploy = target.getConfigurations().create("quarkusAppRunnerDeploy") - .setVisible(false) - .setDescription("The config for the Quarkus Runner."); - - configDeploy.defaultDependencies(new Action() { - public void execute(DependencySet dependencies) { - dependencies.add(target.getDependencies().create("io.quarkus:quarkus-bootstrap-core:1.8.1.Final")); - } - }); - target.getTasks().register("quarkus-start", StartTask.class, new Action() { @Override public void execute(StartTask task) { - task.setConfig(config, configDeploy); + task.setConfig(config); } }); - target.getTasks().register("quarkus-stop", new Action() { - @Override - public void execute(Task task) { - } - }); + target.getTasks().register("quarkus-stop", StopTask.class); } } diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java index 60589975805..bddaf545f5f 100644 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java @@ -15,68 +15,52 @@ */ package com.dremio.nessie.quarkus.gradle; -import io.quarkus.bootstrap.model.AppArtifactCoords; -import io.quarkus.bootstrap.model.AppModel; -import io.quarkus.bootstrap.resolver.AppModelResolverException; -import io.quarkus.bootstrap.resolver.model.QuarkusModel; -import io.quarkus.bootstrap.utils.BuildToolHelper; - import java.io.File; -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; -import java.nio.file.Paths; -import org.apache.maven.artifact.Artifact; import org.gradle.api.DefaultTask; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; -import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.FileCollection; -import org.gradle.api.provider.Property; -import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.TaskAction; public class StartTask extends DefaultTask { private Configuration dataFiles; - private Configuration configDeploy; public StartTask() { } + @TaskAction public void start() { getLogger().info("Starting Quarkus application."); final URL[] urls = getDataFiles().getFiles().stream().map(StartTask::toURL).toArray(URL[]::new); - // Use MavenProject classloader as parent classloader as Maven classloader hierarchy is not linear final URLClassLoader mirrorCL = new URLClassLoader(urls, this.getClass().getClassLoader()); - final AutoCloseable quarkusApp; // = QuarkusApp.newApplication(dataFiles, configDeploy, getProject()); + final AutoCloseable quarkusApp; try { Class clazz = mirrorCL.loadClass(QuarkusApp.class.getName()); - Method newApplicationMethod = clazz.getMethod("newApplication", Configuration.class, Configuration.class, Project.class); - quarkusApp = (AutoCloseable) newApplicationMethod.invoke(null, dataFiles, configDeploy, getProject()); + Method newApplicationMethod = clazz.getMethod("newApplication", Configuration.class, Project.class); + quarkusApp = (AutoCloseable) newApplicationMethod.invoke(null, dataFiles, getProject()); } catch (ReflectiveOperationException e) { - e.printStackTrace(); + throw new RuntimeException(e); } getLogger().info("Quarkus application started."); - -// // Make sure classloader is closed too when the app is stopped -// setApplicationHandle(() -> { -// try { -// quarkusApp.close(); -// } finally { -// mirrorCL.close(); -// } -// }); + setApplicationHandle(() -> { + try { + quarkusApp.close(); + } finally { + mirrorCL.close(); + } + }); } @InputFiles @@ -84,19 +68,19 @@ private FileCollection getDataFiles() { return dataFiles; } - public void setConfig(Configuration files, Configuration configDeploy) { + public void setConfig(Configuration files) { this.dataFiles = files; - this.configDeploy = configDeploy; } -// protected void setApplicationHandle(AutoCloseable application) { -// final String key = getContextKey(); -// final Object previous = project.getContextValue(key); -// if (previous != null) { -// getLogger().warn(String.format("Found a previous application for execution id %s.", getExecutionId())); -// } -// project.setContextValue(key, application); -// } + private void setApplicationHandle(AutoCloseable application) { + // update stop task with this task's closeable + + StopTask task = (StopTask) getProject().getTasks().getByName("quarkus-stop"); + if (task.getApplication() != null) { + getLogger().warn("StopTask application is not empty!"); + } + task.setQuarkusApplication(application); + } private static URL toURL(File artifact) { try { diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java new file mode 100644 index 00000000000..754b3ba5c85 --- /dev/null +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2020 Dremio + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.dremio.nessie.quarkus.gradle; + +import org.gradle.api.DefaultTask; +import org.gradle.api.tasks.TaskAction; + +public class StopTask extends DefaultTask { + private AutoCloseable application; + + public StopTask() { + + } + + @TaskAction + public void start() { + + if (application == null) { + getLogger().warn("No application found."); + } + + try { + application.close(); + getLogger().info("Quarkus application stopped."); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + application = null; + } + } + + public AutoCloseable getApplication() { + return application; + } + + public void setQuarkusApplication(AutoCloseable quarkusApplication) { + application = quarkusApplication; + } +} diff --git a/tools/apprunner-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.projectnessie.nessie-apprunner b/tools/apprunner-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.projectnessie.nessie-apprunner-gradle-plugin similarity index 100% rename from tools/apprunner-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.projectnessie.nessie-apprunner rename to tools/apprunner-gradle-plugin/src/main/resources/META-INF/gradle-plugins/org.projectnessie.nessie-apprunner-gradle-plugin diff --git a/tools/pom.xml b/tools/pom.xml index bf133e1e032..a284970f39d 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -33,4 +33,33 @@ apprunner-maven-plugin + + + + + ru.yaal.maven + write-text-files-maven-plugin + + UTF-8 + + + apprunner-gradle-plugin/version.txt + + ${project.version} + + + + + + + write-text-files + prepare-package + + write-text-files + + + + + + From 0b94a9cd623b60a14e8f402d7fc7c2ca3d632138 Mon Sep 17 00:00:00 2001 From: Ryan Murray Date: Mon, 12 Oct 2020 15:03:03 +0100 Subject: [PATCH 03/11] use static locks and variables to ensure only one quarkus runs at a time. * add simple reference counting to running instances * fix gradle build --- .github/workflows/main.yml | 3 ++ .github/workflows/pull-request.yml | 3 ++ .../nessie/quarkus/gradle/StartTask.java | 52 +++++++++++++------ .../nessie/quarkus/gradle/StopTask.java | 14 ++++- tools/apprunner-maven-plugin/pom.xml | 21 ++++++++ 5 files changed, 75 insertions(+), 18 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2475cc2123e..0a9361a36cf 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -75,6 +75,9 @@ jobs: path: ~/.gradle/caches key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} restore-keys: ${{ runner.os }}-gradle + - name: Populate version from maven + run: mvn -B prepare-package --file ../pom.xml -pl :nessie-tools + working-directory: ${{env.working-directory}} - name: Build with Gradle run: ./gradlew build working-directory: ${{env.working-directory}} diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index e7c23a42b81..620ee055a26 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -96,6 +96,9 @@ jobs: path: ~/.gradle/caches key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} restore-keys: ${{ runner.os }}-gradle + - name: Populate version from maven + run: mvn -B prepare-package --file ../pom.xml -pl :nessie-tools + working-directory: ${{env.working-directory}} - name: Build with Gradle run: ./gradlew build working-directory: ${{env.working-directory}} diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java index bddaf545f5f..c1d4a7f47ce 100644 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java @@ -29,6 +29,7 @@ import org.gradle.api.tasks.TaskAction; public class StartTask extends DefaultTask { + private static final Object lock = new Object(); private Configuration dataFiles; public StartTask() { @@ -40,27 +41,34 @@ public StartTask() { public void start() { getLogger().info("Starting Quarkus application."); - final URL[] urls = getDataFiles().getFiles().stream().map(StartTask::toURL).toArray(URL[]::new); - - final URLClassLoader mirrorCL = new URLClassLoader(urls, this.getClass().getClassLoader()); + synchronized (lock) { + if (existingApplication()) { + getLogger().info("Quarkus application already started, incrementing counter."); + incrementCount(); + return; + } + final URL[] urls = getDataFiles().getFiles().stream().map(StartTask::toURL).toArray(URL[]::new); - final AutoCloseable quarkusApp; - try { - Class clazz = mirrorCL.loadClass(QuarkusApp.class.getName()); - Method newApplicationMethod = clazz.getMethod("newApplication", Configuration.class, Project.class); - quarkusApp = (AutoCloseable) newApplicationMethod.invoke(null, dataFiles, getProject()); - } catch (ReflectiveOperationException e) { - throw new RuntimeException(e); - } + final URLClassLoader mirrorCL = new URLClassLoader(urls, this.getClass().getClassLoader()); - getLogger().info("Quarkus application started."); - setApplicationHandle(() -> { + final AutoCloseable quarkusApp; try { - quarkusApp.close(); - } finally { - mirrorCL.close(); + Class clazz = mirrorCL.loadClass(QuarkusApp.class.getName()); + Method newApplicationMethod = clazz.getMethod("newApplication", Configuration.class, Project.class); + quarkusApp = (AutoCloseable) newApplicationMethod.invoke(null, dataFiles, getProject()); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); } - }); + + getLogger().info("Quarkus application started."); + setApplicationHandle(() -> { + try { + quarkusApp.close(); + } finally { + mirrorCL.close(); + } + }); + } } @InputFiles @@ -72,6 +80,16 @@ public void setConfig(Configuration files) { this.dataFiles = files; } + private boolean existingApplication() { + StopTask task = (StopTask) getProject().getTasks().getByName("quarkus-stop"); + return task.getApplication() != null; + } + + private void incrementCount() { + StopTask task = (StopTask) getProject().getTasks().getByName("quarkus-stop"); + task.increment(); + } + private void setApplicationHandle(AutoCloseable application) { // update stop task with this task's closeable diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java index 754b3ba5c85..3ac0e5f39bc 100644 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java @@ -19,7 +19,8 @@ import org.gradle.api.tasks.TaskAction; public class StopTask extends DefaultTask { - private AutoCloseable application; + private static AutoCloseable application; + private int applicationCount = 0; public StopTask() { @@ -32,6 +33,12 @@ public void start() { getLogger().warn("No application found."); } + if (applicationCount > 1) { + getLogger().warn("Application still running, decrement count."); + applicationCount--; + return; + } + try { application.close(); getLogger().info("Quarkus application stopped."); @@ -48,5 +55,10 @@ public AutoCloseable getApplication() { public void setQuarkusApplication(AutoCloseable quarkusApplication) { application = quarkusApplication; + increment(); + } + + public void increment() { + applicationCount++; } } diff --git a/tools/apprunner-maven-plugin/pom.xml b/tools/apprunner-maven-plugin/pom.xml index a7b0bf03639..d6fb8b0c56e 100644 --- a/tools/apprunner-maven-plugin/pom.xml +++ b/tools/apprunner-maven-plugin/pom.xml @@ -62,6 +62,27 @@ + + ru.yaal.maven + write-text-files-maven-plugin + + UTF-8 + + + apprunner-gradle-plugin/version.txt + + ${project.version} + + + + + + + write-text-files + none + + + org.apache.maven.plugins maven-plugin-plugin From 1b817458c0acf0273c17445054719908d7c3eaa4 Mon Sep 17 00:00:00 2001 From: Ryan Murray Date: Mon, 12 Oct 2020 15:17:40 +0100 Subject: [PATCH 04/11] fix static and use java8 for CI build --- .github/workflows/main.yml | 4 ++-- .github/workflows/pull-request.yml | 4 ++-- .../main/java/com/dremio/nessie/quarkus/gradle/StopTask.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 0a9361a36cf..47cb95c385d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -65,10 +65,10 @@ jobs: working-directory: ./tools/apprunner-gradle-plugin steps: - uses: actions/checkout@v2 - - name: Set up JDK 11 + - name: Set up JDK 8 uses: actions/setup-java@v1 with: - java-version: 11 + java-version: 8 - name: Cache Gradle packages uses: actions/cache@v2 with: diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 620ee055a26..e77f3b2cd33 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -86,10 +86,10 @@ jobs: working-directory: ./tools/apprunner-gradle-plugin steps: - uses: actions/checkout@v2 - - name: Set up JDK 11 + - name: Set up JDK 8 uses: actions/setup-java@v1 with: - java-version: 11 + java-version: 8 - name: Cache Gradle packages uses: actions/cache@v2 with: diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java index 3ac0e5f39bc..0e03de36e91 100644 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java @@ -20,7 +20,7 @@ public class StopTask extends DefaultTask { private static AutoCloseable application; - private int applicationCount = 0; + private static int applicationCount = 0; public StopTask() { From 7a4c9dcc779c929480d587e2385a1bdcf017a343 Mon Sep 17 00:00:00 2001 From: Ryan Murray Date: Mon, 12 Oct 2020 16:08:53 +0100 Subject: [PATCH 05/11] better logging --- .../main/java/com/dremio/nessie/quarkus/gradle/StopTask.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java index 0e03de36e91..348207809e3 100644 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java @@ -34,7 +34,7 @@ public void start() { } if (applicationCount > 1) { - getLogger().warn("Application still running, decrement count."); + getLogger().warn(String.format("Application still running, count at: %d", applicationCount)); applicationCount--; return; } @@ -46,6 +46,7 @@ public void start() { throw new RuntimeException(e); } finally { application = null; + applicationCount = 0; } } @@ -59,6 +60,7 @@ public void setQuarkusApplication(AutoCloseable quarkusApplication) { } public void increment() { + getLogger().warn(String.format("Application count at: %d", applicationCount)); applicationCount++; } } From 9192d3cf162623adfc2888b2ff120075abf68fbe Mon Sep 17 00:00:00 2001 From: Ryan Murray Date: Thu, 15 Oct 2020 15:23:27 +0100 Subject: [PATCH 06/11] code review followup --- .github/workflows/main.yml | 8 +----- .github/workflows/pull-request.yml | 2 +- .gitignore | 11 +++----- pom.xml | 5 ---- .../nessie/quarkus/gradle/QuarkusApp.java | 3 +- tools/pom.xml | 28 ------------------- 6 files changed, 8 insertions(+), 49 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 47cb95c385d..c945ce60ce0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -76,17 +76,11 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} restore-keys: ${{ runner.os }}-gradle - name: Populate version from maven - run: mvn -B prepare-package --file ../pom.xml -pl :nessie-tools + run: mvn help:evaluate -Dexpression=project.version -q -DforceStdout --file ../pom.xml > version.txt working-directory: ${{env.working-directory}} - name: Build with Gradle run: ./gradlew build working-directory: ${{env.working-directory}} - - name: Setup publish - run: | - echo '${{ secrets.GRADLE_PUBLISH_KEY }}' >> ~/.gradle/gradle.properties - echo '${{ secrets.GRADLE_PUBLISH_SECRET }}' >> ~/.gradle/gradle.properties - - name: Deploy Plugin snapshot - run: ./gradlew publishPlugins python: name: Python diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index e77f3b2cd33..9c354bf1e7d 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -97,7 +97,7 @@ jobs: key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} restore-keys: ${{ runner.os }}-gradle - name: Populate version from maven - run: mvn -B prepare-package --file ../pom.xml -pl :nessie-tools + run: mvn help:evaluate -Dexpression=project.version -q -DforceStdout --file ../pom.xml > version.txt working-directory: ${{env.working-directory}} - name: Build with Gradle run: ./gradlew build diff --git a/.gitignore b/.gitignore index 4fa107e2b07..5d17ec28880 100644 --- a/.gitignore +++ b/.gitignore @@ -50,10 +50,7 @@ node_modules/ build # gradle - -tools/apprunner-gradle-plugin/.gradle -tools/apprunner-gradle-plugin/build -tools/apprunner-gradle-plugin/gradle/ -tools/apprunner-gradle-plugin/out -tools/apprunner-gradle-plugin/gradle/wrapper/gradle-wrapper.jar -tools/apprunner-gradle-plugin/version.txt +gradle/ +out +gradle/wrapper/gradle-wrapper.jar +version.txt diff --git a/pom.xml b/pom.xml index 3f2b41b4f64..eee1fd248e4 100644 --- a/pom.xml +++ b/pom.xml @@ -632,11 +632,6 @@ quarkus-maven-plugin ${quarkus.version} - - ru.yaal.maven - write-text-files-maven-plugin - 1.1 - diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java index 5476ffebf60..81dd8421b24 100644 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java @@ -25,6 +25,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; +import java.nio.charset.StandardCharsets; import java.nio.file.FileSystem; import java.nio.file.Files; import java.nio.file.Path; @@ -220,7 +221,7 @@ private static Properties resolveDescriptor(final Path path) throws IOException return null; } rtProps = new Properties(); - try (BufferedReader reader = Files.newBufferedReader(path)) { + try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) { rtProps.load(reader); } return rtProps; diff --git a/tools/pom.xml b/tools/pom.xml index a284970f39d..1635a0ebf0c 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -34,32 +34,4 @@ apprunner-maven-plugin - - - - ru.yaal.maven - write-text-files-maven-plugin - - UTF-8 - - - apprunner-gradle-plugin/version.txt - - ${project.version} - - - - - - - write-text-files - prepare-package - - write-text-files - - - - - - From cf8253630b466fb6cbd05d5a87afd3c91034353d Mon Sep 17 00:00:00 2001 From: Ryan Murray Date: Thu, 15 Oct 2020 17:03:08 +0100 Subject: [PATCH 07/11] fix pom --- tools/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/pom.xml b/tools/pom.xml index 1635a0ebf0c..bf133e1e032 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -33,5 +33,4 @@ apprunner-maven-plugin - From 10fef7c9cd0be01aaf4e5e725d66505f09b0c527 Mon Sep 17 00:00:00 2001 From: Ryan Murray Date: Mon, 19 Oct 2020 11:15:07 +0100 Subject: [PATCH 08/11] cleanup --- tools/apprunner-maven-plugin/pom.xml | 29 ---------------------------- 1 file changed, 29 deletions(-) diff --git a/tools/apprunner-maven-plugin/pom.xml b/tools/apprunner-maven-plugin/pom.xml index d6fb8b0c56e..6f9bd155a56 100644 --- a/tools/apprunner-maven-plugin/pom.xml +++ b/tools/apprunner-maven-plugin/pom.xml @@ -60,33 +60,4 @@ - - - - ru.yaal.maven - write-text-files-maven-plugin - - UTF-8 - - - apprunner-gradle-plugin/version.txt - - ${project.version} - - - - - - - write-text-files - none - - - - - org.apache.maven.plugins - maven-plugin-plugin - - - From cba8625355aa38f7b431e211756f7f980d770abd Mon Sep 17 00:00:00 2001 From: Laurent Goujon Date: Mon, 12 Oct 2020 22:00:09 -0700 Subject: [PATCH 09/11] working isolated quarkus apps --- tools/apprunner-gradle-plugin/build.gradle | 6 +- .../nessie/quarkus/gradle/QuarkusApp.java | 63 +++++-------------- .../quarkus/gradle/QuarkusAppExtension.java | 31 +++++++++ .../quarkus/gradle/QuarkusAppPlugin.java | 2 + .../nessie/quarkus/gradle/StartTask.java | 37 ++++++----- .../nessie/quarkus/gradle/StopTask.java | 15 +---- ...lipse.microprofile.config.spi.ConfigSource | 1 + tools/apprunner-maven-plugin/pom.xml | 1 - .../quarkus/maven/MojoConfigSource.java | 3 +- .../nessie/quarkus/maven/QuarkusApp.java | 30 +++++++-- 10 files changed, 103 insertions(+), 86 deletions(-) create mode 100644 tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java create mode 100644 tools/apprunner-gradle-plugin/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource diff --git a/tools/apprunner-gradle-plugin/build.gradle b/tools/apprunner-gradle-plugin/build.gradle index fa188a0cc95..6c9cc09e31b 100644 --- a/tools/apprunner-gradle-plugin/build.gradle +++ b/tools/apprunner-gradle-plugin/build.gradle @@ -31,7 +31,11 @@ repositories { } dependencies { - compile "io.quarkus:quarkus-bootstrap-core:1.8.1.Final" + implementation platform('io.quarkus:quarkus-bom:1.9.0.Final') + + compile "io.quarkus:quarkus-bootstrap-core" + compile "org.projectnessie:nessie-apprunner-maven-plugin:$version" + compile "org.eclipse.microprofile.config:microprofile-config-api" } pluginBundle { diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java index 81dd8421b24..687e76f7758 100644 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusApp.java @@ -21,7 +21,6 @@ import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; @@ -31,16 +30,15 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.Properties; import java.util.Set; -import java.util.function.Consumer; import java.util.stream.Collectors; +import org.apache.maven.plugin.MojoExecutionException; import org.eclipse.aether.artifact.Artifact; import org.gradle.api.GradleException; import org.gradle.api.Project; @@ -53,11 +51,7 @@ import com.google.common.collect.ImmutableList; import io.quarkus.bootstrap.BootstrapConstants; -import io.quarkus.bootstrap.app.CuratedApplication; -import io.quarkus.bootstrap.app.QuarkusBootstrap; -import io.quarkus.bootstrap.app.QuarkusBootstrap.Mode; import io.quarkus.bootstrap.app.RunningQuarkusApplication; -import io.quarkus.bootstrap.app.StartupAction; import io.quarkus.bootstrap.model.AppArtifact; import io.quarkus.bootstrap.model.AppDependency; import io.quarkus.bootstrap.model.AppModel; @@ -68,36 +62,24 @@ /** * Start and Stop quarkus. */ -public class QuarkusApp implements AutoCloseable { - private final RunningQuarkusApplication runningApp; +public class QuarkusApp extends com.dremio.nessie.quarkus.maven.QuarkusApp { - private QuarkusApp(RunningQuarkusApplication runningApp) { - this.runningApp = runningApp; + protected QuarkusApp(RunningQuarkusApplication runningApp) { + super(runningApp); } - public static QuarkusApp newApplication(Configuration configuration, Project project) { + public static AutoCloseable newApplication(Configuration configuration, Project project, Properties props) { Configuration deploy = project.getConfigurations().create("quarkusAppDeploy"); final AppModel appModel; appModel = convert(configuration, deploy); - URL[] urls = appModel.getFullDeploymentDeps().stream().map(QuarkusApp::toUrl).toArray(URL[]::new); - ClassLoader cl = new URLClassLoader(urls, QuarkusApp.class.getClassLoader()); - final QuarkusBootstrap bootstrap = QuarkusBootstrap.builder() - .setAppArtifact(appModel.getAppArtifact()) - .setBaseClassLoader(cl).setExistingModel(appModel) - .setProjectRoot(project.getProjectDir().toPath()) - .setTargetDirectory(Paths.get(project.getBuildDir().getPath())).setIsolateDeployment(true) - .setMode(Mode.TEST).build(); - + ClassLoader cl = new URLClassLoader(urls, com.dremio.nessie.quarkus.maven.QuarkusApp.class.getClassLoader()); try { - final CuratedApplication app = bootstrap.bootstrap(); - StartupAction startupAction = app.createAugmentor().createInitialRuntimeApplication(); - exitHandler(startupAction); - RunningQuarkusApplication runningApp = startupAction.runMainClass(); - return new QuarkusApp(runningApp); - } catch (Exception e) { + return com.dremio.nessie.quarkus.maven.QuarkusApp.newApplication(appModel, project.getProjectDir().toPath(), + Paths.get(project.getBuildDir().getPath()), props, cl); + } catch (MojoExecutionException e) { throw new GradleException("Unable to start Quarkus", e); } } @@ -110,22 +92,6 @@ private static URL toUrl(AppDependency dep) { } } - private static void exitHandler(StartupAction startupAction) throws ReflectiveOperationException { - Consumer consumer = i -> { - }; - Method exitHandler = Arrays - .stream(startupAction.getClassLoader() - .loadClass("io.quarkus.runtime.ApplicationLifecycleManager").getMethods()) - .filter(x -> x.getName().equals("setDefaultExitCodeHandler")).findFirst() - .orElseThrow(NoSuchMethodException::new); - exitHandler.invoke(null, consumer); - } - - @Override - public void close() throws Exception { - runningApp.close(); - } - public static AppModel convert(Configuration configuration, Configuration deploy) { AppModel.Builder appBuilder = new AppModel.Builder(); @@ -146,7 +112,6 @@ public static AppModel convert(Configuration configuration, Configuration deploy .map(QuarkusApp::toDependency) .filter(x -> !appArtifact.equals(x.getArtifact())) // remove base deps, accounted for below .forEach(userDeps::add); - // for each user dependency check if it has any associated deployment deps and add those to the deploy config userDeps.stream() .map(x -> QuarkusApp.handleMetaInf(appBuilder, x)) @@ -165,7 +130,8 @@ public static AppModel convert(Configuration configuration, Configuration deploy .filter(x->x.contains(appArtifact.getGroupId().replace(".", File.separator))) .filter(x->x.contains(appArtifact.getVersion())) .findFirst(); - appArtifact.setPath(Paths.get(path.orElseThrow(() -> new UnsupportedOperationException("xxx")))); + appArtifact.setPath(Paths.get(path.orElseThrow(() -> + new UnsupportedOperationException(String.format("Unknown path for app artifact %s", appArtifact))))); // combine user and deploy deps and build app model List allDeps = new ArrayList<>(userDeps); @@ -196,7 +162,8 @@ private static AppArtifact handleMetaInf(AppModel.Builder appBuilder, AppDepende /** * Search for quarkus metadata and if found augment the AppModel builder. Return any deployment deps. */ - private static AppArtifact processPlatformArtifact(AppModel.Builder appBuilder, AppArtifact node, Path descriptor) throws IOException { + private static AppArtifact processPlatformArtifact(AppModel.Builder appBuilder, AppArtifact node, Path descriptor) + throws IOException { final Properties rtProps = resolveDescriptor(descriptor); if (rtProps == null) { return null; @@ -211,7 +178,8 @@ private static AppArtifact processPlatformArtifact(AppModel.Builder appBuilder, deploymentArtifact = deploymentArtifact.setVersion(node.getVersion()); } - return new AppArtifact(deploymentArtifact.getGroupId(), deploymentArtifact.getArtifactId(), deploymentArtifact.getClassifier(), "jar", deploymentArtifact.getVersion()); + return new AppArtifact(deploymentArtifact.getGroupId(), deploymentArtifact.getArtifactId(), + deploymentArtifact.getClassifier(), "jar", deploymentArtifact.getVersion()); } private static Properties resolveDescriptor(final Path path) throws IOException { @@ -240,4 +208,5 @@ private static AppDependency toDependency(ResolvedArtifact dependency) { artifact.setPaths(QuarkusModelHelper.toPathsCollection(ImmutableList.of(dependency.getFile()))); return new AppDependency(artifact, "runtime"); } + } diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java new file mode 100644 index 00000000000..ef415281bd6 --- /dev/null +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2020 Dremio + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.dremio.nessie.quarkus.gradle; + +import org.gradle.api.Project; +import org.gradle.api.provider.MapProperty; + +public class QuarkusAppExtension { + private MapProperty props; + public QuarkusAppExtension(Project project) { + props = project.getObjects().mapProperty(String.class, Object.class); + } + + public MapProperty getProps() { + return props; + } +} diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppPlugin.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppPlugin.java index 93ef2021242..9715d9d6273 100644 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppPlugin.java +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppPlugin.java @@ -29,6 +29,7 @@ public class QuarkusAppPlugin implements Plugin { @Override public void apply(Project target) { + QuarkusAppExtension extension = target.getExtensions().create("quarkusAppRunnerProperties", QuarkusAppExtension.class, target); final Configuration config = target.getConfigurations().create("quarkusAppRunnerConfig") .setVisible(false) @@ -38,6 +39,7 @@ public void apply(Project target) { @Override public void execute(StartTask task) { task.setConfig(config); + task.setProps(extension.getProps().get()); } }); diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java index c1d4a7f47ce..5bb8b832cd4 100644 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StartTask.java @@ -20,6 +20,8 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; +import java.util.Map; +import java.util.Properties; import org.gradle.api.DefaultTask; import org.gradle.api.Project; @@ -27,10 +29,12 @@ import org.gradle.api.file.FileCollection; import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.TaskAction; +import org.gradle.api.tasks.testing.Test; public class StartTask extends DefaultTask { private static final Object lock = new Object(); private Configuration dataFiles; + private Map props; public StartTask() { @@ -42,24 +46,29 @@ public void start() { getLogger().info("Starting Quarkus application."); synchronized (lock) { - if (existingApplication()) { - getLogger().info("Quarkus application already started, incrementing counter."); - incrementCount(); - return; - } final URL[] urls = getDataFiles().getFiles().stream().map(StartTask::toURL).toArray(URL[]::new); final URLClassLoader mirrorCL = new URLClassLoader(urls, this.getClass().getClassLoader()); + Properties properties = new Properties(); + properties.putAll(props); + final AutoCloseable quarkusApp; try { Class clazz = mirrorCL.loadClass(QuarkusApp.class.getName()); - Method newApplicationMethod = clazz.getMethod("newApplication", Configuration.class, Project.class); - quarkusApp = (AutoCloseable) newApplicationMethod.invoke(null, dataFiles, getProject()); + Method newApplicationMethod = clazz.getMethod("newApplication", Configuration.class, Project.class, Properties.class); + quarkusApp = (AutoCloseable) newApplicationMethod.invoke(null, dataFiles, getProject(), properties); } catch (ReflectiveOperationException e) { throw new RuntimeException(e); } + for (String key: props.keySet()) { + String value = System.getProperty(key); + if (value != null) { + ((Test) getProject().getTasks().getByName("test")).systemProperty(key, value); + } + } + getLogger().info("Quarkus application started."); setApplicationHandle(() -> { try { @@ -80,16 +89,6 @@ public void setConfig(Configuration files) { this.dataFiles = files; } - private boolean existingApplication() { - StopTask task = (StopTask) getProject().getTasks().getByName("quarkus-stop"); - return task.getApplication() != null; - } - - private void incrementCount() { - StopTask task = (StopTask) getProject().getTasks().getByName("quarkus-stop"); - task.increment(); - } - private void setApplicationHandle(AutoCloseable application) { // update stop task with this task's closeable @@ -107,4 +106,8 @@ private static URL toURL(File artifact) { throw new IllegalArgumentException(e); } } + + public void setProps(Map props) { + this.props = props; + } } diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java index 348207809e3..f3d3c1f28a0 100644 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/StopTask.java @@ -19,8 +19,7 @@ import org.gradle.api.tasks.TaskAction; public class StopTask extends DefaultTask { - private static AutoCloseable application; - private static int applicationCount = 0; + private AutoCloseable application; public StopTask() { @@ -33,12 +32,6 @@ public void start() { getLogger().warn("No application found."); } - if (applicationCount > 1) { - getLogger().warn(String.format("Application still running, count at: %d", applicationCount)); - applicationCount--; - return; - } - try { application.close(); getLogger().info("Quarkus application stopped."); @@ -46,7 +39,6 @@ public void start() { throw new RuntimeException(e); } finally { application = null; - applicationCount = 0; } } @@ -56,11 +48,6 @@ public AutoCloseable getApplication() { public void setQuarkusApplication(AutoCloseable quarkusApplication) { application = quarkusApplication; - increment(); } - public void increment() { - getLogger().warn(String.format("Application count at: %d", applicationCount)); - applicationCount++; - } } diff --git a/tools/apprunner-gradle-plugin/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource b/tools/apprunner-gradle-plugin/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource new file mode 100644 index 00000000000..11ae2f4a571 --- /dev/null +++ b/tools/apprunner-gradle-plugin/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource @@ -0,0 +1 @@ +com.dremio.nessie.quarkus.maven.MojoConfigSource diff --git a/tools/apprunner-maven-plugin/pom.xml b/tools/apprunner-maven-plugin/pom.xml index 6f9bd155a56..2b5dac81294 100644 --- a/tools/apprunner-maven-plugin/pom.xml +++ b/tools/apprunner-maven-plugin/pom.xml @@ -59,5 +59,4 @@ provided - diff --git a/tools/apprunner-maven-plugin/src/main/java/com/dremio/nessie/quarkus/maven/MojoConfigSource.java b/tools/apprunner-maven-plugin/src/main/java/com/dremio/nessie/quarkus/maven/MojoConfigSource.java index 120da0b26be..8a1a75a1ae4 100644 --- a/tools/apprunner-maven-plugin/src/main/java/com/dremio/nessie/quarkus/maven/MojoConfigSource.java +++ b/tools/apprunner-maven-plugin/src/main/java/com/dremio/nessie/quarkus/maven/MojoConfigSource.java @@ -40,7 +40,8 @@ public Map getProperties() { @Override public String getValue(String propertyName) { - return properties.getProperty(propertyName); + Object obj = properties.get(propertyName); + return obj == null ? null : obj.toString(); } @Override diff --git a/tools/apprunner-maven-plugin/src/main/java/com/dremio/nessie/quarkus/maven/QuarkusApp.java b/tools/apprunner-maven-plugin/src/main/java/com/dremio/nessie/quarkus/maven/QuarkusApp.java index f6b043d47ac..a8489f51d80 100644 --- a/tools/apprunner-maven-plugin/src/main/java/com/dremio/nessie/quarkus/maven/QuarkusApp.java +++ b/tools/apprunner-maven-plugin/src/main/java/com/dremio/nessie/quarkus/maven/QuarkusApp.java @@ -49,7 +49,7 @@ public class QuarkusApp implements AutoCloseable { private static final String MOJO_CONFIG_SOURCE_CLASSNAME = "com.dremio.nessie.quarkus.maven.MojoConfigSource"; private final RunningQuarkusApplication runningApp; - private QuarkusApp(RunningQuarkusApplication runningApp) { + protected QuarkusApp(RunningQuarkusApplication runningApp) { this.runningApp = runningApp; } @@ -89,7 +89,7 @@ public static QuarkusApp newApplication(MavenProject project, RepositorySystem r "Failed to resolve application model " + appArtifact + " dependencies", e); } - return newApplication(appModel, appArtifact, project.getBasedir().toPath(), Paths.get(project.getBuild().getDirectory()), + return newApplication(appModel, project.getBasedir().toPath(), Paths.get(project.getBuild().getDirectory()), applicationProperties); } @@ -101,21 +101,41 @@ public static QuarkusApp newApplication(MavenProject project, RepositorySystem r * classloader. * * @param appModel the application model - * @param appArtifact the quarkus application artifact id * @param projectRoot the current project directory * @param targetDirectory the target directory * @param applicationProperties the extra application properties * @return a quarkus app instance * @throws MojoExecutionException if an error occurs during execution */ - public static QuarkusApp newApplication(AppModel appModel, AppArtifact appArtifact, + public static QuarkusApp newApplication(AppModel appModel, Path projectRoot, Path targetDirectory, Properties applicationProperties) throws MojoExecutionException { + return newApplication(appModel, projectRoot, targetDirectory, applicationProperties, QuarkusApp.class.getClassLoader()); + } + + /** + * Instantiate and start a quarkus application. + * + *

Instantiates and start a quarkus application using Quarkus bootstrap + * framework. Only one application can be started at a time in the same + * classloader. + * + * @param appModel the application model + * @param projectRoot the current project directory + * @param targetDirectory the target directory + * @param applicationProperties the extra application properties + * @param classLoader the classloader to use when starting the application + * @return a quarkus app instance + * @throws MojoExecutionException if an error occurs during execution + */ + public static QuarkusApp newApplication(AppModel appModel, + Path projectRoot, Path targetDirectory, Properties applicationProperties, ClassLoader classLoader) + throws MojoExecutionException { final AdditionalDependency mojoConfigSourceDependency = findMojoConfigSourceDependency(); final QuarkusBootstrap bootstrap = QuarkusBootstrap.builder() .setAppArtifact(appModel.getAppArtifact()) - .setBaseClassLoader(QuarkusApp.class.getClassLoader()).setExistingModel(appModel) + .setBaseClassLoader(classLoader).setExistingModel(appModel) .setProjectRoot(projectRoot).setTargetDirectory(targetDirectory).setIsolateDeployment(true) .setMode(Mode.TEST).addAdditionalApplicationArchive(mojoConfigSourceDependency).build(); From a90c20c93f566bb8a8d105d5be5b4b4e0e4453ed Mon Sep 17 00:00:00 2001 From: Ryan Murray Date: Wed, 21 Oct 2020 14:48:32 +0100 Subject: [PATCH 10/11] fix build --- .github/workflows/pull-request.yml | 29 ++++++---------------- tools/apprunner-gradle-plugin/build.gradle | 5 ++++ 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 9c354bf1e7d..cce8bb50445 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -63,6 +63,12 @@ jobs: key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- + - name: Cache Gradle packages + uses: actions/cache@v2 + with: + path: ~/.gradle/caches + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} + restore-keys: ${{ runner.os }}-gradle - name: Build with Maven run: mvn -B install javadoc:javadoc-no-fork --file pom.xml -Pcode-coverage,jdk8-tests env: @@ -77,31 +83,12 @@ jobs: - uses: codecov/codecov-action@v1 with: flags: java - - gradle: - name: Java/Gradle - runs-on: ubuntu-latest - needs: java - env: - working-directory: ./tools/apprunner-gradle-plugin - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 8 - uses: actions/setup-java@v1 - with: - java-version: 8 - - name: Cache Gradle packages - uses: actions/cache@v2 - with: - path: ~/.gradle/caches - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle') }} - restore-keys: ${{ runner.os }}-gradle - name: Populate version from maven run: mvn help:evaluate -Dexpression=project.version -q -DforceStdout --file ../pom.xml > version.txt - working-directory: ${{env.working-directory}} + working-directory: ./tools/apprunner-gradle-plugin - name: Build with Gradle run: ./gradlew build - working-directory: ${{env.working-directory}} + working-directory: ./tools/apprunner-gradle-plugin python: name: Python diff --git a/tools/apprunner-gradle-plugin/build.gradle b/tools/apprunner-gradle-plugin/build.gradle index 6c9cc09e31b..78fd3dc6eab 100644 --- a/tools/apprunner-gradle-plugin/build.gradle +++ b/tools/apprunner-gradle-plugin/build.gradle @@ -30,6 +30,11 @@ repositories { mavenCentral() } +compileJava { + sourceCompatibility = '1.8' + targetCompatibility = '1.8' +} + dependencies { implementation platform('io.quarkus:quarkus-bom:1.9.0.Final') From e5955270874538e7885daabf98c5f0128a8278a5 Mon Sep 17 00:00:00 2001 From: Ryan Murray Date: Thu, 22 Oct 2020 01:19:21 +0100 Subject: [PATCH 11/11] fix `final` --- .../com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java index ef415281bd6..0ec5c1bf03c 100644 --- a/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java +++ b/tools/apprunner-gradle-plugin/src/main/java/com/dremio/nessie/quarkus/gradle/QuarkusAppExtension.java @@ -20,7 +20,7 @@ import org.gradle.api.provider.MapProperty; public class QuarkusAppExtension { - private MapProperty props; + private final MapProperty props; public QuarkusAppExtension(Project project) { props = project.getObjects().mapProperty(String.class, Object.class); }