ci(docker): cross build armv7 image

This commit is contained in:
Aethersailor
2026-05-19 21:18:24 +08:00
parent c1d20cbff1
commit f53e4062b3
3 changed files with 225 additions and 9 deletions

View File

@@ -413,9 +413,10 @@ jobs:
build-armv7:
name: "🐳 Docker Build (armv7)"
runs-on: ubuntu-24.04-arm
runs-on: ubuntu-latest
needs: prepare
if: needs.prepare.outputs.is_release == 'true'
timeout-minutes: 25
outputs:
digest: ${{ steps.build_image.outputs.digest }}
steps:
@@ -425,11 +426,6 @@ jobs:
token: ${{ github.event_name == 'pull_request' && github.token || secrets.PAT_TOKEN }}
fetch-depth: 0
- name: Set up QEMU
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3
with:
platforms: arm
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4
@@ -453,7 +449,7 @@ jobs:
uses: docker/build-push-action@bcafcacb16a39f128d818304e6c9c0c18556b85f # v7
with:
context: .
file: ./Dockerfile.debian
file: ./Dockerfile.armv7-cross
push: ${{ github.event_name != 'pull_request' }}
platforms: linux/arm/v7
tags: ${{ needs.prepare.outputs.tags }}
@@ -464,8 +460,8 @@ jobs:
BUILD_DATE=${{ needs.prepare.outputs.build_date }}
MIHOMO_REF=Meta
MIHOMO_CACHE_BUST=${{ github.run_id }}
cache-from: type=gha,scope=subconverter-debian-armv7
cache-to: type=gha,mode=max,scope=subconverter-debian-armv7
cache-from: type=gha,scope=subconverter-armv7-cross
cache-to: type=gha,mode=max,scope=subconverter-armv7-cross
merge-manifest:
name: "🔗 Docker Manifest"

201
Dockerfile.armv7-cross Normal file
View File

