Add `quickstart.sh` script to run with recommended settings (#318)

pull/319/head
Michael Barry 2022-08-10 05:09:33 -04:00 zatwierdzone przez GitHub
rodzic 4cc139a603
commit 9e0eec93c8
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
5 zmienionych plików z 179 dodań i 20 usunięć

Wyświetl plik

@ -127,3 +127,28 @@ jobs:
run: ./scripts/test-release.sh CI_ONLY
env:
SKIP_EXAMPLE_PROJECT: true
quickstart:
name: Quickstart script
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- uses: actions/checkout@v3
with:
submodules: true
- name: Cache data/sources
uses: ./.github/cache-sources-action
- name: Set up JDK
uses: actions/setup-java@v3
with:
java-version: 17
distribution: 'temurin'
cache: 'maven'
- name: quickstart.sh --build
run: rm -rf data/output.mbtiles data/tmp && ./quickstart.sh monaco --build && ./scripts/check-monaco.sh data/output.mbtiles
- name: quickstart.sh --jar
run: rm -rf data/output.mbtiles data/tmp && ./quickstart.sh monaco --jar && ./scripts/check-monaco.sh data/output.mbtiles
# run docker last since it creates temp dirs with root user
- name: quickstart.sh --docker
run: rm -rf data/output.mbtiles data/tmp && ./quickstart.sh monaco --docker && ./scripts/check-monaco.sh data/output.mbtiles

Wyświetl plik

@ -55,7 +55,7 @@ public class Arguments {
/**
* Returns arguments parsed from command-line arguments.
* <p>
* For example to set {@code key=value}: {@code java -jar ... key=value}
* For example to set {@code key=value}: {@code java -jar ... key=value} or {@code java -jar ... --key value}
* <p>
* Or to set {@code key=true}: {@code java -jar ... --key}
*
@ -64,14 +64,23 @@ public class Arguments {
*/
public static Arguments fromArgs(String... args) {
Map<String, String> parsed = new HashMap<>();
for (String arg : args) {
for (int i = 0; i < args.length; i++) {
String arg = args[i].strip();
String[] kv = arg.split("=", 2);
String key = kv[0].replaceAll("^[\\s-]+", "");
if (kv.length == 2) {
String key = kv[0].replaceAll("^[\\s-]+", "");
String value = kv[1];
parsed.put(key, value);
} else if (kv.length == 1) {
parsed.put(kv[0].replaceAll("^[\\s-]+", ""), "true");
if (arg.startsWith("-")) {
if (i >= args.length - 1 || args[i + 1].strip().startsWith("-")) {
parsed.put(key, "true");
} else {
parsed.put(key, args[++i].strip());
}
} else {
parsed.put(key, "true");
}
}
}
return of(parsed);

Wyświetl plik

@ -169,4 +169,16 @@ class ArgumentsTest {
"--force_download=true"
).getBoolean("force_download", "force", false));
}
@Test
void testSpaceBetweenArgs() {
Arguments args = Arguments.fromArgs(
"--key value --key2 value2 --force1 --force2".split("\\s+")
);
assertEquals("value", args.getString("key", "key", null));
assertEquals("value2", args.getString("key2", "key2", null));
assertTrue(args.getBoolean("force1", "force1", false));
assertTrue(args.getBoolean("force2", "force2", false));
}
}

Wyświetl plik

@ -1,16 +0,0 @@
#!/usr/bin/env bash
set -e
AREA="${1:-monaco}"
shift || echo ""
echo "Will build planetiler, download sources for ${AREA}, and make a map."
echo "This requires at least 1GB of disk space. Press Ctrl+C to exit..."
sleep 5
echo "Building..."
./mvnw -DskipTests=true --projects planetiler-dist -am package
echo "Running..."
java -jar planetiler-dist/target/*with-deps.jar --force --download --area="${AREA}" $*

129
quickstart.sh 100755
Wyświetl plik

@ -0,0 +1,129 @@
#!/usr/bin/env bash
# Usage: quickstart.sh {--docker,--jar,--source} {--area=planet,monaco,massachusetts,etc.} [--memory=5g] other args...
set -o errexit
set -o pipefail
set -o nounset
JAVA="${JAVA:-java}"
METHOD="build"
AREA="monaco"
STORAGE="mmap"
PLANETILER_ARGS=("--download" "--force")
MEMORY=""
DRY_RUN=""
VERSION="latest"
DOCKER_DIR="$(pwd)/data"
# Handle quickstart.sh planet or quickstart.sh monaco
case $1 in
-*) ;;
*) AREA="$1"; shift ;;
esac
# Parse args into env vars
while [[ $# -gt 0 ]]; do
case $1 in
--docker) METHOD="docker" ;;
--dockerdir=*) DOCKER_DIR="${1#*=}" ;;
--dockerdir) DOCKER_DIR="$2"; shift ;;
--jar) METHOD="jar" ;;
--build|--source) METHOD="build" ;;
--version=*) VERSION="${1#*=}" ;;
--version) VERSION="$2"; shift ;;
--area=*) AREA="${1#*=}" ;;
--area) AREA="$2"; shift ;;
--planet) AREA="planet" ;;
--memory=*) MEMORY="${MEMORY:-"-Xmx${1#*=}"}" ;;
--memory) MEMORY="${MEMORY:-"-Xmx$2"}"; shift ;;
--ram) STORAGE="ram" ;;
--dry-run) DRY_RUN="true" ;;
*) PLANETILER_ARGS+=("$1") ;;
esac
shift
done
PLANETILER_ARGS+=("--area=$AREA")
PLANETILER_ARGS+=("--storage=$STORAGE")
# Configure memory settings based on the area being built
case $AREA in
planet)
PLANETILER_ARGS+=("--nodemap-type=array" "--download-threads=20" "--download-chunk-size-mb=500")
case "$STORAGE" in
ram) MEMORY="${MEMORY:-"-Xmx150g"}" ;;
mmap) MEMORY="${MEMORY:-"-Xmx30g -Xmn15g"}" ;;
esac
;;
monaco)
# Use mini extracts for monaco
PLANETILER_ARGS+=("--water-polygons-url=https://github.com/onthegomap/planetiler/raw/main/planetiler-core/src/test/resources/water-polygons-split-3857.zip")
PLANETILER_ARGS+=("--water-polygons-path=data/sources/monaco-water.zip")
PLANETILER_ARGS+=("--natural-earth-url=https://github.com/onthegomap/planetiler/raw/main/planetiler-core/src/test/resources/natural_earth_vector.sqlite.zip")
PLANETILER_ARGS+=("--natural-earth-path=data/sources/monaco-natural_earth_vector.sqlite.zip")
;;
esac
# For extracts, use default nodemap type (sortedtable) and -Xmx (25% of RAM up to 25GB) and hope for the best.
# You can set --memory=5g if you want to change it.
JVM_ARGS="-XX:+UseParallelGC $MEMORY"
echo "Running planetiler with:"
echo " METHOD=\"$METHOD\" (change with --docker --jar or --build)"
echo " JVM_ARGS=\"${JVM_ARGS}\" (change with --memory=Xg)"
echo " PLANETILER_ARGS=\"${PLANETILER_ARGS[*]}\""
echo " DRY_RUN=\"${DRY_RUN:-false}\""
echo ""
if [ "$DRY_RUN" == "true" ]
then
echo "Without --dry-run, will run commands:"
else
sleep 3
fi
function run() {
echo "$ $*"
if [ "$DRY_RUN" != "true" ]
then
eval "$*"
fi
}
function check_java_version() {
if [ "$DRY_RUN" != "true" ]
then
if [ -z "$(which java)" ]; then
echo "java not found on path"
exit 1
else
OUTPUT="$($JAVA -jar "$1" --help 2>&1 || echo OK)"
if [[ "$OUTPUT" =~ "UnsupportedClassVersionError" ]]; then
echo "Wrong version of java installed, need at least 16 but found:"
$JAVA --version
exit 1
fi
fi
fi
}
# Run planetiler using docker, jar file, or build from source
case $METHOD in
docker)
run docker run -e JAVA_TOOL_OPTIONS=\'"${JVM_ARGS}"\' -v "$DOCKER_DIR":/data "ghcr.io/onthegomap/planetiler:${VERSION}" "${PLANETILER_ARGS[@]}"
;;
jar)
run wget -nc "https://github.com/onthegomap/planetiler/releases/${VERSION}/download/planetiler.jar"
check_java_version planetiler.jar
run "$JAVA" "${JVM_ARGS}" -jar planetiler.jar "${PLANETILER_ARGS[@]}"
;;
build)
run ./mvnw -DskipTests --projects planetiler-dist -am clean package
run "$JAVA" "${JVM_ARGS}" -jar planetiler-dist/target/*with-deps.jar "${PLANETILER_ARGS[@]}"
;;
esac