mirror of
https://github.com/itzg/docker-minecraft-server
synced 2024-11-10 06:14:14 +00:00
Auto-merging via docker-versions-create
This commit is contained in:
commit
642d442fd3
19 changed files with 133 additions and 78 deletions
2
.github/workflows/discord.yml
vendored
2
.github/workflows/discord.yml
vendored
|
@ -2,7 +2,7 @@ name: discord
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_run:
|
workflow_run:
|
||||||
workflows: ["ContinuousIntegration", "PullRequest", "Build and Publish", "Build and publish multiarch" ]
|
workflows: ["ContinuousIntegration", "Build and Publish", "Build and publish multiarch" ]
|
||||||
types:
|
types:
|
||||||
- completed
|
- completed
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ RUN apt-get update \
|
||||||
&& DEBIAN_FRONTEND=noninteractive \
|
&& DEBIAN_FRONTEND=noninteractive \
|
||||||
apt-get install -y \
|
apt-get install -y \
|
||||||
imagemagick \
|
imagemagick \
|
||||||
|
file \
|
||||||
gosu \
|
gosu \
|
||||||
sudo \
|
sudo \
|
||||||
net-tools \
|
net-tools \
|
||||||
|
@ -60,7 +61,7 @@ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
||||||
--var version=0.1.1 --var app=maven-metadata-release --file {{.app}} \
|
--var version=0.1.1 --var app=maven-metadata-release --file {{.app}} \
|
||||||
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
--from https://github.com/itzg/{{.app}}/releases/download/{{.version}}/{{.app}}_{{.version}}_{{.os}}_{{.arch}}.tar.gz
|
||||||
|
|
||||||
ARG MC_HELPER_VERSION=1.11.0
|
ARG MC_HELPER_VERSION=1.16.0
|
||||||
ARG MC_HELPER_BASE_URL=https://github.com/itzg/mc-image-helper/releases/download/v${MC_HELPER_VERSION}
|
ARG MC_HELPER_BASE_URL=https://github.com/itzg/mc-image-helper/releases/download/v${MC_HELPER_VERSION}
|
||||||
RUN curl -fsSL ${MC_HELPER_BASE_URL}/mc-image-helper-${MC_HELPER_VERSION}.tgz \
|
RUN curl -fsSL ${MC_HELPER_BASE_URL}/mc-image-helper-${MC_HELPER_VERSION}.tgz \
|
||||||
| tar -C /usr/share -zxf - \
|
| tar -C /usr/share -zxf - \
|
||||||
|
|
17
README.md
17
README.md
|
@ -141,7 +141,7 @@ By default, the container will download the latest version of the "vanilla" [Min
|
||||||
* [Running on RaspberryPi](#running-on-raspberrypi)
|
* [Running on RaspberryPi](#running-on-raspberrypi)
|
||||||
* [Contributing](#contributing)
|
* [Contributing](#contributing)
|
||||||
|
|
||||||
<!-- Added by: runner, at: Sun Jan 23 16:57:48 UTC 2022 -->
|
<!-- Added by: runner, at: Mon Jan 24 04:19:37 UTC 2022 -->
|
||||||
|
|
||||||
<!--te-->
|
<!--te-->
|
||||||
|
|
||||||
|
@ -481,10 +481,9 @@ An [Airplane](https://airplane.gg) server, which is "a stable, optimized, well s
|
||||||
|
|
||||||
-e TYPE=AIRPLANE
|
-e TYPE=AIRPLANE
|
||||||
|
|
||||||
> NOTE: The `VERSION` variable is used to select an Airplane branch to download from. The available options are "LATEST" "1.17" and "PURPUR"
|
> NOTE: The `VERSION` variable is used to select an Airplane type to download. The available options are "LATEST" and "PURPUR", both 1.17.1. Airplane does not support 1.18 -- use Paper/Pufferfish/Purpur.
|
||||||
|
|
||||||
Extra variables:
|
Extra variables:
|
||||||
- `AIRPLANE_BUILD=lastSuccessfulBuild` : set a specific Airplane build to use
|
|
||||||
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
|
- `FORCE_REDOWNLOAD=false` : set to true to force the located server jar to be re-downloaded
|
||||||
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the built-in [Flare](https://blog.airplane.gg/flare) profiler
|
- `USE_FLARE_FLAGS=false` : set to true to add appropriate flags for the built-in [Flare](https://blog.airplane.gg/flare) profiler
|
||||||
|
|
||||||
|
@ -830,23 +829,19 @@ before unpacking new content from the MODPACK or MODS.
|
||||||
|
|
||||||
### Downloadable world
|
### Downloadable world
|
||||||
|
|
||||||
Instead of mounting the `/data` volume, you can instead specify the URL of a ZIP file containing an archived world. It will be searched for a file `level.dat` and the containing subdirectory moved to the directory named by `$LEVEL`. This means that most of the archived Minecraft worlds downloadable from the Internet will already be in the correct format.
|
Instead of mounting the `/data` volume, you can instead specify the URL of a ZIP or compressed TAR file containing an archived world. It will be searched for a file `level.dat` and the containing subdirectory moved to the directory named by `$LEVEL`. This means that most of the archived Minecraft worlds downloadable from the Internet will already be in the correct format.
|
||||||
|
|
||||||
docker run -d -e WORLD=http://www.example.com/worlds/MySave.zip ...
|
docker run -d -e WORLD=http://www.example.com/worlds/MySave.zip ...
|
||||||
|
|
||||||
**NOTE:** This URL must be accessible from inside the container. Therefore,
|
**NOTE:** This URL must be accessible from inside the container. Therefore, you should use an IP address or a globally resolvable FQDN, or else the name of a linked container.
|
||||||
you should use an IP address or a globally resolvable FQDN, or else the
|
|
||||||
name of a linked container.
|
|
||||||
|
|
||||||
**NOTE:** If the archive contains more than one `level.dat`, then the one to select can be picked with `WORLD_INDEX`, which defaults to 1.
|
**NOTE:** If the archive contains more than one `level.dat`, then the one to select can be picked with `WORLD_INDEX`, which defaults to 1.
|
||||||
|
|
||||||
### Cloning world from a container path
|
### Cloning world from a container path
|
||||||
|
|
||||||
The `WORLD` option can also be used to reference a directory or zip file that will be used as a source to clone or unzip the world directory.
|
The `WORLD` option can also be used to reference a directory, zip file, or compressed tar file that will be used as a source to clone or extract the world directory.
|
||||||
|
|
||||||
For example, the following would initially clone the world's content
|
For example, the following would initially clone the world's content from `/worlds/basic`. Also notice in the example that you should use a read-only volume attachment to ensure the clone source remains pristine.
|
||||||
from `/worlds/basic`. Also notice in the example that you can use a
|
|
||||||
read-only volume attachment to ensure the clone source remains pristine.
|
|
||||||
|
|
||||||
```
|
```
|
||||||
docker run ... -v $HOME/worlds:/worlds:ro -e WORLD=/worlds/basic
|
docker run ... -v $HOME/worlds:/worlds:ro -e WORLD=/worlds/basic
|
||||||
|
|
|
@ -6,35 +6,33 @@ isDebugging && set -x
|
||||||
|
|
||||||
IFS=$'\n\t'
|
IFS=$'\n\t'
|
||||||
|
|
||||||
if [ "${VERSION}" != "LATEST" ] && [ "${VERSION}" != "1.17" ] && [ "${VERSION}" != "PURPUR" ] ; then
|
if [ "${VERSION}" != "LATEST" ] && [ "${VERSION}" != "PURPUR" ] ; then
|
||||||
log "ERROR: Airplane server type only supports VERSION=LATEST, VERSION=1.17, VERSION=PURPUR. Note that these are branches, not #.#.# versions."
|
log "ERROR: Airplane server type only supports VERSION=LATEST, VERSION=PURPUR."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
: ${AIRPLANE_BUILD:=lastSuccessfulBuild}
|
|
||||||
: ${AIRPLANE_TYPE:=airplane}
|
: ${AIRPLANE_TYPE:=airplane}
|
||||||
|
|
||||||
if [ "${VERSION}" = "LATEST" ] || [ "${VERSION}" = "1.17" ]; then
|
if [ "${VERSION}" = "LATEST" ] ; then
|
||||||
AIRPLANE_BRANCH="1.17"
|
AIRPLANE_TYPE="airplane"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "${VERSION}" = "PURPUR" ]; then
|
if [ "${VERSION}" = "PURPUR" ]; then
|
||||||
AIRPLANE_BRANCH="Purpur-1.17"
|
|
||||||
AIRPLANE_TYPE="airplanepurpur"
|
AIRPLANE_TYPE="airplanepurpur"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Using Airplane-${AIRPLANE_BRANCH} branch"
|
log "Using ${AIRPLANE_TYPE} 1.17.1 (1.18 unsupported - use Paper/Pufferfish/Purpur for newer versions)"
|
||||||
|
|
||||||
export SERVER=airplane-${AIRPLANE_BRANCH}-${AIRPLANE_BUILD}.jar
|
export SERVER=${AIRPLANE_TYPE}-1.17.1.jar
|
||||||
|
|
||||||
log "Removing old Airplane versions ..."
|
log "Removing old Airplane versions ..."
|
||||||
shopt -s nullglob
|
shopt -s nullglob
|
||||||
for f in airplane-*.jar; do
|
for f in airplane*.jar; do
|
||||||
[[ $f != $SERVER ]] && rm $f
|
[[ $f != $SERVER ]] && rm $f
|
||||||
done
|
done
|
||||||
|
|
||||||
if [ ! -f "$SERVER" ] || isTrue "${FORCE_REDOWNLOAD:-false}"; then
|
if [ ! -f "$SERVER" ] || isTrue "${FORCE_REDOWNLOAD:-false}"; then
|
||||||
downloadUrl="https://ci.tivy.ca/job/Airplane-${AIRPLANE_BRANCH}/${AIRPLANE_BUILD}/artifact/launcher-${AIRPLANE_TYPE}.jar"
|
downloadUrl="https://airplane.gg/dl/launcher-${AIRPLANE_TYPE}1.17.1.jar"
|
||||||
log "Downloading Airplane from $downloadUrl ..."
|
log "Downloading Airplane from $downloadUrl ..."
|
||||||
if ! get -o "$SERVER" "$downloadUrl"; then
|
if ! get -o "$SERVER" "$downloadUrl"; then
|
||||||
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
log "ERROR: failed to download from $downloadUrl (status=$?)"
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
set -e
|
set -e
|
||||||
isDebugging && set -x
|
isDebugging && set -x
|
||||||
|
|
||||||
if [ $TYPE = "CURSEFORGE" ]; then
|
if [ "$TYPE" = "CURSEFORGE" ]; then
|
||||||
worldDest=$FTB_DIR/${LEVEL:-world}
|
worldDest=$FTB_DIR/${LEVEL:-world}
|
||||||
else
|
else
|
||||||
worldDest=/data/${LEVEL:-world}
|
worldDest=/data/${LEVEL:-world}
|
||||||
|
@ -19,19 +19,23 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
||||||
"${worldDest}_the_end"
|
"${worldDest}_the_end"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if isURL $WORLD; then
|
if isURL "$WORLD"; then
|
||||||
curl -fsSL "$WORLD" -o /tmp/world.zip
|
log "Downloading world from $WORLD"
|
||||||
zipSrc=/tmp/world.zip
|
if ! get -o /tmp/world.bin "$WORLD"; then
|
||||||
elif [[ "$WORLD" =~ .*\.zip ]]; then
|
log "ERROR: failed to download world from $WORLD"
|
||||||
zipSrc="$WORLD"
|
exit 1
|
||||||
|
fi
|
||||||
|
WORLD=/tmp/world.bin
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$zipSrc" ]]; then
|
if [ -f "$WORLD" ]; then
|
||||||
log "Unzipping world"
|
log "Extracting world"
|
||||||
|
|
||||||
# Stage contents so that the correct subdirectory can be picked off
|
# Stage contents so that the correct subdirectory can be picked off
|
||||||
mkdir -p /tmp/world-data
|
mkdir -p /tmp/world-data
|
||||||
(cd /tmp/world-data && unzip -o -q "$zipSrc")
|
if ! extract "$WORLD" /tmp/world-data; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$FAMILY" = "SPIGOT" ]; then
|
||||||
baseDirs=$(find /tmp/world-data -name "level.dat" -not -path "*_nether*" -not -path "*_the_end*" -exec dirname "{}" \;)
|
baseDirs=$(find /tmp/world-data -name "level.dat" -not -path "*_nether*" -not -path "*_the_end*" -exec dirname "{}" \;)
|
||||||
|
@ -39,6 +43,11 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
||||||
baseDirs=$(find /tmp/world-data -name "level.dat" -exec dirname "{}" \;)
|
baseDirs=$(find /tmp/world-data -name "level.dat" -exec dirname "{}" \;)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if ! [[ $baseDirs ]]; then
|
||||||
|
log "ERROR world content is not valid since level.dat could not be found"
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
count=$(echo "$baseDirs" | wc -l)
|
count=$(echo "$baseDirs" | wc -l)
|
||||||
if [[ $count -gt 1 ]]; then
|
if [[ $count -gt 1 ]]; then
|
||||||
baseDir="$(echo "$baseDirs" | sed -n ${WORLD_INDEX:-1}p)"
|
baseDir="$(echo "$baseDirs" | sed -n ${WORLD_INDEX:-1}p)"
|
||||||
|
@ -56,9 +65,12 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
||||||
[ -d "${baseDir}_nether" ] && rsync --remove-source-files --recursive --delete "${baseDir}_nether/" "${worldDest}_nether"
|
[ -d "${baseDir}_nether" ] && rsync --remove-source-files --recursive --delete "${baseDir}_nether/" "${worldDest}_nether"
|
||||||
[ -d "${baseDir}_the_end" ] && rsync --remove-source-files --recursive --delete "${baseDir}_the_end/" "${worldDest}_the_end"
|
[ -d "${baseDir}_the_end" ] && rsync --remove-source-files --recursive --delete "${baseDir}_the_end/" "${worldDest}_the_end"
|
||||||
fi
|
fi
|
||||||
else
|
elif [ -d "$WORLD" ]; then
|
||||||
log "Cloning world directory from $WORLD ..."
|
log "Cloning world directory from $WORLD ..."
|
||||||
rsync --recursive --delete "${WORLD%/}"/ "$worldDest"
|
rsync --recursive --delete "${WORLD%/}"/ "$worldDest"
|
||||||
|
else
|
||||||
|
log "ERROR: world file/directory $WORLD is missing"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ "$FAMILY" = "SPIGOT" ]; then
|
if [ "$FAMILY" = "SPIGOT" ]; then
|
||||||
|
|
|
@ -188,4 +188,19 @@ function isType() {
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
return 1
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function extract() {
|
||||||
|
src=${1?}
|
||||||
|
destDir=${2?}
|
||||||
|
|
||||||
|
type=$(file -b --mime-type "${src}")
|
||||||
|
if [[ $type == application/zip ]]; then
|
||||||
|
unzip -q -d "${destDir}" "${src}"
|
||||||
|
elif [[ $type == application/x-tar ]]; then
|
||||||
|
tar -C "${destDir}" -xf "${src}"
|
||||||
|
else
|
||||||
|
log "ERROR: unsupported archive type: $type"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
}
|
}
|
1
tests/.gitignore
vendored
Normal file
1
tests/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
data/
|
|
@ -9,6 +9,4 @@ services:
|
||||||
GENERIC_PACKS: https://github.com/itzg/mc-image-helper/releases/download/v1.9.5/mc-image-helper-1.9.5.zip,/packs/testing.zip
|
GENERIC_PACKS: https://github.com/itzg/mc-image-helper/releases/download/v1.9.5/mc-image-helper-1.9.5.zip,/packs/testing.zip
|
||||||
volumes:
|
volumes:
|
||||||
- ./packs:/packs
|
- ./packs:/packs
|
||||||
- data:/data
|
- ./data:/data
|
||||||
volumes:
|
|
||||||
data: {}
|
|
||||||
|
|
1
tests/setuponlytests/generic-packs/verify.sh
Normal file
1
tests/setuponlytests/generic-packs/verify.sh
Normal file
|
@ -0,0 +1 @@
|
||||||
|
mc-image-helper assert fileExists one.txt mods/two.txt
|
|
@ -1,43 +1,50 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
# go to script root directory
|
# go to script root directory
|
||||||
cd "$(dirname "$0")" || exit 1
|
cd "$(dirname "$0")" || exit 1
|
||||||
|
|
||||||
# compose down function for reuse
|
# tests that only run the setup files for things like downloads and configuration.
|
||||||
down() {
|
|
||||||
docker-compose down -v --remove-orphans
|
|
||||||
}
|
|
||||||
|
|
||||||
checkandExitOnFailure(){
|
|
||||||
failed=$1
|
|
||||||
# docker-compose logs outputs messages from the specified container
|
|
||||||
if $failed; then
|
|
||||||
docker-compose logs mc
|
|
||||||
down
|
|
||||||
cd ..
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# tests that only run the setup files for things like downloads and configuration.
|
|
||||||
setupOnlyMinecraftTest(){
|
setupOnlyMinecraftTest(){
|
||||||
folder=$1
|
folder=$1
|
||||||
cd "$folder"
|
cd "$folder"
|
||||||
failed=false
|
result=0
|
||||||
# run the monitor to validate the Minecraft image is healthy
|
|
||||||
docker-compose --log-level ERROR up --quiet-pull --exit-code-from mc 2>/dev/null || failed=true
|
if ! logs=$(docker compose run --quiet-pull mc 2>&1); then
|
||||||
echo "${folder} Result: failed=$failed"
|
echo "${folder} setup FAILED"
|
||||||
checkandExitOnFailure $failed
|
echo ":::::::::::: LOGS ::::::::::::::::
|
||||||
down
|
$logs
|
||||||
|
::::::::::::::::::::::::::::::::::
|
||||||
|
"
|
||||||
|
result=1
|
||||||
|
elif [ -f verify.sh ]; then
|
||||||
|
if ! docker run --rm --entrypoint bash -v "${PWD}/data":/data -v "${PWD}/verify.sh":/verify "${IMAGE_TO_TEST:-itzg/minecraft-server}" /verify; then
|
||||||
|
echo "${folder} verify FAILED"
|
||||||
|
result=1
|
||||||
|
else
|
||||||
|
echo "${folder} verify PASS"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "${folder} PASS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
docker compose down -v --remove-orphans
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
|
return $result
|
||||||
}
|
}
|
||||||
|
|
||||||
# go through each folder in setuponly and test setups
|
# go through each folder in setuponly and test setups
|
||||||
FOLDERS=$(ls)
|
if (( $# > 0 )); then
|
||||||
for folder in $FOLDERS; do
|
for folder in "$@"; do
|
||||||
# If folder is a directory
|
echo "Starting Tests in ${folder}"
|
||||||
if [ -d "$folder" ]; then
|
setupOnlyMinecraftTest "$folder"
|
||||||
echo "Starting Tests on ${folder}"
|
done
|
||||||
setupOnlyMinecraftTest $folder
|
else
|
||||||
fi
|
readarray -t folders < <(find . -maxdepth 2 -mindepth 2 -name docker-compose.yml -printf '%h\n')
|
||||||
done
|
for folder in "${folders[@]}"; do
|
||||||
|
echo "Starting Tests in ${folder}"
|
||||||
|
setupOnlyMinecraftTest "$folder"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
14
tests/setuponlytests/world_from_tgz/docker-compose.yml
Normal file
14
tests/setuponlytests/world_from_tgz/docker-compose.yml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
mc:
|
||||||
|
restart: "no"
|
||||||
|
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
||||||
|
environment:
|
||||||
|
EULA: "TRUE"
|
||||||
|
SETUP_ONLY: "TRUE"
|
||||||
|
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
||||||
|
WORLD: /worlds/world-for-testing.tgz
|
||||||
|
volumes:
|
||||||
|
- ./worlds:/worlds:ro
|
||||||
|
- ./data:/data
|
1
tests/setuponlytests/world_from_tgz/verify.sh
Normal file
1
tests/setuponlytests/world_from_tgz/verify.sh
Normal file
|
@ -0,0 +1 @@
|
||||||
|
mc-image-helper assert fileExists world/level.dat
|
BIN
tests/setuponlytests/world_from_tgz/worlds/world-for-testing.tgz
Normal file
BIN
tests/setuponlytests/world_from_tgz/worlds/world-for-testing.tgz
Normal file
Binary file not shown.
14
tests/setuponlytests/world_from_zip/docker-compose.yml
Normal file
14
tests/setuponlytests/world_from_zip/docker-compose.yml
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
mc:
|
||||||
|
restart: "no"
|
||||||
|
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
||||||
|
environment:
|
||||||
|
EULA: "TRUE"
|
||||||
|
SETUP_ONLY: "TRUE"
|
||||||
|
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
||||||
|
WORLD: /worlds/world-for-testing.zip
|
||||||
|
volumes:
|
||||||
|
- ./worlds:/worlds:ro
|
||||||
|
- ./data:/data
|
1
tests/setuponlytests/world_from_zip/verify.sh
Normal file
1
tests/setuponlytests/world_from_zip/verify.sh
Normal file
|
@ -0,0 +1 @@
|
||||||
|
mc-image-helper assert fileExists world/level.dat
|
BIN
tests/setuponlytests/world_from_zip/worlds/world-for-testing.zip
Normal file
BIN
tests/setuponlytests/world_from_zip/worlds/world-for-testing.zip
Normal file
Binary file not shown.
|
@ -1,18 +1,15 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
|
||||||
# go to script root directory
|
# go to script root directory
|
||||||
cd "$(dirname "$0")" || exit 1
|
cd "$(dirname "$0")" || exit 1
|
||||||
|
|
||||||
# go through top level folders and trigger the tests in the subfolders
|
# go through top level folders and trigger the tests in the subfolders
|
||||||
FOLDERS=$(ls)
|
readarray -t folders < <(find . -maxdepth 2 -mindepth 2 -name test.sh -printf '%h\n')
|
||||||
for folder in $FOLDERS; do
|
for folder in "${folders[@]}"; do
|
||||||
# If folder is a directory
|
cd "$folder"
|
||||||
if [ -d "$folder" ]; then
|
echo "Starting ${folder} Tests"
|
||||||
cd "$folder"
|
bash ./test.sh
|
||||||
if [ -f "./test.sh" ]; then
|
cd ..
|
||||||
echo "Starting ${folder} Tests"
|
|
||||||
sh ./test.sh
|
|
||||||
fi
|
|
||||||
cd ..
|
|
||||||
fi
|
|
||||||
done
|
done
|
||||||
|
|
Loading…
Reference in a new issue