mirror of
https://github.com/itzg/docker-minecraft-server.git
synced 2026-02-17 15:13:55 +00:00
Compare commits
149 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
48414b3e87 | ||
|
|
c2bf2bbcc5 | ||
|
|
68b926f2b1 | ||
|
|
306671ffe7 | ||
|
|
be99d171f5 | ||
|
|
882f3b1cd8 | ||
|
|
13883b20e7 | ||
|
|
c52c3fb04a | ||
|
|
67c8879c6b | ||
|
|
aca8701072 | ||
|
|
d2452ba18f | ||
|
|
7f940626d8 | ||
|
|
7246d836ec | ||
|
|
c01e97ca94 | ||
|
|
b59eefd556 | ||
|
|
ce6ef7d81c | ||
|
|
0a2e6721fb | ||
|
|
5461107b83 | ||
|
|
5356c76dd6 | ||
|
|
bd97029446 | ||
|
|
6537cfb5b5 | ||
|
|
6729ba462e | ||
|
|
4b28d5e472 | ||
|
|
51002c956e | ||
|
|
de62cf8dc7 | ||
|
|
3f2022da40 | ||
|
|
0f7464403c | ||
|
|
c9d5ad7530 | ||
|
|
1be933bd63 | ||
|
|
99b792dec1 | ||
|
|
ee5267cf41 | ||
|
|
0a46d0382e | ||
|
|
cc61497f7e | ||
|
|
2c2cbadd9a | ||
|
|
bfc29d289d | ||
|
|
84a1313261 | ||
|
|
39bcfddf3c | ||
|
|
e6ea8197aa | ||
|
|
0184c095fc | ||
|
|
524a7e21f3 | ||
|
|
f817cae945 | ||
|
|
675d05920b | ||
|
|
106a7132d4 | ||
|
|
0e04a10efa | ||
|
|
0d8df635d6 | ||
|
|
e0dedc194d | ||
|
|
ef32e8ed4c | ||
|
|
489b583ad7 | ||
|
|
8c4dff22fb | ||
|
|
455f31c9d8 | ||
|
|
bac1bfb5dc | ||
|
|
9994c64b51 | ||
|
|
92079fc01f | ||
|
|
98378130f2 | ||
|
|
42856da49d | ||
|
|
83b05609d3 | ||
|
|
21fab1bf41 | ||
|
|
2849359a11 | ||
|
|
cd337f34da | ||
|
|
7a9aa760a2 | ||
|
|
2fd405ec5b | ||
|
|
cbfe9a069c | ||
|
|
2db61fd72f | ||
|
|
6e2073fda5 | ||
|
|
ae48a8710e | ||
|
|
3b54a9fd67 | ||
|
|
a66efb1a4f | ||
|
|
83938d8989 | ||
|
|
8335b81bd8 | ||
|
|
b9c379ec6c | ||
|
|
b9ecbf7497 | ||
|
|
eca00e88bf | ||
|
|
2a3169344d | ||
|
|
8ec4f0d244 | ||
|
|
d45250ebf2 | ||
|
|
03110aef99 | ||
|
|
f344e7e823 | ||
|
|
c7fcaf1ec6 | ||
|
|
9d700041a7 | ||
|
|
4af4ed69a5 | ||
|
|
d215c14996 | ||
|
|
4716254b5b | ||
|
|
3c2b7f0718 | ||
|
|
0fd43f5a05 | ||
|
|
fae6479453 | ||
|
|
d9df5bf773 | ||
|
|
13d7248c38 | ||
|
|
3c54954057 | ||
|
|
84823a559d | ||
|
|
d543df768b | ||
|
|
74968389a2 | ||
|
|
1701718515 | ||
|
|
ed6937654c | ||
|
|
73eb6e2e45 | ||
|
|
8b982472a4 | ||
|
|
ab406727d6 | ||
|
|
5fc74a45f7 | ||
|
|
17ecd48cd8 | ||
|
|
4732ce27a6 | ||
|
|
6e10768e7f | ||
|
|
bb47a3705d | ||
|
|
c3e1e92547 | ||
|
|
9ddd768f44 | ||
|
|
62e1ff8ffa | ||
|
|
5f95d135f5 | ||
|
|
8e32d26b0f | ||
|
|
573f064970 | ||
|
|
0bc6f4075b | ||
|
|
4ebcc0ef48 | ||
|
|
57720cf394 | ||
|
|
64b2783f19 | ||
|
|
1dbdd7628a | ||
|
|
4252ec710f | ||
|
|
11d455c284 | ||
|
|
08bc419dc8 | ||
|
|
67c23017d0 | ||
|
|
6e1ba3667c | ||
|
|
0c2f8b903b | ||
|
|
b9335d9cd6 | ||
|
|
0d92092b90 | ||
|
|
e653a41b3f | ||
|
|
82e63c54c4 | ||
|
|
f9c573f598 | ||
|
|
bf8b9cf20d | ||
|
|
0dd5a412d9 | ||
|
|
b389561091 | ||
|
|
6ee055761d | ||
|
|
49f9ff645e | ||
|
|
004cbdb9f7 | ||
|
|
45856a1a81 | ||
|
|
1e615e76e8 | ||
|
|
1c85a685de | ||
|
|
7cd207f40b | ||
|
|
140a8aa90c | ||
|
|
76dcff9d18 | ||
|
|
a9a86d249b | ||
|
|
595760d301 | ||
|
|
6d3f194ce3 | ||
|
|
21c1620f0c | ||
|
|
e78e5af96d | ||
|
|
0fb9700fc7 | ||
|
|
18925ef32c | ||
|
|
f06b990f8a | ||
|
|
75844ae81a | ||
|
|
6bb2323c46 | ||
|
|
7814ca21b5 | ||
|
|
b8806629ec | ||
|
|
4a7f838a0f | ||
|
|
2d07dee4df |
33
.github/workflows/build-multiarch.yml
vendored
33
.github/workflows/build-multiarch.yml
vendored
@@ -13,14 +13,13 @@ on:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: github.repository == 'itzg/docker-minecraft-server'
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
variant:
|
||||
- java17
|
||||
- java17-openj9
|
||||
- java17-alpine
|
||||
- java8
|
||||
- java8-multiarch
|
||||
- java8-openj9
|
||||
- java11
|
||||
@@ -28,54 +27,47 @@ jobs:
|
||||
include:
|
||||
- variant: java17
|
||||
baseImage: eclipse-temurin:17
|
||||
tagPrefix: java17-
|
||||
platforms: linux/amd64,linux/arm/v7,linux/arm64
|
||||
mcVersion: LATEST
|
||||
- variant: java17-openj9
|
||||
baseImage: ibm-semeru-runtimes:open-17-jdk
|
||||
tagPrefix: java17-openj9-
|
||||
platforms: linux/amd64,linux/arm64
|
||||
mcVersion: LATEST
|
||||
- variant: java17-alpine
|
||||
baseImage: eclipse-temurin:17-jdk-alpine
|
||||
platforms: linux/amd64
|
||||
mcVersion: LATEST
|
||||
- variant: java8
|
||||
baseImage: openjdk:8-jdk-alpine3.8
|
||||
platforms: linux/amd64
|
||||
mcVersion: 1.12.2
|
||||
- variant: java8-multiarch
|
||||
baseImage: eclipse-temurin:8-jdk
|
||||
tagPrefix: java8-
|
||||
platforms: linux/amd64,linux/arm64
|
||||
mcVersion: 1.12.2
|
||||
- variant: java8-openj9
|
||||
baseImage: ibm-semeru-runtimes:open-8-jdk
|
||||
tagPrefix: java8-openj9-
|
||||
platforms: linux/amd64,linux/arm64
|
||||
mcVersion: 1.12.2
|
||||
- variant: java11
|
||||
baseImage: adoptopenjdk:11-jdk-hotspot
|
||||
tagPrefix: java11-
|
||||
platforms: linux/amd64,linux/arm/v7,linux/arm64
|
||||
mcVersion: 1.16.5
|
||||
- variant: java11-openj9
|
||||
baseImage: ibm-semeru-runtimes:open-11-jdk
|
||||
tagPrefix: java11-openj9-
|
||||
platforms: linux/amd64,linux/arm64
|
||||
mcVersion: 1.16.5
|
||||
env:
|
||||
IMAGE_TO_TEST: ${{ github.repository_owner }}/minecraft-server:test-${{ matrix.variant }}-${{ github.run_id }}
|
||||
IMAGE_TO_TEST: itzg/minecraft-server:test-${{ matrix.variant }}-${{ github.run_id }}
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2.4.0
|
||||
with:
|
||||
# for build-files step
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Docker meta
|
||||
id: meta
|
||||
uses: docker/metadata-action@v3
|
||||
with:
|
||||
# NOTE for forks: if your Docker Hub organization doesn't match your Github repo's,
|
||||
# then the use of ${{ github.repository_owner }} will need to be replaced.
|
||||
images: |
|
||||
${{ github.repository_owner }}/minecraft-server
|
||||
itzg/minecraft-server
|
||||
tags: |
|
||||
type=ref,event=tag,enable=${{ matrix.variant == 'java17' }}
|
||||
type=ref,event=tag,suffix=-${{ matrix.variant }}
|
||||
@@ -97,11 +89,6 @@ jobs:
|
||||
username: ${{ secrets.DOCKER_USER }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Calculate build files revision
|
||||
id: build-files
|
||||
run: |
|
||||
echo "::set-output name=REV::$(git log -1 --format=%H build)"
|
||||
|
||||
- name: Build for test
|
||||
uses: docker/build-push-action@v2.9.0
|
||||
with:
|
||||
@@ -114,7 +101,6 @@ jobs:
|
||||
push: false
|
||||
build-args: |
|
||||
BASE_IMAGE=${{ matrix.baseImage }}
|
||||
BUILD_FILES_REV=${{ steps.build-files.outputs.REV }}
|
||||
cache-from: type=gha,scope=${{ matrix.variant }}
|
||||
# no cache-to to avoid cross-cache update from next build step
|
||||
|
||||
@@ -136,6 +122,5 @@ jobs:
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
build-args: |
|
||||
BASE_IMAGE=${{ matrix.baseImage }}
|
||||
BUILD_FILES_REV=${{ steps.build-files-rev.outputs.REV }}
|
||||
cache-from: type=gha,scope=${{ matrix.variant }}
|
||||
cache-to: type=gha,mode=max,scope=${{ matrix.variant }}
|
||||
|
||||
12
.github/workflows/issue-label.yml
vendored
12
.github/workflows/issue-label.yml
vendored
@@ -2,7 +2,7 @@ name: Issue labels
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [labeled, reopened, closed, deleted]
|
||||
types: [labeled]
|
||||
|
||||
env:
|
||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_ISSUES_WEBHOOK }}
|
||||
@@ -12,7 +12,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- name: notify on label
|
||||
- name: notify
|
||||
if: >
|
||||
github.event.label.name == 'enhancement'
|
||||
|| github.event.label.name == 'bug'
|
||||
@@ -23,11 +23,3 @@ jobs:
|
||||
uses: Ilshidur/action-discord@master
|
||||
with:
|
||||
args: "[${{ github.event.issue.title }} (#${{ github.event.issue.number }})](<${{ github.event.issue.html_url }}>) added `${{ github.event.label.name }}` label"
|
||||
- name: notify on action change
|
||||
if: >
|
||||
github.event.action == 'closed'
|
||||
|| github.event.action == 'reopened'
|
||||
|| github.event.action == 'deleted'
|
||||
uses: Ilshidur/action-discord@master
|
||||
with:
|
||||
args: "[${{ github.event.issue.title }} (#${{ github.event.issue.number }})](<${{ github.event.issue.html_url }}>) has been `${{ github.event.action }}` by `${{ github.event.sender.login }}`"
|
||||
|
||||
88
.github/workflows/main.yml
vendored
Normal file
88
.github/workflows/main.yml
vendored
Normal file
@@ -0,0 +1,88 @@
|
||||
name: Build and Publish
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- java8
|
||||
- test/alpine/*
|
||||
tags:
|
||||
- "[0-9]+.[0-9]+.[0-9]+-java8"
|
||||
|
||||
env:
|
||||
IMAGE_TO_TEST: itzg/minecraft-server:test-${{ github.repository_owner }}-${{ github.run_id }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2.4.0
|
||||
|
||||
- name: Prepare
|
||||
id: prep
|
||||
run: |
|
||||
DOCKER_IMAGE=itzg/minecraft-server
|
||||
VERSION=edge
|
||||
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||
VERSION=${GITHUB_REF#refs/tags/}
|
||||
fi
|
||||
if [[ $GITHUB_REF == refs/heads/* ]]; then
|
||||
VERSION=${GITHUB_REF#refs/heads/}
|
||||
if [[ $VERSION == master ]]; then
|
||||
VERSION=latest
|
||||
fi
|
||||
fi
|
||||
TAGS="${DOCKER_IMAGE}:${VERSION//\//-}"
|
||||
echo ::set-output name=tags::${TAGS}
|
||||
echo ::set-output name=version::${VERSION//\//-}
|
||||
|
||||
- name: Setup Docker Buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
|
||||
- name: Login to DockerHub
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USER }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- name: Build for test
|
||||
uses: docker/build-push-action@v2.9.0
|
||||
if: github.ref_name == 'java8'
|
||||
with:
|
||||
context: .
|
||||
platforms: linux/amd64
|
||||
tags: ${{ env.IMAGE_TO_TEST }}
|
||||
# ensure latest base image is used
|
||||
pull: true
|
||||
load: true
|
||||
push: false
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
- name: Run tests
|
||||
if: github.ref_name == 'java8'
|
||||
run: |
|
||||
tests/test.sh
|
||||
env:
|
||||
MINECRAFT_VERSION: 1.12.2
|
||||
|
||||
- name: Build and push
|
||||
id: docker_build
|
||||
uses: docker/build-push-action@v2.9.0
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile
|
||||
# ensure latest base image is used
|
||||
pull: true
|
||||
# publish
|
||||
push: true
|
||||
# tags determined by prep step
|
||||
tags: ${{ steps.prep.outputs.tags }}
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
labels: |
|
||||
org.opencontainers.image.documentation=https://github.com/itzg/docker-minecraft-server
|
||||
org.opencontainers.image.version=${{ steps.prep.outputs.version }}
|
||||
org.opencontainers.image.source=https://github.com/itzg/docker-minecraft-server
|
||||
org.opencontainers.image.revision=${{ github.sha }}
|
||||
org.opencontainers.image.authors=Geoff Bourne <itzgeoff@gmail.com>
|
||||
@@ -15,25 +15,21 @@ Individual scripts can be iteratively developed, debugged, and tested using the
|
||||
|
||||
First, build a baseline of the image to include the packages needed by existing or new scripts:
|
||||
|
||||
PowerShell: (Example of building and testing ForgeAPI)
|
||||
PowerShell:
|
||||
```powershell
|
||||
$env:MODS_FORGEAPI_KEY='$2a$...'
|
||||
$env:FOLDER_TO_TEST="forgeapimods_projectids"
|
||||
$env:IMAGE_TO_TEST="mc-dev"
|
||||
docker build -t $env:IMAGE_TO_TEST .
|
||||
pushd "tests/setuponlytests/$env:FOLDER_TO_TEST/"
|
||||
pushd tests/setuponlytests/vanillatweaks_file/
|
||||
docker-compose run mc
|
||||
docker-compose down --remove-orphans
|
||||
popd
|
||||
```
|
||||
|
||||
Bash: (Example of building and testing ForgeAPI)
|
||||
Bash:
|
||||
```bash
|
||||
export MODS_FORGEAPI_KEY='$2a$...'
|
||||
export FOLDER_TO_TEST="forgeapimods_file"
|
||||
export IMAGE_TO_TEST="mc-dev"
|
||||
export IMAGE_TO_TEST=mc-dev
|
||||
docker build -t $IMAGE_TO_TEST .
|
||||
pushd tests/setuponlytests/$FOLDER_TO_TEST/
|
||||
pushd tests/setuponlytests/vanillatweaks_file/
|
||||
docker-compose run mc
|
||||
docker-compose down --remove-orphans
|
||||
popd
|
||||
@@ -83,6 +79,31 @@ Note the port that was selected by http-server and pass the build arguments, suc
|
||||
|
||||
Now the image can be built like normal and it will install mc-image-helper from the locally built copy.
|
||||
|
||||
## Multi-base-image variants
|
||||
|
||||
Several base-image variants are maintained in order to offer choices in JDK provider and version. The variants are maintained in their respective branches:
|
||||
- openj9
|
||||
- openj9-nightly
|
||||
- adopt11
|
||||
- adopt13
|
||||
- multiarch
|
||||
|
||||
The [docker-versions-create.sh](docker-versions-create.sh) script is configured with the branches to maintain and is used to merge changes from the master branch into the mulit-base variant branches. The script also manages git tagging the master branch along with the merged branches. So a typical use of the script would be like:
|
||||
|
||||
```shell script
|
||||
./docker-versions-create.sh -s -t 1.2.0
|
||||
```
|
||||
|
||||
> Most often the major version will be bumped unless a bug or hotfix needs to be published in which case the patch version should be incremented.
|
||||
|
||||
> The build and publishing of those branches and their tags is currently performed within Docker Hub.
|
||||
|
||||
## multiarch support
|
||||
|
||||
The [multiarch branch](https://github.com/itzg/docker-minecraft-server/tree/multiarch) supports running the image on amd64, arm64, and armv7 (aka RaspberryPi). Unlike the mainline branches, it is based on Ubuntu 18.04 since the openjdk package provided by Ubuntu includes full JIT support on all of the processor types.
|
||||
|
||||
The multiarch images are built and published by [a Github action](https://github.com/itzg/docker-minecraft-server/actions?query=workflow%3A%22Build+and+publish+multiarch%22), which [is configured in that branch](https://github.com/itzg/docker-minecraft-server/blob/multiarch/.github/workflows/build-multiarch.yml).
|
||||
|
||||
## Generating release notes
|
||||
|
||||
The following git command can be used to provide the bulk of release notes content:
|
||||
@@ -90,3 +111,25 @@ The following git command can be used to provide the bulk of release notes conte
|
||||
```shell script
|
||||
git log --invert-grep --grep "^ci:" --grep "^misc:" --grep "^docs:" --pretty="* %s" 1.1.0..1.2.0
|
||||
```
|
||||
## Tracking changes from master without content
|
||||
|
||||
The following script uses the [ours](https://git-scm.com/docs/merge-strategies#Documentation/merge-strategies.txt-ours) merging strategy to track the history from master into the other branches without actually bringing the changes over. It is useful when a change is specific to master only, such as bumping the base Java version for the `latest` image tag.
|
||||
|
||||
```shell
|
||||
branches=(
|
||||
java8
|
||||
java8-multiarch
|
||||
java8-openj9
|
||||
java11
|
||||
java11-openj9
|
||||
java16
|
||||
java16-openj9
|
||||
java17
|
||||
)
|
||||
|
||||
for b in "${branches[@]}"; do
|
||||
git checkout "$b"
|
||||
git merge -s ours -m "Track latest from master" master
|
||||
git push origin
|
||||
done
|
||||
```
|
||||
|
||||
46
Dockerfile
46
Dockerfile
@@ -1,16 +1,32 @@
|
||||
# syntax = docker/dockerfile:1.3
|
||||
|
||||
ARG BASE_IMAGE=eclipse-temurin:17-jdk
|
||||
ARG BASE_IMAGE=openjdk:8-jdk-alpine
|
||||
FROM ${BASE_IMAGE}
|
||||
|
||||
# CI system should set this to a hash or git revision of the build directory and it's contents to
|
||||
# ensure consistent cache updates.
|
||||
ARG BUILD_FILES_REV=1
|
||||
RUN --mount=target=/build,source=build \
|
||||
REV=${BUILD_FILES_REV} /build/run.sh install-packages
|
||||
RUN apk add --no-cache -U \
|
||||
openssl \
|
||||
imagemagick \
|
||||
file \
|
||||
lsof \
|
||||
su-exec \
|
||||
# GNU compatible 'find'
|
||||
findutils \
|
||||
shadow \
|
||||
bash \
|
||||
curl iputils \
|
||||
git \
|
||||
jq \
|
||||
mysql-client \
|
||||
tzdata \
|
||||
rsync \
|
||||
nano \
|
||||
sudo \
|
||||
knock \
|
||||
ttf-dejavu \
|
||||
zstd
|
||||
|
||||
RUN --mount=target=/build,source=build \
|
||||
REV=${BUILD_FILES_REV} /build/run.sh setup-user
|
||||
RUN addgroup -g 1000 minecraft \
|
||||
&& adduser -Ss /bin/false -u 1000 -G minecraft -h /home/minecraft minecraft \
|
||||
&& mkdir -m 777 /data \
|
||||
&& chown minecraft:minecraft /data /home/minecraft
|
||||
|
||||
COPY --chmod=644 files/sudoers* /etc/sudoers.d
|
||||
|
||||
@@ -18,9 +34,9 @@ EXPOSE 25565 25575
|
||||
|
||||
# hook into docker BuildKit --platform support
|
||||
# see https://docs.docker.com/engine/reference/builder/#automatic-platform-args-in-the-global-scope
|
||||
ARG TARGETOS
|
||||
ARG TARGETARCH
|
||||
ARG TARGETVARIANT
|
||||
ARG TARGETOS=linux
|
||||
ARG TARGETARCH=amd64
|
||||
ARG TARGETVARIANT=""
|
||||
|
||||
ARG EASY_ADD_VER=0.7.1
|
||||
ADD https://github.com/itzg/easy-add/releases/download/${EASY_ADD_VER}/easy-add_${TARGETOS}_${TARGETARCH}${TARGETVARIANT} /usr/bin/easy-add
|
||||
@@ -46,7 +62,7 @@ RUN easy-add --var os=${TARGETOS} --var arch=${TARGETARCH}${TARGETVARIANT} \
|
||||
--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
|
||||
|
||||
ARG MC_HELPER_VERSION=1.16.6
|
||||
ARG MC_HELPER_VERSION=1.16.5
|
||||
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 \
|
||||
| tar -C /usr/share -zxf - \
|
||||
@@ -58,7 +74,7 @@ WORKDIR /data
|
||||
STOPSIGNAL SIGTERM
|
||||
|
||||
ENV UID=1000 GID=1000 \
|
||||
MEMORY="1G" \
|
||||
JVM_XX_OPTS="-XX:+UseG1GC" MEMORY="1G" \
|
||||
TYPE=VANILLA VERSION=LATEST \
|
||||
ENABLE_RCON=true RCON_PORT=25575 RCON_PASSWORD=minecraft \
|
||||
ENABLE_AUTOPAUSE=false AUTOPAUSE_TIMEOUT_EST=3600 AUTOPAUSE_TIMEOUT_KN=120 AUTOPAUSE_TIMEOUT_INIT=600 \
|
||||
|
||||
29
README.md
29
README.md
@@ -142,7 +142,7 @@ By default, the container will download the latest version of the "vanilla" [Min
|
||||
* [Running on RaspberryPi](#running-on-raspberrypi)
|
||||
* [Contributing](#contributing)
|
||||
|
||||
<!-- Added by: runner, at: Sat Feb 12 02:37:53 UTC 2022 -->
|
||||
<!-- Added by: runner, at: Sun Feb 6 18:45:39 UTC 2022 -->
|
||||
|
||||
<!--te-->
|
||||
|
||||
@@ -289,7 +289,7 @@ When using the image `itzg:/minecraft-server` without a tag, the `latest` image
|
||||
|
||||
| Tag name | Java version | Linux | JVM Type | Architecture |
|
||||
| -------------- | -------------|--------|----------|-------------------|
|
||||
| latest | 17 | Debian | Hotspot | amd64,arm64,armv7 |
|
||||
| latest | 16 | Debian | Hotspot | amd64,arm64,armv7 |
|
||||
| java8 | 8 | Alpine | Hotspot | amd64 |
|
||||
| java8-multiarch | 8 | Debian | Hotspot | amd64,arm64,armv7 |
|
||||
| java8-openj9 | 8 | Debian | OpenJ9 | amd64 |
|
||||
@@ -419,7 +419,7 @@ In both of the cases above, there is no need for the `VERSION` or `FORGEVERSION`
|
||||
|
||||
### Running a Fabric Server
|
||||
|
||||
Enable [Fabric server](https://fabricmc.net/) mode by adding a `-e TYPE=FABRIC` to your command-line.
|
||||
Enable [Fabric server](https://fabricmc.net/) mode by adding a `-e TYPE=FABRIC` to your command-line. By default, the container will install the latest [fabric-loader](https://fabricmc.net/wiki/documentation:fabric_loader) using the latest [fabric-installer](https://fabricmc.net/use/), against the minecraft server version you have defined with `VERSION` (defaulting to the latest vanilla release of the game).
|
||||
|
||||
```
|
||||
docker run -d -v /path/on/host:/data \
|
||||
@@ -427,22 +427,19 @@ docker run -d -v /path/on/host:/data \
|
||||
-p 25565:25565 -e EULA=TRUE --name mc itzg/minecraft-server
|
||||
```
|
||||
|
||||
By default, the container will install the latest [fabric server launcher](https://fabricmc.net/use/server/), using the latest [fabric-loader](https://fabricmc.net/wiki/documentation:fabric_loader) against the minecraft version you have defined with `VERSION` (defaulting to the latest vanilla release of the game).
|
||||
See the [Working with mods and plugins](#working-with-mods-and-plugins) section to set up Fabric mods and configuration.
|
||||
|
||||
A specific loader or launcher version other than the latest can be requested using `FABRIC_LOADER_VERSION` and `FABRIC_LAUNCHER_VERSION` respectively, such as:
|
||||
A specific loader version other than the latest can be requested using `FABRIC_LOADER_VERSION`, such as:
|
||||
|
||||
```
|
||||
docker run -d -v /path/on/host:/data ... \
|
||||
-e TYPE=FABRIC \
|
||||
-e FABRIC_LAUNCHER_VERSION=0.10.2 \
|
||||
-e FABRIC_LOADER_VERSION=0.13.1
|
||||
-e FABRIC_LOADER_VERSION=0.12.8
|
||||
```
|
||||
|
||||
> If you wish to use an alternative launcher you can:
|
||||
> * Provide the path to a custom launcher jar available to the container with `FABRIC_LAUNCHER`, relative to `/data` (such as `-e FABRIC_LAUNCHER=fabric-server-custom.jar`)
|
||||
> * Provide the URL to a custom launcher jar with `FABRIC_LAUNCHER_URL` (such as `-e FABRIC_LAUNCHER_URL=http://HOST/fabric-server-custom.jar`)
|
||||
|
||||
See the [Working with mods and plugins](#working-with-mods-and-plugins) section to set up Fabric mods and configuration.
|
||||
If you wish to use an alternative installer you can:
|
||||
* Specify an alternative version using `FABRIC_INSTALLER_VERSION` (such as `-e FABRIC_INSTALLER_VERSION=0.10.2`)
|
||||
* Provide the path to a custom installer jar available to the container with `FABRIC_INSTALLER`, relative to `/data` (such as `-e FABRIC_INSTALLER=fabric-installer-0.5.0.32.jar`)
|
||||
* Provide the URL to a custom installer jar with `FABRIC_INSTALLER_URL` (such as `-e FABRIC_INSTALLER_URL=http://HOST/fabric-installer-0.5.0.32.jar`)
|
||||
|
||||
### Running a Bukkit/Spigot server
|
||||
|
||||
@@ -756,11 +753,6 @@ You may also download or copy over individual mods using the `MODS` environment
|
||||
|
||||
This is more complicated because you will be pulling/using the latest mod for the release of your game. To get started make sure you have a [CursedForge API Key](https://docs.curseforge.com/#getting-started). Then use the environmental parameters in your docker build.
|
||||
|
||||
Please be aware of the following when using these options for your mods:
|
||||
* Mod Release types: Release, Beta, and Alpha.
|
||||
* Mod dependencies: Required and Optional
|
||||
* Mod family: Fabric, Forge, and Bukkit.
|
||||
|
||||
Parameters to use the ForgeAPI:
|
||||
|
||||
* `MODS_FORGEAPI_KEY` - Required
|
||||
@@ -768,7 +760,6 @@ Parameters to use the ForgeAPI:
|
||||
* `MODS_FORGEAPI_PROJECTIDS` - Required or use MODS_FORGEAPI_FILE
|
||||
* `MODS_FORGEAPI_RELEASES` - Default is release, Options: [Release|Beta|Alpha]
|
||||
* `MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES` - Default is False, attempts to download required mods (releaseType Release) defined in Forge.
|
||||
* `MODS_FORGEAPI_IGNORE_GAMETYPE` - Default is False, Allows for filtering mods on family type: FORGE, FABRIC, and BUKKIT. (Does not filter for Vanilla or custom)
|
||||
* `REMOVE_OLD_FORGEAPI_MODS` - Default is False
|
||||
* `REMOVE_OLD_DATAPACKS_DEPTH` - Default is 1
|
||||
* `REMOVE_OLD_DATAPACKS_INCLUDE` - Default is *.jar
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
apk add --no-cache -U \
|
||||
openssl \
|
||||
imagemagick \
|
||||
file \
|
||||
lsof \
|
||||
su-exec \
|
||||
coreutils \
|
||||
findutils \
|
||||
shadow \
|
||||
bash \
|
||||
curl iputils \
|
||||
git \
|
||||
jq \
|
||||
mysql-client \
|
||||
tzdata \
|
||||
rsync \
|
||||
nano \
|
||||
sudo \
|
||||
knock \
|
||||
ttf-dejavu \
|
||||
tar \
|
||||
zstd
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
addgroup -g 1000 minecraft
|
||||
adduser -Ss /bin/false -u 1000 -G minecraft -h /home/minecraft minecraft
|
||||
@@ -1,7 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
distro=$(cat /etc/os-release | grep -E "^ID=" | cut -d= -f2 | sed -e 's/"//g')
|
||||
|
||||
"$(dirname "$0")/${distro}/$1".sh
|
||||
@@ -1,28 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
apt-get update
|
||||
|
||||
DEBIAN_FRONTEND=noninteractive \
|
||||
apt-get install -y \
|
||||
imagemagick \
|
||||
file \
|
||||
gosu \
|
||||
sudo \
|
||||
net-tools \
|
||||
iputils-ping \
|
||||
curl \
|
||||
git \
|
||||
jq \
|
||||
dos2unix \
|
||||
mysql-client \
|
||||
tzdata \
|
||||
rsync \
|
||||
nano \
|
||||
unzip \
|
||||
zstd \
|
||||
knockd \
|
||||
ttf-dejavu
|
||||
|
||||
apt-get clean
|
||||
@@ -1,6 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
addgroup --gid 1000 minecraft
|
||||
adduser --system --shell /bin/false --uid 1000 --ingroup minecraft --home /data minecraft
|
||||
151
docker-versions-create.sh
Executable file
151
docker-versions-create.sh
Executable file
@@ -0,0 +1,151 @@
|
||||
#!/bin/bash
|
||||
#set -x
|
||||
# Use this variable to indicate a list of branches that docker hub is watching
|
||||
branches_list=(
|
||||
'java8'
|
||||
)
|
||||
|
||||
function TrapExit {
|
||||
echo "Checking out back in master"
|
||||
git checkout master
|
||||
}
|
||||
|
||||
batchMode=false
|
||||
|
||||
while getopts "hbt:s" arg
|
||||
do
|
||||
case $arg in
|
||||
b)
|
||||
batchMode=true
|
||||
;;
|
||||
t)
|
||||
tag=${OPTARG}
|
||||
;;
|
||||
s)
|
||||
tagArgs="-s -m 'Signed during docker-versions-create"
|
||||
;;
|
||||
h)
|
||||
echo "
|
||||
Usage $0 [options]
|
||||
|
||||
Options:
|
||||
-b enable batch mode, which avoids interactive prompts and causes script to fail immediately
|
||||
when any merge fails
|
||||
-t TAG tag and push the current revision on master with the given tag
|
||||
and apply respective tags to each branch
|
||||
-s enable signed tags
|
||||
-h display this help and exit
|
||||
"
|
||||
exit
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported arg $arg"
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
${batchMode} && echo "Using batch mode"
|
||||
|
||||
trap TrapExit EXIT SIGTERM
|
||||
|
||||
test -d ./.git || { echo ".git folder was not found. Please start this script from root directory of the project!";
|
||||
exit 1; }
|
||||
|
||||
# Making sure we are in master
|
||||
git checkout master
|
||||
git pull --all || { echo "Can't pull the repo!"; \
|
||||
exit 1; }
|
||||
if [[ $tag ]]; then
|
||||
git tag $tag
|
||||
git push origin $tag
|
||||
fi
|
||||
|
||||
git_branches=$(git branch -a)
|
||||
|
||||
for branch in "${branches_list[@]}"; do
|
||||
if [[ "$git_branches" != *"$branch"* ]]; then
|
||||
echo "Can't update $branch because I can't find it in the list of branches."
|
||||
exit 1
|
||||
else
|
||||
echo "Branch $branch found. Working with it."
|
||||
git checkout "$branch" || { echo "Can't checkout into the branch. Don't know the cause."; \
|
||||
exit 1; }
|
||||
proceed='False'
|
||||
while [[ "$proceed" == "False" ]]; do
|
||||
# Ensure local branch is aligned with remote since docker-versions-create may have been run elsewhere
|
||||
git pull
|
||||
|
||||
if git merge -m 'Auto-merging via docker-versions-create' master; then
|
||||
proceed="True"
|
||||
echo "Branch $branch updated to current master successfully"
|
||||
# pushing changes to remote for this branch
|
||||
git commit -m "Auto merge branch with master" -a
|
||||
# push may fail if remote doesn't have this branch yet. In this case - sending branch
|
||||
git push || git push -u origin "$branch" || { echo "Can't push changes to the origin."; exit 1; }
|
||||
if [[ $tag ]]; then
|
||||
git tag "$tag-$branch"
|
||||
git push origin "$tag-$branch"
|
||||
fi
|
||||
elif ${batchMode}; then
|
||||
status=$?
|
||||
echo "Git merge failed in batch mode"
|
||||
exit ${status}
|
||||
# and trap exit gets us back to master
|
||||
else
|
||||
cat<<EOL
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
Master merge in the branch $branch encountered an error!
|
||||
You may try to fix the error and merge again. (Commit changes)
|
||||
Or skip this branch merge completely.
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
EOL
|
||||
printf "Should we try again? (y):"
|
||||
read -r answer
|
||||
if [[ "$answer" == '' ]] || [[ "$answer" == 'y' ]] || [[ "$answer" == 'Y' ]]; then
|
||||
# If you use non-local editor or files are changed in repo
|
||||
cat <<EOL
|
||||
|
||||
The following commands may encounter an error!
|
||||
This is completely fine if the changes were made locally and remote branch doesn't know about them.
|
||||
|
||||
EOL
|
||||
# Updating branch from remote before trying again
|
||||
git checkout master
|
||||
git fetch --all
|
||||
git pull -a
|
||||
git checkout "$branch"
|
||||
continue
|
||||
else
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
if [[ $tag ]]; then
|
||||
if [ -f "$HOME/.github.env" ]; then
|
||||
source "$HOME/.github.env"
|
||||
if [[ $GITHUB_TOKEN ]]
|
||||
then
|
||||
auth=(-u ":$GITHUB_TOKEN")
|
||||
base=https://api.github.com
|
||||
: "${owner:=itzg}"
|
||||
: "${repo:=docker-minecraft-server}"
|
||||
read -r -d '' releaseBody << EOF
|
||||
{
|
||||
"tag_name": "$tag",
|
||||
"name": "$tag",
|
||||
"generate_release_notes": true
|
||||
}
|
||||
EOF
|
||||
if ! curl "${auth[@]}" -H "Accept: application/vnd.github.v3+json" \
|
||||
"${base}/repos/${owner}/${repo}/releases" -d "$releaseBody"; then
|
||||
echo "ERROR failed to create github release $tag"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@@ -5,15 +5,15 @@ current_uptime() {
|
||||
}
|
||||
|
||||
java_running() {
|
||||
[[ $( ps -ax -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]]
|
||||
[[ $( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]]
|
||||
}
|
||||
|
||||
java_process_exists() {
|
||||
[[ -n "$(ps -ax -o comm | grep 'java')" ]]
|
||||
[[ -n "$(ps -a -o comm | grep 'java')" ]]
|
||||
}
|
||||
|
||||
rcon_client_exists() {
|
||||
[[ -n "$(ps -ax -o comm | grep 'rcon-cli')" ]]
|
||||
[[ -n "$(ps -a -o comm | grep 'rcon-cli')" ]]
|
||||
}
|
||||
|
||||
mc_server_listening() {
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
[unpauseMCServer-server]
|
||||
sequence = 25565
|
||||
seq_timeout = 1
|
||||
command = /usr/sbin/gosu minecraft:minecraft /autopause/resume.sh
|
||||
command = /sbin/su-exec minecraft:minecraft /autopause/resume.sh
|
||||
tcpflags = syn
|
||||
[unpauseMCServer-rcon]
|
||||
sequence = 25575
|
||||
seq_timeout = 1
|
||||
command = /usr/sbin/gosu minecraft:minecraft /autopause/resume.sh
|
||||
command = /sbin/su-exec minecraft:minecraft /autopause/resume.sh
|
||||
tcpflags = syn
|
||||
[unpauseMCServer-bedrock]
|
||||
sequence = 19132:udp
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
. /start-utils
|
||||
|
||||
if [[ $( ps -ax -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]] ; then
|
||||
if [[ $( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^S.*$ ]] ; then
|
||||
# save world
|
||||
rcon-cli save-all >/dev/null
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
. /start-utils
|
||||
|
||||
if [[ $( ps -ax -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^T.*$ ]] ; then
|
||||
if [[ $( ps -a -o stat,comm | grep 'java' | awk '{ print $1 }') =~ ^T.*$ ]] ; then
|
||||
logAutopauseAction "Knocked, resuming Java process"
|
||||
pkill -CONT java
|
||||
fi
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
# shellcheck source=start-utils
|
||||
. "${SCRIPTS:-/}start-utils"
|
||||
. ${SCRIPTS:-/}start-utils
|
||||
|
||||
umask 0002
|
||||
chmod g+w /data
|
||||
|
||||
if ! isTrue "${SKIP_SUDO:-false}" && [ "$(id -u)" = 0 ]; then
|
||||
if ! isTrue "${SKIP_SUDO:-false}" && [ $(id -u) = 0 ]; then
|
||||
runAsUser=minecraft
|
||||
runAsGroup=minecraft
|
||||
|
||||
@@ -25,14 +24,14 @@ if ! isTrue "${SKIP_SUDO:-false}" && [ "$(id -u)" = 0 ]; then
|
||||
if [[ $GID != 0 ]]; then
|
||||
if [[ $GID != $(id -g minecraft) ]]; then
|
||||
log "Changing gid of minecraft to $GID"
|
||||
groupmod -o -g "$GID" minecraft
|
||||
groupmod -o -g $GID minecraft
|
||||
fi
|
||||
else
|
||||
runAsGroup=root
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ $(stat -c "%u" /data) != "$UID" ]]; then
|
||||
if [[ $(stat -c "%u" /data) != $UID ]]; then
|
||||
log "Changing ownership of /data to $UID ..."
|
||||
chown -R ${runAsUser}:${runAsGroup} /data
|
||||
fi
|
||||
@@ -41,12 +40,7 @@ if ! isTrue "${SKIP_SUDO:-false}" && [ "$(id -u)" = 0 ]; then
|
||||
echo 'hosts: files dns' > /etc/nsswitch.conf
|
||||
fi
|
||||
|
||||
distro=$(getDistro)
|
||||
if [[ $distro == alpine ]]; then
|
||||
exec su-exec ${runAsUser}:${runAsGroup} "${SCRIPTS:-/}start-configuration" "$@"
|
||||
else
|
||||
exec gosu ${runAsUser}:${runAsGroup} "${SCRIPTS:-/}start-configuration" "$@"
|
||||
fi
|
||||
exec su-exec ${runAsUser}:${runAsGroup} ${SCRIPTS:-/}start-configuration "$@"
|
||||
else
|
||||
exec "${SCRIPTS:-/}start-configuration" "$@"
|
||||
exec ${SCRIPTS:-/}start-configuration "$@"
|
||||
fi
|
||||
|
||||
@@ -136,8 +136,9 @@ case "${TYPE^^}" in
|
||||
;;
|
||||
|
||||
FTBA)
|
||||
evaluateJavaCompatibilityForForge
|
||||
exec "${SCRIPTS:-/}start-deployFTBA" "$@"
|
||||
log "ERROR: TYPE=FTBA is not supported with this image variant."
|
||||
log " Use itzg/minecraft-server:java8-multiarch instead."
|
||||
exit 1
|
||||
;;
|
||||
|
||||
FTB|CURSEFORGE)
|
||||
@@ -194,12 +195,6 @@ case "${TYPE^^}" in
|
||||
;;
|
||||
|
||||
CRUCIBLE)
|
||||
log "**********************************************************************"
|
||||
log "WARNING: The image tag itzg/minecraft-server:java8 is recommended"
|
||||
log " since some mods require Java 8"
|
||||
log " Exception traces reporting ClassCastException: class jdk.internal.loader.ClassLoaders\$AppClassLoader"
|
||||
log " can be fixed with java8"
|
||||
log "**********************************************************************"
|
||||
exec "${SCRIPTS:-/}start-deployCrucible" "$@"
|
||||
;;
|
||||
|
||||
|
||||
@@ -111,6 +111,8 @@ if ! isTrue "${USE_MODPACK_START_SCRIPT:-true}"; then
|
||||
exit 2
|
||||
fi
|
||||
|
||||
forgeInstallerJar=$(ls -t "${forgeInstallerJar}" | head -1)
|
||||
|
||||
log "Installing forge server"
|
||||
dirOfInstaller=$(dirname "${forgeInstallerJar}")
|
||||
(cd "${dirOfInstaller}"; java -jar "$(basename "${forgeInstallerJar}")" --installServer)
|
||||
|
||||
@@ -47,6 +47,7 @@ if [ ! -d "$librariesDir" ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
mkdir "$librariesDir"
|
||||
if ! unzip /tmp/libraries.zip -d "$librariesDir"; then
|
||||
log "ERROR: failed to unzip Crucible libraries"
|
||||
exit 1
|
||||
|
||||
@@ -31,7 +31,6 @@ else
|
||||
|
||||
fi
|
||||
|
||||
# Allow for overriding Family on custom for testing.
|
||||
export FAMILY="${FAMILY:-HYBRID}"
|
||||
export FAMILY=HYBRID
|
||||
|
||||
exec ${SCRIPTS:-/}start-setupWorld $@
|
||||
|
||||
@@ -6,45 +6,76 @@ set -eu
|
||||
|
||||
requireVar VANILLA_VERSION
|
||||
export TYPE=FABRIC
|
||||
: "${FABRIC_LAUNCHER_VERSION:=${FABRIC_INSTALLER_VERSION:-LATEST}}"
|
||||
: "${FABRIC_LAUNCHER:=}"
|
||||
: "${FABRIC_LAUNCHER_URL:=}"
|
||||
: "${FABRIC_INSTALLER_VERSION:=${FABRICVERSION:-LATEST}}"
|
||||
: "${FABRIC_INSTALLER:=}"
|
||||
: "${FABRIC_INSTALLER_URL:=}"
|
||||
: "${FABRIC_LOADER_VERSION:=LATEST}"
|
||||
|
||||
isDebugging && set -x
|
||||
|
||||
# Custom fabric jar
|
||||
if [[ $FABRIC_LAUNCHER ]]; then
|
||||
export SERVER=${FABRIC_LAUNCHER}
|
||||
# Custom fabric jar url
|
||||
elif [[ $FABRIC_LAUNCHER_URL ]]; then
|
||||
export SERVER=fabric-server-$(echo -n "$FABRIC_LAUNCHER_URL" | mc-image-helper hash)
|
||||
# Official fabric launcher
|
||||
else
|
||||
if [[ ${FABRIC_LAUNCHER_VERSION^^} = LATEST ]]; then
|
||||
log "Checking Fabric Launcher version information."
|
||||
FABRIC_LAUNCHER_VERSION=$(maven-metadata-release https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml)
|
||||
fi
|
||||
if [[ ${FABRIC_LOADER_VERSION^^} = LATEST ]]; then
|
||||
log "Checking Fabric Loader version information."
|
||||
FABRIC_LOADER_VERSION=$(maven-metadata-release https://maven.fabricmc.net/net/fabricmc/fabric-loader/maven-metadata.xml)
|
||||
fi
|
||||
export SERVER=fabric-server-mc.${VANILLA_VERSION}-loader.${FABRIC_LOADER_VERSION}-launcher.${FABRIC_LAUNCHER_VERSION}.jar
|
||||
export FABRIC_LAUNCHER_URL="https://meta.fabricmc.net/v2/versions/loader/${VANILLA_VERSION}/${FABRIC_LOADER_VERSION}/${FABRIC_LAUNCHER_VERSION}/server/jar"
|
||||
log "Checking Fabric version information."
|
||||
if [[ $FABRIC_INSTALLER ]]; then
|
||||
FABRIC_INSTALLER_VERSION=$(echo -n "$FABRIC_INSTALLER" | mc-image-helper hash)
|
||||
elif [[ $FABRIC_INSTALLER_URL ]]; then
|
||||
FABRIC_INSTALLER_VERSION=$(echo -n "$FABRIC_INSTALLER_URL" | mc-image-helper hash)
|
||||
elif [[ ${FABRIC_INSTALLER_VERSION^^} = LATEST ]]; then
|
||||
FABRIC_INSTALLER_VERSION=$(maven-metadata-release https://maven.fabricmc.net/net/fabricmc/fabric-installer/maven-metadata.xml)
|
||||
fi
|
||||
|
||||
if [[ ! -e ${SERVER} && ! -z ${FABRIC_LAUNCHER_URL} ]]; then
|
||||
log "Downloading $FABRIC_LAUNCHER_URL ..."
|
||||
if ! get -o "$SERVER" "$FABRIC_LAUNCHER_URL"; then
|
||||
log "Failed to download from given location $FABRIC_LAUNCHER_URL"
|
||||
export SERVER=fabric-server-${VANILLA_VERSION}-${FABRIC_INSTALLER_VERSION}.jar
|
||||
|
||||
if [ ! \( -e ${SERVER} -a -e "server-${VANILLA_VERSION}.jar" \) ]; then
|
||||
|
||||
if [[ -z $FABRIC_INSTALLER && -z $FABRIC_INSTALLER_URL ]]; then
|
||||
FABRIC_INSTALLER="fabric-installer-${FABRIC_INSTALLER_VERSION}.jar"
|
||||
FABRIC_INSTALLER_URL="https://maven.fabricmc.net/net/fabricmc/fabric-installer/${FABRIC_INSTALLER_VERSION}/fabric-installer-${FABRIC_INSTALLER_VERSION}.jar"
|
||||
elif [[ -z $FABRIC_INSTALLER ]]; then
|
||||
FABRIC_INSTALLER="fabric-installer.jar"
|
||||
elif [[ ! -e $FABRIC_INSTALLER ]]; then
|
||||
log "ERROR: the given Fabric installer doesn't exist : $FABRIC_INSTALLER"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
if [[ -z $FABRIC_LOADER_VERSION || ${FABRIC_LOADER_VERSION^^} = LATEST ]]; then
|
||||
log "Checking Fabric Loader version information."
|
||||
|
||||
FABRIC_LOADER_VERSION=$(maven-metadata-release https://maven.fabricmc.net/net/fabricmc/fabric-loader/maven-metadata.xml)
|
||||
fi
|
||||
|
||||
if [[ ! -e $FABRIC_INSTALLER ]]; then
|
||||
log "Downloading $FABRIC_INSTALLER_URL ..."
|
||||
if ! get -o "$FABRIC_INSTALLER" "$FABRIC_INSTALLER_URL"; then
|
||||
log "Failed to download from given location $FABRIC_INSTALLER_URL"
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
|
||||
log "Installing Fabric ${VANILLA_VERSION} using $FABRIC_INSTALLER with loader version $FABRIC_LOADER_VERSION"
|
||||
|
||||
tries=3
|
||||
set +e
|
||||
while ((--tries >= 0)); do
|
||||
java -jar $FABRIC_INSTALLER server \
|
||||
-mcversion $VANILLA_VERSION \
|
||||
-loader $FABRIC_LOADER_VERSION \
|
||||
-downloadMinecraft \
|
||||
-dir /data
|
||||
if [[ $? == 0 ]]; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
set -e
|
||||
if (($tries < 0)); then
|
||||
log "Fabric failed to install after several tries." >&2
|
||||
exit 10
|
||||
fi
|
||||
|
||||
mv server.jar "server-${VANILLA_VERSION}.jar"
|
||||
mv fabric-server-launch.jar "${SERVER}"
|
||||
fi
|
||||
|
||||
if [[ ! -e ${SERVER} ]]; then
|
||||
log "$SERVER does not exist, cannot launch server!"
|
||||
exit 1
|
||||
fi
|
||||
# Specify which server jar to run
|
||||
echo "serverJar=server-${VANILLA_VERSION}.jar" > fabric-server-launcher.properties
|
||||
|
||||
export FAMILY=FABRIC
|
||||
exec "${SCRIPTS:-/}start-setupWorld" "$@"
|
||||
|
||||
@@ -8,7 +8,6 @@ set -e -o pipefail
|
||||
: "${MODS_FORGEAPI_FILE:=}"
|
||||
: "${MODS_FORGEAPI_RELEASES:=RELEASE}"
|
||||
: "${MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES:=false}"
|
||||
: "${MODS_FORGEAPI_IGNORE_GAMETYPE:=false}"
|
||||
: "${REMOVE_OLD_MODS_DEPTH:=1} "
|
||||
: "${REMOVE_OLD_MODS_INCLUDE:=*.jar}"
|
||||
|
||||
@@ -16,7 +15,6 @@ set -e -o pipefail
|
||||
FORGEAPI_BASE_URL=${FORGEAPI_BASE_URL:-https://api.curseforge.com/v1}
|
||||
RELEASE_NUMBER_FILTER=1
|
||||
MINECRAFT_GAME_ID=432
|
||||
FILTER_BY_FAMILY=false
|
||||
out_dir=/data/mods
|
||||
|
||||
# shellcheck source=start-utils
|
||||
@@ -24,17 +22,10 @@ out_dir=/data/mods
|
||||
isDebugging && set -x
|
||||
|
||||
# Remove old mods/plugins
|
||||
if isTrue "${REMOVE_OLD_FORGEAPI_MODS}" && [ -z "${MODS_FORGEAPI_KEY}" ]; then
|
||||
if isTrue "${REMOVE_OLD_FORGEAPI_MODS}" && [ -z "${MODS_FORGEAPI_FILE}" ]; then
|
||||
removeOldMods /data/mods
|
||||
fi
|
||||
|
||||
# Family filter is on by default for Forge, Fabric, and Bukkit
|
||||
updateFamilyFilter(){
|
||||
if isFamily "FORGE" "FABRIC" "BUKKIT"; then
|
||||
FILTER_BY_FAMILY=true
|
||||
fi
|
||||
}
|
||||
|
||||
ensureModKey(){
|
||||
if [ -z "$MODS_FORGEAPI_KEY" ]; then
|
||||
log "ERROR: MODS_FORGEAPI_KEY REQUIRED to Connect to FORGE API, you supplied: ${MODS_FORGEAPI_KEY}"
|
||||
@@ -106,27 +97,18 @@ modFileByProjectID(){
|
||||
# Checking for a individual release type input, if not use global
|
||||
if [ $project_id_release_type ]; then
|
||||
updateReleaseNumber $project_id_release_type
|
||||
unset project_id_release_type
|
||||
else
|
||||
updateReleaseNumber $MODS_FORGEAPI_RELEASES
|
||||
fi
|
||||
|
||||
# grabs the highest ID of the releaseTypes selected.
|
||||
# Default is 1 for Release, Beta is 2, and Alpha is 3. Using less than we can validate highest release.
|
||||
if [ $project_id_file_name ]; then
|
||||
# Looks for file by name
|
||||
current_project_file=$(jq -n "$project_files" | jq --arg FILE_NAME "$project_id_file_name" -jc '
|
||||
.data | map(select(.fileName<=($FILE_NAME))) | .[0] // empty')
|
||||
elif $( ! isTrue "$MODS_FORGEAPI_IGNORE_GAMETYPE" ) && $FILTER_BY_FAMILY ; then
|
||||
# Looks for file by version and server type in lowercase
|
||||
current_project_file=$(jq -n "$project_files" | jq --arg RELEASE_FILTER "$RELEASE_NUMBER_FILTER" --arg GAME_TYPE ${FAMILY,,} -jc '
|
||||
.data | sort_by(.id) | reverse | map(select(.gameVersions[] | ascii_downcase | contains ($GAME_TYPE))) | map(select(.releaseType<=($RELEASE_FILTER|tonumber))) | .[0] // empty')
|
||||
.data | map(select(.fileName<=($FILE_NAME))) | .[0]')
|
||||
else
|
||||
# Looks for file by version only.
|
||||
current_project_file=$(jq -n "$project_files" | jq --arg RELEASE_FILTER "$RELEASE_NUMBER_FILTER" -jc '
|
||||
.data | sort_by(.id) | reverse | map(select(.releaseType<=($RELEASE_FILTER|tonumber))) | .[0] // empty')
|
||||
.data | sort_by(.id) | reverse | map(select(.releaseType<=($RELEASE_FILTER|tonumber))) | .[0]')
|
||||
fi
|
||||
|
||||
# Logic to grab the latest release over the entire pagination
|
||||
if [ ! "$PROJECT_FILE" ]; then
|
||||
PROJECT_FILE=$current_project_file
|
||||
@@ -146,10 +128,6 @@ modFileByProjectID(){
|
||||
# Increment start index to new set.
|
||||
index=$(($index + $pageSize))
|
||||
done
|
||||
if [ ! "$PROJECT_FILE" ]; then
|
||||
log "ERROR: Unable to retrieve any files for ${project_id}, Release Type: ${RELEASE_NUMBER_FILTER}, FAMILY_TYPE: ${FAMILY,,}"
|
||||
exit 2
|
||||
fi
|
||||
}
|
||||
|
||||
downloadModPackfromModFile() {
|
||||
@@ -165,7 +143,7 @@ downloadModPackfromModFile() {
|
||||
# trys to make the output directory incase it doesnt exist.
|
||||
mkdir -p "$out_dir"
|
||||
echo "Downloading ${download_url}"
|
||||
if ! get --skip-up-to-date -o "${out_dir}/${file_name}" $download_url ; then
|
||||
if ! get -o "${out_dir}/${file_name}" $download_url ; then
|
||||
log "ERROR: failed to download from ${download_url}"
|
||||
exit 2
|
||||
fi
|
||||
@@ -208,18 +186,17 @@ downloadDependencies(){
|
||||
# Use forge api json file to filter and download the correct mods
|
||||
if [ "$MODS_FORGEAPI_FILE" ] && [ -z "$MODS_FORGEAPI_PROJECTIDS" ]; then
|
||||
ensureModKey
|
||||
updateFamilyFilter
|
||||
if [ ! -f "$MODS_FORGEAPI_FILE" ]; then
|
||||
log "ERROR: given MODS_FORGEAPI_FILE file does not exist"
|
||||
exit 2
|
||||
fi
|
||||
|
||||
# Needs loop here to look up release types befor calling download.
|
||||
jq -c '.[]?' $MODS_FORGEAPI_FILE | while read current_project; do
|
||||
jq -n "$required_dependencies" | jq -c '.[]?' | while read current_project; do
|
||||
# Per stack overflow we can use //empty to return empty string that works with -z
|
||||
project_id=$(jq -n "$current_project" | jq -r '.projectId // empty' )
|
||||
current_release_type=$(jq -n "$current_project" | jq -r '.releaseType // empty' )
|
||||
current_file_name=$(jq -n "$current_project" | jq -r '.fileName // empty' )
|
||||
project_id=$(jq -n "$current_project" | jq -jc '.projectId // empty' )
|
||||
current_release_type=$(jq -n "$current_project" | jq -jc '.releaseType // empty' )
|
||||
current_file_name=$(jq -n "$current_project" | jq -jc '.fileName // empty' )
|
||||
|
||||
modFileByProjectID $project_id $current_release_type $current_file_name
|
||||
downloadModPackfromModFile
|
||||
@@ -232,7 +209,6 @@ fi
|
||||
# Use only project ids and global release data.
|
||||
if [ "$MODS_FORGEAPI_PROJECTIDS" ] && [ -z "$MODS_FORGEAPI_FILE" ]; then
|
||||
ensureModKey
|
||||
updateFamilyFilter
|
||||
for project_id in ${MODS_FORGEAPI_PROJECTIDS//,/ }; do
|
||||
modFileByProjectID $project_id
|
||||
downloadModPackfromModFile
|
||||
|
||||
@@ -34,7 +34,6 @@ if [[ "$WORLD" ]] && ( isTrue "${FORCE_WORLD_COPY}" || [ ! -d "$worldDest" ] );
|
||||
# Stage contents so that the correct subdirectory can be picked off
|
||||
mkdir -p /tmp/world-data
|
||||
if ! extract "$WORLD" /tmp/world-data; then
|
||||
log "ERROR extracting world from $WORLD"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@ function log() {
|
||||
shopt -u -o xtrace
|
||||
|
||||
if isDebugging || isTrue "${LOG_TIMESTAMP:-false}"; then
|
||||
ts=" $(date --rfc-3339=seconds)"
|
||||
ts=" $(date --rfc-2822)"
|
||||
else
|
||||
ts=
|
||||
fi
|
||||
@@ -190,13 +190,13 @@ function get() {
|
||||
|
||||
function isFamily() {
|
||||
for f in "${@}"; do
|
||||
if [[ ${FAMILY^^} == "${f^^}" ]]; then
|
||||
if [[ $FAMILY == "$f" ]]; then
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
function isType() {
|
||||
for t in "${@}"; do
|
||||
# shellcheck disable=SC2153
|
||||
@@ -237,15 +237,11 @@ function extract() {
|
||||
esac
|
||||
}
|
||||
|
||||
function getDistro() {
|
||||
cat /etc/os-release | grep -E "^ID=" | cut -d= -f2 | sed -e 's/"//g'
|
||||
}
|
||||
|
||||
function checkSum() {
|
||||
local sum_file=${1?}
|
||||
|
||||
# Get distro
|
||||
distro=$(getDistro)
|
||||
distro=$(cat /etc/os-release | grep -E "^ID=" | cut -d= -f2 | sed -e 's/"//g')
|
||||
|
||||
if [ "${distro}" == "debian" ] && sha1sum -c "${sum_file}" --status 2> /dev/null; then
|
||||
return 0
|
||||
|
||||
@@ -7,20 +7,12 @@ services:
|
||||
environment:
|
||||
EULA: "TRUE"
|
||||
SETUP_ONLY: "TRUE"
|
||||
# Using custom to bypass Fabric setup
|
||||
TYPE: CUSTOM
|
||||
# Using family to test FORGEAPI Family filter.
|
||||
FAMILY: FABRIC
|
||||
CUSTOM_SERVER: /servers/fake.jar
|
||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
||||
MODS_FORGEAPI_FILE: /config/forgeapi_mods.json
|
||||
# Key is defined in .github/workflows/pr.yml and ci.yml
|
||||
# This should be coming from github secrets.
|
||||
MODS_FORGEAPI_KEY: ${MODS_FORGEAPI_KEY}
|
||||
REMOVE_OLD_FORGEAPI_MODS: "TRUE"
|
||||
# Validates that Fabric API gets download as a dependency.
|
||||
MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES: "TRUE"
|
||||
MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES: "FALSE"
|
||||
volumes:
|
||||
- ./forgeapi_mods.json:/config/forgeapi_mods.json:ro
|
||||
- ./data:/data
|
||||
- ./fake.jar:/servers/fake.jar
|
||||
@@ -1,11 +1,17 @@
|
||||
[{
|
||||
"name": "On A Stick [FABRIC]",
|
||||
"projectId": "550544",
|
||||
"name": "fabric api",
|
||||
"projectId": "306612",
|
||||
"releaseType": "release"
|
||||
},
|
||||
{
|
||||
"name": "Fabric Voice Mod",
|
||||
"projectId": "416089",
|
||||
"releaseType": "beta"
|
||||
},
|
||||
{
|
||||
"name": "Biomes o plenty",
|
||||
"projectId": "220318",
|
||||
"fileName": "BiomesOPlenty-1.18.1-15.0.0.100-universal.jar",
|
||||
"releaseType": "release"
|
||||
}
|
||||
]
|
||||
]
|
||||
@@ -1,5 +0,0 @@
|
||||
# Validates specific beta call out for specific mod:
|
||||
mc-image-helper assert fileExists "/data/mods/voicechat-fabric*"
|
||||
mc-image-helper assert fileExists "/data/mods/onastick-fabric*"
|
||||
# Dependent of on a stick:
|
||||
mc-image-helper assert fileExists "/data/mods/fabric-api*"
|
||||
@@ -1,29 +0,0 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
mc:
|
||||
restart: "no"
|
||||
image: ${IMAGE_TO_TEST:-itzg/minecraft-server}
|
||||
environment:
|
||||
EULA: "TRUE"
|
||||
SETUP_ONLY: "TRUE"
|
||||
# Using custom to bypass Fabric setup
|
||||
TYPE: CUSTOM
|
||||
# Using family to test FORGEAPI Family filter.
|
||||
FAMILY: FABRIC
|
||||
CUSTOM_SERVER: /servers/fake.jar
|
||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
||||
# Validate Skip Gametype Filter:
|
||||
MODS_FORGEAPI_IGNORE_GAMETYPE: "TRUE"
|
||||
# Validates that Biomes does not download terrablender
|
||||
# Using default false for testing:
|
||||
# MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES: "FALSE"
|
||||
# Contains mix of Forge and Fabric mods
|
||||
MODS_FORGEAPI_PROJECTIDS: 306612,416089,220318
|
||||
# Allows for Beta releases of 416089 the Fabric Voice Mod
|
||||
MODS_FORGEAPI_RELEASES: BETA
|
||||
MODS_FORGEAPI_KEY: ${MODS_FORGEAPI_KEY}
|
||||
REMOVE_OLD_FORGEAPI_MODS: "FALSE"
|
||||
volumes:
|
||||
- ./data:/data
|
||||
- ./fake.jar:/servers/fake.jar
|
||||
@@ -1 +0,0 @@
|
||||
[[ $MODS_FORGEAPI_KEY ]] || exit 1
|
||||
@@ -1,5 +0,0 @@
|
||||
mc-image-helper assert fileExists "/data/mods/BiomesOPlenty*"
|
||||
# testing dependencies don't get downloaded when download dependencies is set to false.
|
||||
! mc-image-helper assert fileExists "/data/mods/TerraBlender*"
|
||||
mc-image-helper assert fileExists "/data/mods/voicechat-fabric*"
|
||||
mc-image-helper assert fileExists "/data/mods/fabric-api*"
|
||||
@@ -7,20 +7,10 @@ services:
|
||||
environment:
|
||||
EULA: "TRUE"
|
||||
SETUP_ONLY: "TRUE"
|
||||
# Using custom to bypass Fabric setup
|
||||
TYPE: CUSTOM
|
||||
# Validate Skip Gametype Filter for vanilla
|
||||
# - Currently we do not support filtering on vanilla.
|
||||
FAMILY: VANILLA
|
||||
CUSTOM_SERVER: /servers/fake.jar
|
||||
VERSION: ${MINECRAFT_VERSION:-LATEST}
|
||||
MODS_FORGEAPI_DOWNLOAD_DEPENDENCIES: "TRUE"
|
||||
# Contains mix of Forge and Fabric mods
|
||||
MODS_FORGEAPI_PROJECTIDS: 306612,416089,220318
|
||||
# Allows for Beta releases of 416089 the Fabric Voice Mod
|
||||
MODS_FORGEAPI_RELEASES: BETA
|
||||
MODS_FORGEAPI_KEY: ${MODS_FORGEAPI_KEY}
|
||||
REMOVE_OLD_FORGEAPI_MODS: "TRUE"
|
||||
volumes:
|
||||
- ./data:/data
|
||||
- ./fake.jar:/servers/fake.jar
|
||||
@@ -1,4 +0,0 @@
|
||||
mc-image-helper assert fileExists "/data/mods/BiomesOPlenty*"
|
||||
mc-image-helper assert fileExists "/data/mods/TerraBlender*"
|
||||
mc-image-helper assert fileExists "/data/mods/voicechat-fabric*"
|
||||
mc-image-helper assert fileExists "/data/mods/fabric-api*"
|
||||
@@ -40,7 +40,7 @@ $logs
|
||||
echo "${folder} PASS"
|
||||
fi
|
||||
|
||||
docker-compose down -v --remove-orphans > /dev/null
|
||||
docker-compose down -v --remove-orphans
|
||||
cd ..
|
||||
|
||||
return $result
|
||||
|
||||
Reference in New Issue
Block a user