@@ -0,0 +1,201 @@
# ========== GO BUILD STAGE ==========
FROM --platform=$BUILDPLATFORM golang:latest AS go-builder
ARG TARGETARCH
ARG TARGETVARIANT
ARG MIHOMO_REF="Meta"
ARG MIHOMO_CACHE_BUST=1
WORKDIR /build/bridge
RUN apt-get update && \
apt-get install -y --no-install-recommends \
git build-essential crossbuild-essential-armhf ca-certificates && \
rm -rf /var/lib/apt/lists/*
COPY bridge/converter.go ./
RUN go mod init github.com/aethersailor/subconverter-extended/bridge
RUN echo "MIHOMO_CACHE_BUST=$MIHOMO_CACHE_BUST" && \
go get github.com/metacubex/mihomo@${MIHOMO_REF}
RUN go get -u all
RUN go mod tidy
COPY scripts/ ../scripts/
RUN go run ../scripts/generate_schemes.go mihomo_schemes.h
RUN go run ../scripts/generate_param_compat.go -o param_compat.h
RUN echo "==> Cross-compiling Go bridge for linux/arm/v7" && \
CGO_ENABLED=1 \
GOOS=linux \
GOARCH=arm \
GOARM=7 \
CC=arm-linux-gnueabihf-gcc \
go build \
-trimpath \
-buildmode=c-archive \
-o libmihomo.a \
.
RUN ls -lh libmihomo.a libmihomo.h
# ========== C++ CROSS BUILD STAGE ==========
FROM --platform=$BUILDPLATFORM debian:trixie AS builder
ARG THREADS="4"
ARG SHA=""
ARG VERSION="dev"
ARG BUILD_DATE=""
ENV DEBIAN_FRONTEND=noninteractive
ENV PKG_CONFIG_ALLOW_CROSS=1
ENV PKG_CONFIG_LIBDIR=/usr/lib/arm-linux-gnueabihf/pkgconfig:/usr/share/pkgconfig:/opt/armv7/lib/pkgconfig
ENV PKG_CONFIG_PATH=/opt/armv7/lib/pkgconfig
WORKDIR /
RUN dpkg --add-architecture armhf && \
apt-get update && \
apt-get install -y --no-install-recommends \
git build-essential crossbuild-essential-armhf \
cmake ninja-build ccache pkg-config curl ca-certificates file \
libcurl4-openssl-dev:armhf \
libpcre2-dev:armhf \
libyaml-cpp-dev:armhf \
libatomic1:armhf \
rapidjson-dev && \
rm -rf /var/lib/apt/lists/*
COPY cmake/linux-armv7hf.cmake /opt/armv7-toolchain.cmake
RUN set -xe && \
git clone --depth=1 https://github.com/ftk/quickjspp.git && \
cd quickjspp && \
git submodule update --init && \
cmake -DCMAKE_TOOLCHAIN_FILE=/opt/armv7-toolchain.cmake -DCMAKE_BUILD_TYPE=Release . && \
make quickjs -j ${THREADS} && \
install -d /opt/armv7/lib/quickjs/ && \
install -m644 quickjs/libquickjs.a /opt/armv7/lib/quickjs/ && \
install -d /opt/armv7/include/quickjs/ && \
install -m644 quickjs/quickjs.h quickjs/quickjs-libc.h /opt/armv7/include/quickjs/ && \
install -m644 quickjspp.hpp /opt/armv7/include/
RUN set -xe && \
git clone https://github.com/PerMalmberg/libcron --depth=1 && \
cd libcron && \
git submodule update --init && \
cmake -DCMAKE_TOOLCHAIN_FILE=/opt/armv7-toolchain.cmake -DCMAKE_BUILD_TYPE=Release . && \
make libcron -j ${THREADS} && \
install -d /opt/armv7/lib/ && \
install -m644 libcron/out/Release/liblibcron.a /opt/armv7/lib/ && \
install -d /opt/armv7/include/libcron/ && \
install -m644 libcron/include/libcron/* /opt/armv7/include/libcron/ && \
install -d /opt/armv7/include/date/ && \
install -m644 libcron/externals/date/include/date/* /opt/armv7/include/date/
RUN set -xe && \
git clone https://github.com/ToruNiina/toml11 --depth=1 && \
cd toml11 && \
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/opt/armv7 -DCMAKE_CXX_STANDARD=11 && \
cmake --build build -j ${THREADS} && \
cmake --install build
COPY --from=go-builder /build/bridge/libmihomo.a /usr/lib/
COPY --from=go-builder /build/bridge/libmihomo.h /usr/include/
COPY --from=go-builder /build/bridge/go.mod /src/bridge/go.mod
COPY --from=go-builder /build/bridge/go.sum /src/bridge/go.sum
WORKDIR /src
COPY . /src
COPY --from=go-builder /build/bridge/mihomo_schemes.h /src/src/parser/mihomo_schemes.h
COPY --from=go-builder /build/bridge/param_compat.h /src/src/parser/param_compat.h
RUN set -xe && \
echo "Downloading latest cpp-httplib..." && \
curl -fsSL https://raw.githubusercontent.com/yhirose/cpp-httplib/master/httplib.h -o include/httplib.h && \
echo "Downloading latest nlohmann/json..." && \
curl -fsSL https://github.com/nlohmann/json/releases/latest/download/json.hpp -o include/nlohmann/json.hpp && \
echo "Downloading latest inja..." && \
curl -fsSL https://raw.githubusercontent.com/pantor/inja/master/single_include/inja/inja.hpp -o include/inja.hpp && \
echo "Downloading latest jpcre2..." && \
curl -fsSL https://raw.githubusercontent.com/jpcre2/jpcre2/master/src/jpcre2.hpp -o include/jpcre2.hpp && \
echo "Copying latest quickjspp from compiled source..." && \
cp /opt/armv7/include/quickjspp.hpp include/quickjspp.hpp && \
echo "All header libraries updated to latest versions"
RUN set -xe && \
[ -n "${SHA}" ] && sed -i "s/#define BUILD_ID \"\"/#define BUILD_ID \"${SHA}\"/ " src/version.h || true && \
[ -n "${VERSION}" ] && sed -i "s/#define VERSION \"dev\"/#define VERSION \"${VERSION}\"/" src/version.h || true && \
[ -n "${BUILD_DATE}" ] && sed -i "s/#define BUILD_DATE \"\"/#define BUILD_DATE \"${BUILD_DATE}\"/" src/version.h || true && \
mkdir -p bridge && \
cp /usr/lib/libmihomo.a bridge/ && \
cp /usr/include/libmihomo.h bridge/ && \
export PATH="/usr/lib/ccache:$PATH" && \
export CCACHE_DIR=/tmp/ccache && \
export CCACHE_COMPILERCHECK=content && \
cmake -GNinja \
-DCMAKE_TOOLCHAIN_FILE=/opt/armv7-toolchain.cmake \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DCMAKE_PREFIX_PATH=/opt/armv7 \
-DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF \
-DCMAKE_POSITION_INDEPENDENT_CODE=OFF \
-DCURL_INCLUDE_DIR=/usr/include \
-DCURL_LIBRARY=/usr/lib/arm-linux-gnueabihf/libcurl.so \
-DPCRE2_INCLUDE_DIR=/usr/include \
-DPCRE2_LIBRARY=/usr/lib/arm-linux-gnueabihf/libpcre2-8.so \
-DQUICKJS_INCLUDE_DIRS=/opt/armv7/include \
-DQUICKJS_LIBRARY=/opt/armv7/lib/quickjs/libquickjs.a \
-DLIBCRON_INCLUDE_DIR=/opt/armv7/include \
-DDATE_INCLUDE_DIR=/opt/armv7/include \
-DLIBCRON_LIBRARY=/opt/armv7/lib/liblibcron.a \
-DRAPIDJSON_INCLUDEDIR=/usr/include \
. && \
ninja -j ${THREADS} && \
file /src/subconverter && \
arm-linux-gnueabihf-readelf -h /src/subconverter && \
arm-linux-gnueabihf-readelf -d /src/subconverter
RUN set -xe && \
mkdir -p /runtime-root/etc/ssl/certs /runtime-root/etc /runtime-root/tmp && \
cp -aL /etc/ssl/certs/ca-certificates.crt /runtime-root/etc/ssl/certs/ && \
if [ -f /etc/nsswitch.conf ]; then cp -aL /etc/nsswitch.conf /runtime-root/etc/nsswitch.conf; fi && \
for dir in /lib/arm-linux-gnueabihf /usr/lib/arm-linux-gnueabihf /usr/arm-linux-gnueabihf/lib; do \
if [ -d "$dir" ]; then \
find "$dir" -maxdepth 1 \( -name '*.so' -o -name '*.so.*' -o -name 'ld-linux*.so*' \) -print | \
while read -r lib; do \
dest="/runtime-root$lib"; \
mkdir -p "$(dirname "$dest")"; \
cp -aL "$lib" "$dest"; \
done; \
fi; \
done
# ========== FINAL STAGE ==========
FROM --platform=$TARGETPLATFORM debian:trixie-slim
ARG VERSION="dev"
ARG SHA=""
ARG BUILD_DATE=""
LABEL \
org.opencontainers.image.title="SubConverter-Extended" \
org.opencontainers.image.description="A Modern Evolution of subconverter; an enhanced implementation aligned with Mihomo configuration" \
org.opencontainers.image.url="https://github.com/Aethersailor/SubConverter-Extended" \
org.opencontainers.image.source="https://github.com/Aethersailor/SubConverter-Extended" \
org.opencontainers.image.licenses="GPL-3.0" \
org.opencontainers.image.version="${VERSION}" \
org.opencontainers.image.revision="${SHA}" \
org.opencontainers.image.created="${BUILD_DATE}" \
maintainer="Aethersailor"
COPY --from=builder /runtime-root/ /
COPY --from=builder --chmod=0755 /src/subconverter /usr/bin/subconverter
COPY --from=builder /src/base /base/
ENV TZ=Asia/Shanghai
WORKDIR /base
CMD ["/usr/bin/subconverter"]
EXPOSE 25500/tcp

19
cmake/linux-armv7hf.cmake Normal file
View File

@@ -0,0 +1,19 @@
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR armv7)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
set(CMAKE_AR arm-linux-gnueabihf-ar)
set(CMAKE_RANLIB arm-linux-gnueabihf-ranlib)
set(CMAKE_STRIP arm-linux-gnueabihf-strip)
set(CMAKE_LIBRARY_ARCHITECTURE arm-linux-gnueabihf)
set(CMAKE_C_FLAGS_INIT "-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=hard")
set(CMAKE_CXX_FLAGS_INIT "-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=hard")
set(CMAKE_EXE_LINKER_FLAGS_INIT "-latomic -Wl,-rpath-link,/lib/arm-linux-gnueabihf -Wl,-rpath-link,/usr/lib/arm-linux-gnueabihf -Wl,-rpath-link,/usr/arm-linux-gnueabihf/lib")
set(CMAKE_FIND_ROOT_PATH /opt/armv7 /usr/arm-linux-gnueabihf)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)