ci: cross-build dev images with AotAnywhere [CI] [SKIP TESTS]
ci/woodpecker/push/verify Pipeline was successful
ci/woodpecker/push/web-build Pipeline was successful
ci/woodpecker/push/dev-image Pipeline was canceled

Signed-off-by: JustMe <mr.toing@outlook.com>
This commit is contained in:
justme committed 2026-10-10 15:45:45 +08:00
1 parent 376020fe34
commit 49812e94c0
3 files changed
+44 -19

No files matched your search

@@ -1,11 +1,23 @@
FROM mcr.microsoft.com/dotnet/sdk:10.0-alpine-aot AS build
# Run all build commands on the native amd64 runner. AotAnywhere cross-links
# the NativeAOT output, so an ARM64 build never needs QEMU.
FROM --platform=linux/amd64 mcr.microsoft.com/dotnet/sdk:10.0-alpine-aot AS build
WORKDIR /src/backend
COPY restore/backend/ ./
ARG NODE_RID=linux-musl-x64
ENV NUGET_PACKAGES=/root/.nuget/packages
# restore 也要带 PublishAot:不然不会还原 ILCompiler,之后 --no-restore 的发布就悄悄变成「裁剪过的框架依赖程序」
RUN dotnet restore probe/src/MoShiro.Probe -r "$NODE_RID" -p:PublishAot=true --artifacts-path /artifacts \
&& dotnet restore fleet/tools/fleet-enroll -r "$NODE_RID" -p:PublishAot=true --artifacts-path /artifacts
RUN dotnet restore probe/src/MoShiro.Probe -r "$NODE_RID" -p:PublishAot=true -p:UseAotAnywhere=true --artifacts-path /artifacts \
&& dotnet restore fleet/tools/fleet-enroll -r "$NODE_RID" -p:PublishAot=true -p:UseAotAnywhere=true --artifacts-path /artifacts
# Fetch target-musl runtime libraries on the native builder before copying
# application sources. This layer stays reusable when only app code changes.
RUN apk_arch=x86_64; \
case "$NODE_RID" in *arm64) apk_arch=aarch64 ;; esac; \
mkdir -p /tmp/runtime-apks /tmp/runtime-root /out/runtime; \
apk --arch "$apk_arch" fetch --recursive --output /tmp/runtime-apks libmsquic numactl lttng-ust zlib; \
for package in /tmp/runtime-apks/*.apk; do tar -xzf "$package" -C /tmp/runtime-root; done; \
cp -a /tmp/runtime-root/usr/lib/*.so* /out/runtime/
COPY source/backend/ ./
# 构建信息:CI 通过 --build-arg 传入;不传就是空(放在 restore 之后,每次构建都变的时间不会让依赖还原的缓存失效)
@@ -14,11 +26,11 @@ ARG MOSHIRO_COMMIT=
ARG MOSHIRO_BUILT_AT=
ENV MOSHIRO_TAG=$MOSHIRO_TAG MOSHIRO_COMMIT=$MOSHIRO_COMMIT MOSHIRO_BUILT_AT=$MOSHIRO_BUILT_AT
RUN dotnet publish probe/src/MoShiro.Probe -m:3 -c Release -r "$NODE_RID" \
--self-contained true --no-restore -p:PublishAot=true -p:UseAotAnywhere=false \
--self-contained true --no-restore -p:PublishAot=true -p:UseAotAnywhere=true \
-p:UseAppHost=true -p:StripSymbols=true \
-p:DebugType=none -p:DebugSymbols=false --artifacts-path /artifacts -o /out/probe \
&& dotnet publish fleet/tools/fleet-enroll -m:3 -c Release -r "$NODE_RID" \
--self-contained true --no-restore -p:PublishAot=true -p:UseAotAnywhere=false \
--self-contained true --no-restore -p:PublishAot=true -p:UseAotAnywhere=true \
-p:UseAppHost=true -p:StripSymbols=true \
-p:DebugType=none -p:DebugSymbols=false --artifacts-path /artifacts -o /out/enroll
# 原生程序有几 MB;几十 KB 的是只会去找 .dll 的启动器
@@ -27,10 +39,6 @@ RUN test -x /out/probe/moshiro-probe && test -x /out/enroll/fleet-enroll \
FROM mcr.microsoft.com/dotnet/runtime-deps:10.0-alpine
# Include MsQuic and its musl runtime dependencies in the resulting image.
RUN apk add --no-cache libmsquic numactl lttng-ust zlib \
&& cp -a /usr/lib/libmsquic.so* /usr/lib/libnuma.so* /usr/lib/liblttng-ust*.so* /usr/lib/libz.so* /usr/local/bin/
ARG APP_VERSION=main
LABEL org.opencontainers.image.title="MoShiro Probe" \
org.opencontainers.image.description="MoShiro network measurement probe for Linux" \
@@ -39,6 +47,7 @@ LABEL org.opencontainers.image.title="MoShiro Probe" \
COPY --chown=1654:1654 --from=build /out/probe/moshiro-probe /usr/local/bin/moshiro-probe
COPY --chown=1654:1654 --from=build /out/enroll/fleet-enroll /usr/local/bin/fleet-enroll
COPY --from=build /out/runtime/ /usr/local/bin/
COPY --chown=1654:1654 config/ /etc/moshiro/
COPY --chown=1654:1654 --chmod=0755 entrypoint.sh /usr/local/bin/moshiro-entrypoint