diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e44947a..4d273ea 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,20 +14,21 @@ variables: DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" OPENGL_CONTAINER_CURRENT_IMAGE: $CI_REGISTRY_IMAGE/opengl:$CI_COMMIT_REF_SLUG + OPENGL_CONTAINER_GITSHA_SHORT_IMAGE: $CI_REGISTRY_IMAGE/opengl:$CI_COMMIT_SHORT_SHA + OPENGL_CONTAINER_GITSHA_IMAGE: $CI_REGISTRY_IMAGE/opengl:$CI_COMMIT_SHA OPENGL_CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE/opengl:latest + CLIENT_CONTAINER_CURRENT_IMAGE: $CI_REGISTRY_IMAGE/client:$CI_COMMIT_REF_SLUG + CLIENT_CONTAINER_GITSHA_SHORT_IMAGE: $CI_REGISTRY_IMAGE/client:$CI_COMMIT_SHORT_SHA + CLIENT_CONTAINER_GITSHA_IMAGE: $CI_REGISTRY_IMAGE/client:$CI_COMMIT_SHA + CLIENT_CONTAINER_RELEASE_IMAGE: $CI_REGISTRY_IMAGE/client:latest + build_opengl: stage: build script: - cd opengl - - docker build --pull -t $OPENGL_CONTAINER_CURRENT_IMAGE . + - docker buildx --pull -t $OPENGL_CONTAINER_CURRENT_IMAGE -t $OPENGL_CONTAINER_GITSHA_IMAGE -t $OPENGL_CONTAINER_GITSHA_SHORT_IMAGE . - docker push $OPENGL_CONTAINER_CURRENT_IMAGE - rules: - - changes: - - opengl/**/* - - if: $CI_PIPELINE_SOURCE == "web" - when: always - release-image_opengl: stage: release @@ -38,8 +39,31 @@ release-image_opengl: - docker push $OPENGL_CONTAINER_RELEASE_IMAGE rules: - if: $CI_COMMIT_BRANCH == "main" - - changes: - - opengl/**/* + - if: $CI_PIPELINE_SOURCE == "web" + when: always + +build_client: + stage: build + needs: + - build_opengl + script: + - cd client + - docker buildx build --pull --build-arg "OPENGL_BASE_IMAGE=$OPENGL_CONTAINER_GITSHA_IMAGE" -t $CLIENT_CONTAINER_CURRENT_IMAGE -t $CLIENT_CONTAINER_GITSHA_IMAGE -t $CLIENT_CONTAINER_GITSHA_SHORT_IMAGE . + - docker push $CLIENT_CONTAINER_CURRENT_IMAGE + - docker push $CLIENT_CONTAINER_GITSHA_IMAGE + - docker push $CLIENT_CONTAINER_GITSHA_SHORT_IMAGE + +release-image_client: + stage: release + needs: + - release-image_opengl + script: + - cd client + - docker pull $CLIENT_CONTAINER_CURRENT_IMAGE + - docker tag $CLIENT_CONTAINER_CURRENT_IMAGE $CLIENT_CONTAINER_RELEASE_IMAGE + - docker push $CLIENT_CONTAINER_RELEASE_IMAGE + rules: + - if: $CI_COMMIT_BRANCH == "main" - if: $CI_PIPELINE_SOURCE == "web" when: always diff --git a/client/Dockerfile b/client/Dockerfile new file mode 100644 index 0000000..91bf547 --- /dev/null +++ b/client/Dockerfile @@ -0,0 +1,91 @@ +FROM alpine:latest AS compile + +ARG MINETEST_VERSION=5.9.1 +ARG MINETEST_GAME_VERSION=5.8.0 +ARG LUAJIT_VERSION=v2.1 +RUN apk add --no-cache git build-base cmake curl-dev zlib-dev zstd-dev \ + sqlite-dev postgresql-dev hiredis-dev leveldb-dev jpeg-dev libpng-dev \ + glfw-dev gmp-dev jsoncpp-dev libxi-dev libintl ninja ca-certificates \ + freetype-dev +WORKDIR /usr/src/ +RUN git clone --recursive https://github.com/libspatialindex/libspatialindex && \ + cd libspatialindex && \ + cmake -B build \ + -DCMAKE_INSTALL_PREFIX=/usr/local && \ + cmake --build build && \ + cmake --install build && \ + cd /usr/src/ && \ + git clone --recursive https://luajit.org/git/luajit.git -b ${LUAJIT_VERSION} && \ + cd luajit && \ + make amalg && make install && \ + cd /usr/src/ && \ + git clone --depth=1 --single-branch --branch ${MINETEST_VERSION} -c advice.detachedHead=false https://github.com/minetest/minetest.git minetest && \ + rm -fr minetest/.git && \ + git clone --depth=1 -b ${MINETEST_GAME_VERSION} https://github.com/minetest/minetest_game.git minetest/games/minetest_game && \ + rm -fr minetest/games/minetest_game/.git +WORKDIR /usr/src/minetest +RUN cmake -B build \ + -DCMAKE_INSTALL_PREFIX=/usr/local \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SERVER=FALSE \ + -DBUILD_CLIENT=TRUE \ + -DBUILD_UNITTESTS=FALSE \ + -DENABLE_SOUND=OFF \ + -DENABLE_POSTGRESQL=OFF \ + -DENABLE_REDIS=OFF \ + -DENABLE_PROMETHEUS=FALSE \ + -DVERSION_EXTRA=docker_client \ + -GNinja && \ + cmake --build build && \ + cmake --install build + +ARG OPENGL_BASE_IMAGE +FROM ${OPENGL_BASE_IMAGE} + +COPY --from=compile /usr/local/share/minetest /usr/local/share/minetest +COPY --from=compile /usr/local/bin/minetest /usr/local/bin/minetest +COPY --from=compile /usr/local/bin /usr/local/bin +COPY --from=compile /usr/local/lib /usr/local/lib +COPY ./entrypoint.sh /usr/local/bin/entrypoint.sh + +RUN apk add --no-cache sqlite-libs curl gmp libstdc++ libgcc luajit irrlicht x11vnc bash xdotool leveldb jsoncpp libxi jpeg libpng bind-tools jsoncpp && \ + adduser -D minetest --uid 30000 -h /var/lib/minetest && \ + mkdir /var/lib/minetest/.minetest && \ + chown -R minetest:minetest /var/lib/minetest && \ + chmod 755 /usr/local/bin/entrypoint.sh + + +WORKDIR /var/lib/minetest + +COPY --chown=minetest:minetest <&1 & +xvfb_pid=$! + +# prevent spikes if you spawn many containers simultaneously +sleep $((2 + $RANDOM % 6)) + + +if [ "${PLAYERNAME,,}" == "random" ] +then + PLAYERNAME=$(tr -dc A-Za-z0-9