blob: 1b299d5c3428ab3a971157910068b6ca3be9fbd2 [file] [log] [blame]
#!/bin/bash
#
# 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.
#
DIR=`dirname $0`
PROJECT_HOME=${DIR}/../
TIMESTAMP=$(date +%s)
BUILD_TAG="build-${TIMESTAMP}"
function cleanup {
BUILD_IMAGE=$(docker images tinkerpop | awk "{if (\$2 == \"${BUILD_TAG}\") print \$3}")
[ ! -z ${BUILD_IMAGE} ] && docker rmi ${BUILD_IMAGE}
rm -f ${PROJECT_HOME}/Dockerfile
docker image prune --filter "label=maintainer=dev@tinkerpop.apache.org" -f > /dev/null
}
trap cleanup EXIT
REMOVE_CONTAINER="--rm"
[[ -n ${KEEP_CONTAINER} ]] && unset REMOVE_CONTAINER
function usage {
echo -e "\nUsage: `basename $0` [OPTIONS]" \
"\nBuild the current local TinkerPop project in a Docker container." \
"\nBy default all modules are run. If you prefer to run a specific module then please" \
"\nenter it as an option. Selecting specific modules changes the build to include only" \
"\nthose selected modules as well as gremlin-server, gremlin-test and neo4j-gremlin (and" \
"\ntheir dependencies)." \
"\n\nOptions are:\n" \
"\n\t-t, --tests run standard test suite" \
"\n\t-i, --integration-tests run integration tests" \
"\n\t-n, --neo4j include Neo4j" \
"\n\t-go, --golang change to minimal build and add gremlin-go to build" \
"\n\t-py, --python change to minimal build and add gremlin-python to build" \
"\n\t-dn, --dotnet change to minimal build and add gremlin-dotnet to build" \
"\n\t-js, --javascript change to minimal build and add gremlin-javascript to build" \
"\n\t-c, --console change to minimal build and add gremlin-console to build" \
"\n\t-j, --java-docs build Java docs" \
"\n\t-d, --docs build user docs" \
"\n\t-h, --help show this message" \
"\n"
}
ARGS=""
RUN_TESTS=""
RUN_INTEGRATION_TESTS=""
INCLUDE_GO=""
INCLUDE_PYTHON=""
INCLUDE_DOTNET=""
INCLUDE_JAVASCRIPT=""
INCLUDE_CONSOLE=""
while [ ! -z "$1" ]; do
case "$1" in
-t | --tests ) ARGS="${ARGS} -t"; RUN_TESTS=true; shift ;;
-i | --integration-tests ) ARGS="${ARGS} -i"; RUN_INTEGRATION_TESTS=true; shift ;;
-n | --neo4j ) ARGS="${ARGS} -n"; shift ;;
-go | --golang ) ARGS="${ARGS} -go"; INCLUDE_GO=true; shift ;;
-py | --python ) ARGS="${ARGS} -py"; INCLUDE_PYTHON=true; shift ;;
-dn | --dotnet ) ARGS="${ARGS} -dn"; INCLUDE_DOTNET=true; shift ;;
-js | --javascript ) ARGS="${ARGS} -js"; INCLUDE_JAVASCRIPT=true; shift ;;
-c | --console ) ARGS="${ARGS} -c"; INCLUDE_CONSOLE=true; shift ;;
-j | --java-docs ) ARGS="${ARGS} -j"; shift ;;
-d | --docs ) ARGS="${ARGS} -d"; shift ;;
-h | --help ) usage; exit 0 ;;
*) usage 1>&2; exit 1 ;;
esac
done
# The default is for every module to be included.
if [[ -z ${INCLUDE_GO} && -z ${INCLUDE_PYTHON} && -z ${INCLUDE_DOTNET} && -z ${INCLUDE_JAVASCRIPT} && -z ${INCLUDE_CONSOLE} ]]; then
INCLUDE_GO=true
INCLUDE_PYTHON=true
INCLUDE_DOTNET=true
INCLUDE_JAVASCRIPT=true
INCLUDE_CONSOLE=true
fi
pushd ${PROJECT_HOME} > /dev/null
export ABS_PROJECT_HOME=$(pwd) # absolute path required by some Docker variables.
echo "ABS_PROJECT_HOME ${ABS_PROJECT_HOME}"
HADOOP_VERSION=$(cat pom.xml | grep -o '<hadoop.version>[^<]*' | head -n1 | cut -d '>' -f2)
docker/build-containers.sh -h "${HADOOP_VERSION}"
sed -e "s/HADOOP_VERSION\$/${HADOOP_VERSION}/" docker/build/Dockerfile.template > Dockerfile
cat >> Dockerfile <<EOF
CMD ["sh", "-c", "docker/scripts/build.sh ${ARGS}"]
EOF
function check_status {
status=$?
[ "$1" == "down" ] && docker-compose down
popd > /dev/null
[ $status -ne 0 ] && exit $status
}
# GREMLIN_SERVER is the project version e.g. 3.5.5-SNAPSHOT
export GREMLIN_SERVER=$(grep tinkerpop -A2 pom.xml | sed -r -n 's/.*<version>(([0-9]+\.?){3})(-SNAPSHOT)?<\/version>/\1\3/p')
echo "GREMLIN_SERVER ${GREMLIN_SERVER}"
docker build -t tinkerpop:${BUILD_TAG} .
docker run -p 80:80 ${TINKERPOP_DOCKER_OPTS} ${REMOVE_CONTAINER} \
-e "JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" \
-ti \
--mount type=bind,src=${HOME}/.m2/,dst=/root/.m2/ \
--mount type=bind,src=$(pwd)/gremlin-server/,dst=/usr/src/tinkerpop/gremlin-server/ \
--mount type=bind,src=$(pwd)/gremlin-test/,dst=/usr/src/tinkerpop/gremlin-test/ \
--mount type=bind,src=$(pwd)/gremlin-console/,dst=/usr/src/tinkerpop/gremlin-console/ \
--mount type=bind,src=$(pwd)/neo4j-gremlin/,dst=/usr/src/tinkerpop/neo4j-gremlin/ \
tinkerpop:${BUILD_TAG}
check_status
if [ -n "${RUN_TESTS}" ]; then
# If testing, then build base server which is required by the following docker-compose.
pushd ${ABS_PROJECT_HOME}/gremlin-server > /dev/null
docker build -f ./Dockerfile --build-arg GREMLIN_SERVER_DIR=target/apache-tinkerpop-gremlin-server-${GREMLIN_SERVER}-standalone -t tinkerpop/gremlin-server:${GREMLIN_SERVER} .
check_status
fi
if [ -n "${INCLUDE_GO}" ] && [ -n "${RUN_TESTS}" ]; then
pushd ${ABS_PROJECT_HOME}/gremlin-go > /dev/null
docker-compose up --build --exit-code-from gremlin-go-integration-tests
check_status "down"
fi
if [ -n "${INCLUDE_PYTHON}" ] && [ -n "${RUN_TESTS}" ]; then
pushd ${ABS_PROJECT_HOME}/gremlin-python > /dev/null
export BUILD_DIR=$(pwd)/target/python3/
mkdir -p ${BUILD_DIR}
cp -r ./src/main/python/* ${BUILD_DIR}
docker-compose up --build --abort-on-container-exit gremlin-server-test-python gremlin-python-integration-tests
check_status "down"
fi
if [ -n "${INCLUDE_DOTNET}" ] && [ -n "${RUN_TESTS}" ]; then
pushd ${ABS_PROJECT_HOME}/gremlin-dotnet/test > /dev/null
docker-compose up --build --exit-code-from gremlin-dotnet-integration-tests
check_status "down"
fi
if [ -n "${INCLUDE_JAVASCRIPT}" ] && [ -n "${RUN_TESTS}" ]; then
pushd ${ABS_PROJECT_HOME}/gremlin-javascript/src/main/javascript/gremlin-javascript > /dev/null
docker-compose up --build --exit-code-from gremlin-js-integration-tests
check_status "down"
fi
if [ -n "${INCLUDE_CONSOLE}" ] && [ -n "${RUN_INTEGRATION_TESTS}" ]; then
pushd ${ABS_PROJECT_HOME}/gremlin-console > /dev/null
docker build -t gremlin-console-test:py3.8jre11 ./src/test/python/docker
docker run --rm \
--mount type=bind,src=$(pwd)/src/test/python,dst=/console_app \
--mount type=bind,src=$(pwd)/target/apache-tinkerpop-gremlin-console-${GREMLIN_SERVER}-standalone,dst=/console_app/gremlin-console \
gremlin-console-test:py3.8jre11
check_status
fi
exit 0