The engine now runs on a plain Web Worker (no SDL, no PROXY_TO_PTHREAD: in a pthread Emscripten proxies every filesystem syscall to the main browser thread, where synchronous XHR - and thus FS.createLazyFile - is forbidden). A page/worker pair transfers an OffscreenCanvas and forwards DOM input; assets load lazily from an embedded manifest, so entering a map fetches only that map and its tiles. Presentation: ra3.webgpu (WebGPU via Emscripten's emdawnwebgpu port, WGSL shaders, the default on wasm) and ra3.wasmgl (WebGL2, GLSL ES). The legacy SDL ra3.webgl backend is removed.
334 lines
14 KiB
YAML
334 lines
14 KiB
YAML
stages:
|
|
- image
|
|
- build
|
|
|
|
variables:
|
|
DOCKER_HOST: tcp://docker:2375
|
|
DOCKER_TLS_CERTDIR: ""
|
|
DOCKER_BUILDKIT: "1"
|
|
# apt mirror used inside both images (override per pipeline if needed)
|
|
APT_MIRROR: "http://mirrors.tuna.tsinghua.edu.cn/ubuntu"
|
|
# Images are shared through Harbor (plain HTTP), never as artifacts.
|
|
HARBOR_HOST: "192.168.1.11:9090"
|
|
HARBOR_PROJECT: "openra3"
|
|
IMAGE: "$HARBOR_HOST/$HARBOR_PROJECT/$CI_PROJECT_NAME"
|
|
|
|
# dind: pull docker.io through the intranet Harbor proxy (plain HTTP ->
|
|
# --insecure-registry) and enable the containerd snapshotter so the *docker*
|
|
# driver can export the registry BuildKit cache (the classic overlay2 driver
|
|
# rejects it). Anchor is an array, so `services: *dind` stays an array.
|
|
.dind: &dind
|
|
- name: docker:dind
|
|
command:
|
|
- --registry-mirror=http://192.168.1.11:9090/dockerhub
|
|
- --insecure-registry=192.168.1.11:9090
|
|
- --feature=containerd-snapshotter=true
|
|
|
|
# Retry helper for transient network failures (login / build / push / pull).
|
|
.retry: &retry
|
|
- |
|
|
retry() {
|
|
n=0
|
|
until "$@"; do
|
|
n=$((n + 1))
|
|
[ "$n" -ge 5 ] && { echo "failed after $n tries: $*" >&2; return 1; }
|
|
echo "attempt $n failed, retrying: $*" >&2
|
|
sleep 15
|
|
done
|
|
}
|
|
|
|
# --- build the two isolated toolchain images and push them to Harbor ----------
|
|
linux_image:
|
|
stage: image
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- |
|
|
retry docker build \
|
|
--cache-from type=registry,ref=$IMAGE:cache-linux,insecure=true \
|
|
--cache-to type=registry,ref=$IMAGE:cache-linux,mode=max,insecure=true \
|
|
--build-arg APT_MIRROR=$APT_MIRROR \
|
|
--target dev \
|
|
-t $IMAGE:$CI_COMMIT_SHORT_SHA-linux \
|
|
-f Dockerfile .
|
|
- retry docker push $IMAGE:$CI_COMMIT_SHORT_SHA-linux
|
|
|
|
windows_image:
|
|
stage: image
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- |
|
|
retry docker build \
|
|
--cache-from type=registry,ref=$IMAGE:cache-windows,insecure=true \
|
|
--cache-to type=registry,ref=$IMAGE:cache-windows,mode=max,insecure=true \
|
|
--build-arg APT_MIRROR=$APT_MIRROR \
|
|
--target dev \
|
|
-t $IMAGE:$CI_COMMIT_SHORT_SHA-windows \
|
|
-f Dockerfile.win .
|
|
- retry docker push $IMAGE:$CI_COMMIT_SHORT_SHA-windows
|
|
|
|
# --- build and test each target ----------------------------------------------
|
|
build_linux:
|
|
stage: build
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
needs:
|
|
- linux_image
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- retry docker pull $IMAGE:$CI_COMMIT_SHORT_SHA-linux
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-linux cmake -S . -B build/linux -G Ninja -DCMAKE_BUILD_TYPE=Release -DOPENRA3_DISTRO_TAG=ubuntu26.04
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-linux cmake --build build/linux -j
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-linux ctest --test-dir build/linux --output-on-failure
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-linux bash -c "cd build/linux && cpack -G DEB"
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-linux bash -c "mkdir -p artifacts/linux && cp build/linux/bin/openra3 build/linux/*.deb artifacts/linux/"
|
|
artifacts:
|
|
name: "$CI_PROJECT_NAME-linux-$CI_COMMIT_SHORT_SHA"
|
|
paths:
|
|
- artifacts/linux/
|
|
expire_in: 7 days
|
|
|
|
build_windows:
|
|
stage: build
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
needs:
|
|
- windows_image
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- retry docker pull $IMAGE:$CI_COMMIT_SHORT_SHA-windows
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-windows
|
|
cmake -S . -B build/windows -G Ninja
|
|
-DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/llvm-mingw-x86_64.cmake
|
|
-DCMAKE_BUILD_TYPE=Release
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-windows cmake --build build/windows -j
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-windows cmake --build build/windows --target openra3_msi
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-windows bash -c "cd build/windows && cpack -G ZIP"
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-windows bash -c "mkdir -p artifacts/windows && cp build/windows/bin/openra3.exe build/windows/bin/SDL3.dll build/windows/bin/*.msi build/windows/*.zip artifacts/windows/"
|
|
artifacts:
|
|
name: "$CI_PROJECT_NAME-windows-$CI_COMMIT_SHORT_SHA"
|
|
paths:
|
|
- artifacts/windows/
|
|
expire_in: 7 days
|
|
|
|
# --- arm64 + Debian toolchain images -----------------------------------------
|
|
linux_arm64_image:
|
|
stage: image
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- |
|
|
retry docker build \
|
|
--cache-from type=registry,ref=$IMAGE:cache-linux-arm64,insecure=true \
|
|
--cache-to type=registry,ref=$IMAGE:cache-linux-arm64,mode=max,insecure=true \
|
|
--build-arg APT_MIRROR=$APT_MIRROR \
|
|
--target dev \
|
|
-t $IMAGE:$CI_COMMIT_SHORT_SHA-linux-arm64 \
|
|
-f Dockerfile.linux-arm64 .
|
|
- retry docker push $IMAGE:$CI_COMMIT_SHORT_SHA-linux-arm64
|
|
|
|
windows_arm64_image:
|
|
stage: image
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- |
|
|
retry docker build \
|
|
--cache-from type=registry,ref=$IMAGE:cache-windows-arm64,insecure=true \
|
|
--cache-to type=registry,ref=$IMAGE:cache-windows-arm64,mode=max,insecure=true \
|
|
--build-arg APT_MIRROR=$APT_MIRROR \
|
|
--target dev \
|
|
-t $IMAGE:$CI_COMMIT_SHORT_SHA-windows-arm64 \
|
|
-f Dockerfile.win-arm64 .
|
|
- retry docker push $IMAGE:$CI_COMMIT_SHORT_SHA-windows-arm64
|
|
|
|
debian_image:
|
|
stage: image
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- |
|
|
retry docker build \
|
|
--cache-from type=registry,ref=$IMAGE:cache-debian,insecure=true \
|
|
--cache-to type=registry,ref=$IMAGE:cache-debian,mode=max,insecure=true \
|
|
--build-arg APT_MIRROR=$APT_MIRROR \
|
|
--target dev \
|
|
-t $IMAGE:$CI_COMMIT_SHORT_SHA-debian \
|
|
-f Dockerfile.debian .
|
|
- retry docker push $IMAGE:$CI_COMMIT_SHORT_SHA-debian
|
|
|
|
debian_arm64_image:
|
|
stage: image
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- |
|
|
retry docker build \
|
|
--cache-from type=registry,ref=$IMAGE:cache-debian-arm64,insecure=true \
|
|
--cache-to type=registry,ref=$IMAGE:cache-debian-arm64,mode=max,insecure=true \
|
|
--build-arg APT_MIRROR=$APT_MIRROR \
|
|
--target dev \
|
|
-t $IMAGE:$CI_COMMIT_SHORT_SHA-debian-arm64 \
|
|
-f Dockerfile.debian-arm64 .
|
|
- retry docker push $IMAGE:$CI_COMMIT_SHORT_SHA-debian-arm64
|
|
|
|
# --- build each target (binary + packages) -----------------------------------
|
|
build_linux_arm64:
|
|
stage: build
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
needs:
|
|
- linux_arm64_image
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- retry docker pull $IMAGE:$CI_COMMIT_SHORT_SHA-linux-arm64
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-linux-arm64 cmake -S . -B build/linux-arm64 -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/clang-aarch64-linux-gnu.cmake -DCMAKE_BUILD_TYPE=Release -DOPENRA3_DISTRO_TAG=ubuntu26.04
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-linux-arm64 cmake --build build/linux-arm64 -j
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-linux-arm64 bash -c "cd build/linux-arm64 && cpack -G DEB"
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-linux-arm64 bash -c "mkdir -p artifacts/linux-arm64 && cp build/linux-arm64/bin/openra3 build/linux-arm64/*.deb artifacts/linux-arm64/"
|
|
artifacts:
|
|
name: "$CI_PROJECT_NAME-linux-arm64-$CI_COMMIT_SHORT_SHA"
|
|
paths:
|
|
- artifacts/linux-arm64/
|
|
expire_in: 7 days
|
|
|
|
build_windows_arm64:
|
|
stage: build
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
needs:
|
|
- windows_arm64_image
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- retry docker pull $IMAGE:$CI_COMMIT_SHORT_SHA-windows-arm64
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-windows-arm64 cmake -S . -B build/windows-arm64 -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/llvm-mingw-aarch64.cmake -DCMAKE_BUILD_TYPE=Release
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-windows-arm64 cmake --build build/windows-arm64 -j
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-windows-arm64 bash -c "cd build/windows-arm64 && cpack -G ZIP"
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-windows-arm64 bash -c "mkdir -p artifacts/windows-arm64 && cp build/windows-arm64/bin/openra3.exe build/windows-arm64/bin/SDL3.dll build/windows-arm64/*.zip artifacts/windows-arm64/"
|
|
artifacts:
|
|
name: "$CI_PROJECT_NAME-windows-arm64-$CI_COMMIT_SHORT_SHA"
|
|
paths:
|
|
- artifacts/windows-arm64/
|
|
expire_in: 7 days
|
|
|
|
build_debian:
|
|
stage: build
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
needs:
|
|
- debian_image
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- retry docker pull $IMAGE:$CI_COMMIT_SHORT_SHA-debian
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-debian cmake -S . -B build/debian -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STDLIB_MODULES_JSON=/usr/lib/llvm-19/lib/libc++.modules.json -DOPENRA3_DISTRO_TAG=debian13
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-debian cmake --build build/debian -j
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-debian ctest --test-dir build/debian --output-on-failure
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-debian bash -c "cd build/debian && cpack -G DEB"
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-debian bash -c "mkdir -p artifacts/debian && cp build/debian/bin/openra3 build/debian/*.deb artifacts/debian/"
|
|
artifacts:
|
|
name: "$CI_PROJECT_NAME-debian-$CI_COMMIT_SHORT_SHA"
|
|
paths:
|
|
- artifacts/debian/
|
|
expire_in: 7 days
|
|
|
|
build_debian_arm64:
|
|
stage: build
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
needs:
|
|
- debian_arm64_image
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- retry docker pull $IMAGE:$CI_COMMIT_SHORT_SHA-debian-arm64
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-debian-arm64 cmake -S . -B build/debian-arm64 -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/clang-aarch64-linux-gnu.cmake -DCMAKE_BUILD_TYPE=Release -DOPENRA3_AARCH64_CC=clang-19 -DOPENRA3_AARCH64_CXX=clang++-19 -DOPENRA3_AARCH64_STDLIB_MODULES_JSON=/usr/lib/llvm-19/lib/libc++.modules.json -DOPENRA3_DISTRO_TAG=debian13
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-debian-arm64 cmake --build build/debian-arm64 -j
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-debian-arm64 bash -c "cd build/debian-arm64 && cpack -G DEB"
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-debian-arm64 bash -c "mkdir -p artifacts/debian-arm64 && cp build/debian-arm64/bin/openra3 build/debian-arm64/*.deb artifacts/debian-arm64/"
|
|
artifacts:
|
|
name: "$CI_PROJECT_NAME-debian-arm64-$CI_COMMIT_SHORT_SHA"
|
|
paths:
|
|
- artifacts/debian-arm64/
|
|
expire_in: 7 days
|
|
# --- WebAssembly (Emscripten) -------------------------------------------------
|
|
wasm_image:
|
|
stage: image
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- |
|
|
retry docker build \
|
|
--cache-from type=registry,ref=$IMAGE:cache-wasm,insecure=true \
|
|
--cache-to type=registry,ref=$IMAGE:cache-wasm,mode=max,insecure=true \
|
|
--build-arg APT_MIRROR=$APT_MIRROR \
|
|
--target dev \
|
|
-t $IMAGE:$CI_COMMIT_SHORT_SHA-wasm \
|
|
-f Dockerfile.wasm .
|
|
- retry docker push $IMAGE:$CI_COMMIT_SHORT_SHA-wasm
|
|
|
|
build_wasm:
|
|
stage: build
|
|
image: docker:latest
|
|
services: *dind
|
|
tags:
|
|
- docker
|
|
needs:
|
|
- wasm_image
|
|
before_script: *retry
|
|
script:
|
|
- retry sh -c 'echo "$HARBOR_PASSWORD" | docker login "$HARBOR_HOST" -u "$HARBOR_USERNAME" --password-stdin'
|
|
- retry docker pull $IMAGE:$CI_COMMIT_SHORT_SHA-wasm
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-wasm cmake -S . -B build/wasm -G Ninja -DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/emscripten-wasm.cmake -DCMAKE_BUILD_TYPE=Release
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-wasm cmake --build build/wasm -j
|
|
- docker run --rm -v "$(pwd):/work" -w /work $IMAGE:$CI_COMMIT_SHORT_SHA-wasm bash -c "mkdir -p artifacts/wasm && cp build/wasm/bin/index.html build/wasm/bin/openra3.js build/wasm/bin/openra3.wasm build/wasm/bin/openra3.worker.js artifacts/wasm/ && cp build/wasm/bin/openra3.data artifacts/wasm/ 2>/dev/null || true"
|
|
artifacts:
|
|
name: "$CI_PROJECT_NAME-wasm-$CI_COMMIT_SHORT_SHA"
|
|
paths:
|
|
- artifacts/wasm/
|
|
expire_in: 7 days |