diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..52e542013 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "scripts/bash-buddy"] + path = scripts/bash-buddy + url = https://github.com/foldright/bash-buddy.git diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0addecada..000000000 --- a/.travis.yml +++ /dev/null @@ -1,47 +0,0 @@ -# Building a Java project -# https://docs.travis-ci.com/user/languages/java -# -# how to install and set jdk on travis: -# - Testing Against Multiple JDKs -# https://docs.travis-ci.com/user/languages/java/#Testing-Against-Multiple-JDKs -# - JVM images -# https://docs.travis-ci.com/user/reference/trusty/#JVM-(Clojure%2C-Groovy%2C-Java%2C-Scala)-images -# - Customizing the Build / Build Matrix -# https://docs.travis-ci.com/user/customizing-the-build/#Build-Matrix -language: java - -# The Ubuntu Linux Build Environments -# https://docs.travis-ci.com/user/reference/linux/ -dist: bionic - -# JVM (Clojure, Groovy, Java, Scala) support -# https://docs.travis-ci.com/user/reference/bionic#jvm-clojure-groovy-java-scala-support -jdk: - - openjdk11 - -# Job Lifecycle -# https://docs.travis-ci.com/user/job-lifecycle/ - -before_install: - # output env info - - echo -e "PATH=$PATH\nSHELL=$SHELL" - -script: - - scripts/multi-jdk-integration-test.sh - -after_script: - - git status --ignored - -before_cache: - # clear self maven install - - rm -rf $HOME/.m2/repository/com/alibaba/cola - - rm -rf $HOME/.m2/repository/com/alibaba/craftsman - - rm -rf $HOME/.m2/repository/com/alibaba/demo - -# Caching Dependencies and Directories -# https://docs.travis-ci.com/user/caching/ -cache: - directories: - - $HOME/.m2 - - $HOME/.sdkman - - $HOME/.cache/pip diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000..c4d61c0d6 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,83 @@ +# appveyor.yml Reference +# https://www.appveyor.com/docs/appveyor-yml/ +# +# How to use AppVeyor to build a multi-arch Docker image for Linux and Windows +# https://stefanscherer.github.io/use-appveyor-to-build-multi-arch-docker-image/ +# +# Building ASP.NET Core apps on both Windows and Linux using AppVeyor +# https://andrewlock.net/building-asp-net-core-apps-on-both-windows-and-linux-using-appveyor/ +# +# appveyor.yml Example: +# https://github.com/cdcseacave/openMVS/blob/master/.appveyor.yml + +version: '{build}' +branches: + except: + - gh-pages + +image: + - Ubuntu2004 + - Visual Studio 2017 + +build: false +clone_depth: 50 + +environment: + APPVEYOR_YML_DISABLE_PS_LINUX: true + MAVEN_OPTS: "-Xmx768m -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2" + JAVA_OPTS: "-Xmx768m" + +for: + - + #------------------ + # Ubuntu + #------------------ + matrix: + only: + - image: Ubuntu2004 + + test_script: + - git submodule update --init + - scripts/integration-test.sh + + after_test: + # clear self maven install + - rm -rf $HOME/.m2/repository/com/alibaba/cola + - rm -rf $HOME/.m2/repository/com/alibaba/craftsman + - rm -rf $HOME/.m2/repository/com/alibaba/demo + - rm -rf $HOME/.m2/wrapper/dists/*/*/*.zip + - rm -rf $HOME/.sdkman/archives/* + + cache: + # if cache size is exceed appveyor limit: + # Compressed cache item cannot exceed 1,048,576,000 bytes + # skip below maven cache: + - $HOME/.m2/ + - $HOME/.sdkman/ + - + #------------------ + # Windows + #------------------ + matrix: + only: + - image: Visual Studio 2017 + install: + - ps: "ls 'C:/Program Files/Java/jdk*'" + - ps: "ls 'C:/Program Files (x86)/Java/jdk*'" + - cmd: echo JAVA_HOME=%JAVA_HOME%, HOMEPATH=%HOMEPATH%, PATH=%PATH% + + test_script: + # test under java 8 + - cmd: set JAVA_HOME=C:\Program Files\Java\jdk1.8.0 + - ./mvnw.cmd -V --no-transfer-progress clean install + # test under java 11 + - cmd: set JAVA_HOME=C:\Program Files\Java\jdk11 + - ./mvnw.cmd -V --no-transfer-progress clean install + + after_test: + - ps: Remove-Item -r -fo $home\.m2\repository\com\alibaba\cola + - ps: Remove-Item -r -fo $home\.m2\repository\com\alibaba\craftsman + + cache: + # https://www.appveyor.com/docs/build-cache/ + - '%HOMEDRIVE%%HOMEPATH%\.m2\' diff --git a/samples/craftsman/pom.xml b/samples/craftsman/pom.xml index 468abe452..fb5f59a9b 100644 --- a/samples/craftsman/pom.xml +++ b/samples/craftsman/pom.xml @@ -186,4 +186,60 @@ + + + + gen-src+doc + + + performRelease + true + + + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.3.1 + + + attach-javadoc + + jar + + + + + 8 + protected + UTF-8 + UTF-8 + UTF-8 + + --no-module-directories + -quiet + -J-Duser.language=en + -J-Duser.country=US + -Xdoclint:none + + + + + + + diff --git a/scripts/bash-buddy b/scripts/bash-buddy new file mode 160000 index 000000000..bb6ef887d --- /dev/null +++ b/scripts/bash-buddy @@ -0,0 +1 @@ +Subproject commit bb6ef887d5f81b982a2c8739a8909f65758b9984 diff --git a/scripts/common.sh b/scripts/common.sh deleted file mode 100644 index e2e6eb4f2..000000000 --- a/scripts/common.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/bash -[ -z "${__source_guard_309D8FD8_7655_42EE_B32A_9604A082BD9E:+dummy}" ] || return 0 -__source_guard_309D8FD8_7655_42EE_B32A_9604A082BD9E=true - -set -eEuo pipefail - -################################################################################ -# constants -################################################################################ - -# NOTE: $'foo' is the escape sequence syntax of bash -readonly nl=$'\n' # new line -readonly ec=$'\033' # escape char -readonly eend=$'\033[0m' # escape end - -################################################################################ -# common util functions -################################################################################ - -colorEcho() { - local color=$1 - shift - - # if stdout is the console, turn on color output. - [ -t 1 ] && echo "${ec}[1;${color}m$*${eend}" || echo "$*" -} - -redEcho() { - colorEcho 31 "$@" -} - -yellowEcho() { - colorEcho 33 "$@" -} - -blueEcho() { - colorEcho 36 "$@" -} - -headInfo() { - colorEcho "0;34;46" ================================================================================ - yellowEcho "$*" - colorEcho "0;34;46" ================================================================================ -} - -# How to compare a program's version in a shell script? -# https://unix.stackexchange.com/questions/285924 -versionLessThan() { - (($# == 2)) || die "${FUNCNAME[0]} need only 2 arguments, actual arguments: $*" - - local ver=$1 - local destVer=$2 - - [ "$ver" = "$destVer" ] && return 1 - - [ "$(printf '%s\n' "$ver" "$destVer" | sort -V | head -n1)" = "$ver" ] -} - -logAndRun() { - local simple_mode=false - [ "$1" = "-s" ] && { - simple_mode=true - shift - } - - if $simple_mode; then - echo "Run under work directory $PWD : $*" - "$@" - else - blueEcho "Run under work directory $PWD :$nl$*" - time "$@" - fi -} - -die() { - redEcho "Error: $*" 1>&2 - exit 1 -} diff --git a/scripts/common_build.sh b/scripts/common_build.sh deleted file mode 100644 index bce2c582f..000000000 --- a/scripts/common_build.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/bash -[ -z "${__source_guard_7D8ED8FF_636B_4D66_95D7_9D46FE180F0F:+dummy}" ] || return 0 -__source_guard_7D8ED8FF_636B_4D66_95D7_9D46FE180F0F=true - -# shellcheck source=common.sh -source "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")/common.sh" - -################################################################################ -# build util functions -################################################################################ - -__getMvnwExe() { - local maven_wrapper_name="mvnw" - - local d="$PWD" - while true; do - [ "/" = "$d" ] && die "Fail to find $maven_wrapper_name!" - [ -f "$d/$maven_wrapper_name" ] && break - - d=$(dirname "$d") - done - - echo "$d/$maven_wrapper_name" -} - -__getJavaVersion() { - cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")/../cola-components/" && - ./mvnw -v | awk -F': |,' '/^Java version/ {print $2}' -} - -__getMoreMvnOptionsWhenJdk11() { - local javaVersion - javaVersion=$(__getJavaVersion) - if ! versionLessThan $javaVersion 11 && versionLessThan $javaVersion 12; then - echo -DperformRelease -P'!gen-sign' - fi -} - -readonly -a _MVN_BASIC_OPTIONS=( - -V --no-transfer-progress -) -readonly -a _MVN_OPTIONS=( - "${_MVN_BASIC_OPTIONS[@]}" - $(__getMoreMvnOptionsWhenJdk11) -) - -MVN() { - logAndRun "$(__getMvnwExe)" "${_MVN_OPTIONS[@]}" "$@" -} - -MVN_WITH_BASIC_OPTIONS() { - logAndRun "$(__getMvnwExe)" "${_MVN_BASIC_OPTIONS[@]}" "$@" -} - -extractFirstElementValueFromPom() { - (($# == 2)) || die "${FUNCNAME[0]} need only 2 arguments, actual arguments: $*" - - local element=$1 - local pom_file=$2 - grep \<"$element"'>.* "$pom_file" | awk -F' 'NR==1 {print $2}' -} - -# Where is Maven local repository? -# https://mkyong.com/maven/where-is-maven-local-repository/ - -cleanMavenInstallOfColaInMavenLocalRepository() { - if [ -z "${__mvn_local_repository_dir:-}" ]; then - # NOTE: DO NOT declare __mvn_local_repository_dir var as readonly, its value is supplied by subshell. - __mvn_local_repository_dir="$( - cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")/../cola-components/" && - ./mvnw --no-transfer-progress help:evaluate -Dexpression=settings.localRepository | - grep '^/' - )" - - [ -n "$__mvn_local_repository_dir" ] || die "Fail to find maven local repository directory: $__mvn_local_repository_dir" - echo "found maven local repository directory: $__mvn_local_repository_dir" - fi - - headInfo "clean maven build and install of COLA in maven local repository:" - logAndRun -s rm -rf "$__mvn_local_repository_dir/com/alibaba/demo" - logAndRun -s rm -rf "$__mvn_local_repository_dir/com/alibaba/cola" - logAndRun -s rm -rf "$__mvn_local_repository_dir/com/alibaba/craftsman" -} diff --git a/scripts/integration-test.sh b/scripts/integration-test.sh index 6b3285e55..2ef39f8df 100755 --- a/scripts/integration-test.sh +++ b/scripts/integration-test.sh @@ -1,104 +1,149 @@ #!/bin/bash -# NOTE about Bash Traps and Pitfalls: -# -# 1. DO NOT declare var as readonly if value is supplied by subshell!! -# for example: readonly var1=$(echo value1) -# -# readonly declaration make exit code of assignment to be always 0, -# aka. the exit code of command in subshell is discarded. -# tested on bash 3.2.57/4.2.46 - set -eEuo pipefail +cd "$(dirname "$(readlink -f "$0")")" -# shellcheck source=common.sh -source "$(dirname "$(readlink -f "$0")")/common.sh" -# shellcheck source=common_build.sh -source "$(dirname "$(readlink -f "$0")")/common_build.sh" - -# adjust current dir to project root dir -cd "$(dirname "$(readlink -f "$0")")/.." +source bash-buddy/lib/trap_error_info.sh +source bash-buddy/lib/common_utils.sh ################################################################################ -# CI operations +# prepare ################################################################################ -cleanMavenInstallOfColaInMavenLocalRepository +# shellcheck disable=SC2034 +PREPARE_JDKS_INSTALL_BY_SDKMAN=( + 8.322.06.2-amzn + 11.0.14-ms + 17.0.2.8.1-amzn +) + +source bash-buddy/lib/prepare_jdks.sh -( - headInfo "CI: cola-components" +source bash-buddy/lib/java_build_utils.sh - cd cola-components/ - MVN clean install +# here use `install` and `-D performRelease` intended +# to check release operations. +# +# De-activate a maven profile from command line +# https://stackoverflow.com/questions/25201430 +# +# shellcheck disable=SC2034 +JVB_MVN_OPTS=( + "${JVB_DEFAULT_MVN_OPTS[@]}" + -DperformRelease -P'!gen-sign' ) -( - headInfo "CI: cola-archetypes" +################################################################################ +# ci build logic +################################################################################ - cd cola-archetypes/ - MVN clean install -) +cd .. -( - headInfo "CI: archetype:generate by cola-framework-archetype-service" - - # NOTE: DO NOT declare archetypeVersion var as readonly, its value is supplied by subshell. - archetypeVersion=$(extractFirstElementValueFromPom version cola-archetypes/cola-archetype-service/pom.xml) - - # shellcheck disable=SC2030 - readonly demo_dir="cola-archetypes/target/cola-framework-archetype-service-demo" - mkdir -p "$demo_dir" - cd "$demo_dir" - - # shellcheck disable=SC2030 - readonly artifactId=demo-service - - MVN archetype:generate \ - -DgroupId=com.alibaba.cola.demo.archetype-service \ - -DartifactId="$artifactId" \ - -Dversion=1.0.0-SNAPSHOT \ - -Dpackage=com.alibaba.cola.demo.service \ - -DarchetypeGroupId=com.alibaba.cola \ - -DarchetypeArtifactId=cola-framework-archetype-service \ - -DarchetypeVersion="$archetypeVersion" \ - -DinteractiveMode=false \ - -DarchetypeCatalog=local - - cd "$artifactId" - MVN_WITH_BASIC_OPTIONS install -) +extractFirstElementValueFromPom() { + (($# == 2)) || die "${FUNCNAME[0]} need only 2 arguments, actual arguments: $*" -( - headInfo "CI: archetype:generate by cola-framework-archetype-web" - - # NOTE: DO NOT declare archetypeVersion var as readonly, its value is supplied by subshell. - archetypeVersion=$(extractFirstElementValueFromPom version cola-archetypes/cola-archetype-web/pom.xml) - - # shellcheck disable=SC2031 - readonly demo_dir="cola-archetypes/target/cola-framework-archetype-web-demo" - mkdir -p "$demo_dir" - cd "$demo_dir" - - # shellcheck disable=SC2031 - readonly artifactId=demo-web - - MVN archetype:generate \ - -DgroupId=com.alibaba.cola.demo.archetype-web \ - -DartifactId="$artifactId" \ - -Dversion=1.0.0-SNAPSHOT \ - -Dpackage=com.alibaba.cola.demo.web \ - -DarchetypeGroupId=com.alibaba.cola \ - -DarchetypeArtifactId=cola-framework-archetype-web \ - -DarchetypeVersion="$archetypeVersion" \ - -DinteractiveMode=false \ - -DarchetypeCatalog=local - - cd "$artifactId" - MVN_WITH_BASIC_OPTIONS install -) + local element=$1 + local pom_file=$2 + grep \<"$element"'>.* "$pom_file" | awk -F' 'NR==1 {print $2}' +} -( - headInfo "CI: samples/craftsman" +test_cola_archetype() { + local bkp_mvn_opts=("${JVB_MVN_OPTS[@]}") + JVB_MVN_OPTS=("${JVB_DEFAULT_MVN_OPTS[@]}") - cd samples/craftsman/ - MVN_WITH_BASIC_OPTIONS clean install -) + ( + cu::head_line_echo "test archetype:generate by cola-framework-archetype-service" + + # NOTE: DO NOT declare archetypeVersion var as readonly, its value is supplied by subshell. + archetypeVersion=$(extractFirstElementValueFromPom version cola-archetypes/cola-archetype-service/pom.xml) + + # shellcheck disable=SC2030 + readonly demo_dir="cola-archetypes/target/cola-framework-archetype-service-demo" + rm -rf "$demo_dir" + mkdir -p "$demo_dir" + cd "$demo_dir" + + # shellcheck disable=SC2030 + readonly artifactId=demo-service + + jvb::mvn_cmd archetype:generate \ + -DgroupId=com.alibaba.cola.demo.archetype-service \ + -DartifactId="$artifactId" \ + -Dversion=1.0.0-SNAPSHOT \ + -Dpackage=com.alibaba.cola.demo.service \ + -DarchetypeGroupId=com.alibaba.cola \ + -DarchetypeArtifactId=cola-framework-archetype-service \ + -DarchetypeVersion="$archetypeVersion" \ + -DinteractiveMode=false \ + -DarchetypeCatalog=local + + cd "$artifactId" + jvb::mvn_cmd install + ) + + ( + cu::head_line_echo "test archetype:generate by cola-framework-archetype-web" + + # NOTE: DO NOT declare archetypeVersion var as readonly, its value is supplied by subshell. + archetypeVersion=$(extractFirstElementValueFromPom version cola-archetypes/cola-archetype-web/pom.xml) + + # shellcheck disable=SC2031 + readonly demo_dir="cola-archetypes/target/cola-framework-archetype-web-demo" + rm -rf "$demo_dir" + mkdir -p "$demo_dir" + cd "$demo_dir" + + # shellcheck disable=SC2031 + readonly artifactId=demo-web + + jvb::mvn_cmd archetype:generate \ + -DgroupId=com.alibaba.cola.demo.archetype-web \ + -DartifactId="$artifactId" \ + -Dversion=1.0.0-SNAPSHOT \ + -Dpackage=com.alibaba.cola.demo.web \ + -DarchetypeGroupId=com.alibaba.cola \ + -DarchetypeArtifactId=cola-framework-archetype-web \ + -DarchetypeVersion="$archetypeVersion" \ + -DinteractiveMode=false \ + -DarchetypeCatalog=local + + cd "$artifactId" + jvb::mvn_cmd install + ) + + JVB_MVN_OPTS=("${bkp_mvn_opts[@]}") +} + +######################################## +# default jdk 11, do build and test +######################################## + +export CI_TEST_MODE=true +export DCM_AGENT_SUPRESS_EXCEPTION_STACK=true + +default_build_jdk_version=11 + +prepare_jdks::switch_java_home_to_jdk "$default_build_jdk_version" + +cu::head_line_echo "build and test with Java: $JAVA_HOME" + +jvb::mvn_cmd clean install + +test_cola_archetype + +######################################## +# test multi-version java +# shellcheck disable=SC2154 +######################################## +for jhome_var_name in "${JDK_HOME_VAR_NAMES[@]}"; do + # already tested by above `mvn install` + [ "JDK${default_build_jdk_version}_HOME" = "$jhome_var_name" ] && continue + + prepare_jdks::switch_java_home_to_jdk "${!jhome_var_name}" + + cu::head_line_echo "test with Java: $JAVA_HOME" + + # just test without build + jvb::mvn_cmd surefire:test + + test_cola_archetype +done diff --git a/scripts/multi-jdk-integration-test.sh b/scripts/multi-jdk-integration-test.sh deleted file mode 100755 index 56656c5f6..000000000 --- a/scripts/multi-jdk-integration-test.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -set -eEuo pipefail -# adjust current dir to script dir -cd "$(dirname "$(readlink -f "$0")")" - -source common.sh -source prepare-jdk.sh - -################################################################################ -# multi JDK CI operations -################################################################################ - -# shellcheck disable=SC2154 -for jhm_var_name in "${java_home_var_names[@]}"; do - export JAVA_HOME="${!jhm_var_name}" - - echo - headInfo "test with $jhm_var_name: $JAVA_HOME" - echo - - logAndRun ./integration-test.sh -done diff --git a/scripts/prepare-jdk.sh b/scripts/prepare-jdk.sh deleted file mode 100644 index 592d08bb1..000000000 --- a/scripts/prepare-jdk.sh +++ /dev/null @@ -1,80 +0,0 @@ -#!/bin/bash -# SDKMAN! with Travis -# https://objectcomputing.com/news/2019/01/07/sdkman-travis - -[ -z "${__source_guard_81039D15_3DA9_4EA3_A751_E83DBA84C038:+dummy}" ] || return 0 -__source_guard_81039D15_3DA9_4EA3_A751_E83DBA84C038=true - -set -eEuo pipefail - -# shellcheck source=common.sh -source "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")/common.sh" - -__loadSdkman() { - local this_time_install_sdk_man=false - # install sdkman - if [ ! -f "$HOME/.sdkman/bin/sdkman-init.sh" ]; then - [ -d "$HOME/.sdkman" ] && rm -rf "$HOME/.sdkman" - - curl -s get.sdkman.io | bash || die "fail to install sdkman" - echo sdkman_auto_answer=true >>"$HOME/.sdkman/etc/config" - - this_time_install_sdk_man=true - fi - - set +u - # shellcheck disable=SC1090 - source "$HOME/.sdkman/bin/sdkman-init.sh" - "$this_time_install_sdk_man" && logAndRun sdk ls java - set -u -} -__loadSdkman - -jdks_install_by_sdkman=( - 8.0.275-amzn - - 9.0.7-zulu - #10.0.2-zulu - 11.0.9-zulu - - #12.0.2-open - #13.0.5-zulu - #14.0.2-zulu - 15.0.1-zulu -) -java_home_var_names=() - -__setJdkHomeVarsAndInstallJdk() { - blueEcho "prepared jdks:" - - local jdkNameOfSdkman - for jdkNameOfSdkman in "${jdks_install_by_sdkman[@]}"; do - local jdkVersion - jdkVersion=$(echo "$jdkNameOfSdkman" | awk -F'[.]' '{print $1}') - - # jdkHomeVarName like JDK7_HOME, JDK11_HOME - local jdkHomeVarName="JDK${jdkVersion}_HOME" - - if [ ! -d "${!jdkHomeVarName:-}" ]; then - local jdkHomePath="$SDKMAN_CANDIDATES_DIR/java/$jdkNameOfSdkman" - - # set JDKx_HOME to global var java_home_var_names - eval "$jdkHomeVarName='${jdkHomePath}'" - - # install jdk by sdkman - [ ! -d "$jdkHomePath" ] && { - set +u - logAndRun sdk install java "$jdkNameOfSdkman" || die "fail to install jdk $jdkNameOfSdkman by sdkman" - set -u - } - fi - - java_home_var_names=(${java_home_var_names[@]:+"${java_home_var_names[@]}"} "$jdkHomeVarName") - printf '%s :\n\t%s\n\tspecified is %s\n' "$jdkHomeVarName" "${!jdkHomeVarName}" "$jdkNameOfSdkman" - done - - echo - blueEcho "ls $SDKMAN_CANDIDATES_DIR/java/ :" - ls -la "$SDKMAN_CANDIDATES_DIR/java/" -} -__setJdkHomeVarsAndInstallJdk