From 4a726471bb45032ec60b491ae2b674f72d8e12fa Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Sat, 26 Apr 2025 11:52:51 +0000 Subject: [PATCH] chore: switch to building toolchain with dockerfiles instead of github actions --- .github/workflows/release.yaml | 30 +++++------ docker/toolchain/build.sh | 52 ------------------ docker/toolchain/linux-aarch64.Dockerfile | 58 ++++++++++++++++++++ docker/toolchain/linux-x86.Dockerfile | 55 +++++++++++++++++++ docker/toolchain/macos-aarch64.Dockerfile | 66 +++++++++++++++++++++++ docker/toolchain/macos-x86.Dockerfile | 66 +++++++++++++++++++++++ docker/toolchain/setup.sh | 51 ------------------ docker/toolchain/windows-x86.Dockerfile | 43 +++++++++++++++ scripts/toolchain/build-cross.sh | 65 ++++++++++++++++++++++ 9 files changed, 366 insertions(+), 120 deletions(-) delete mode 100755 docker/toolchain/build.sh create mode 100644 docker/toolchain/linux-aarch64.Dockerfile create mode 100644 docker/toolchain/linux-x86.Dockerfile create mode 100644 docker/toolchain/macos-aarch64.Dockerfile create mode 100644 docker/toolchain/macos-x86.Dockerfile delete mode 100644 docker/toolchain/setup.sh create mode 100644 docker/toolchain/windows-x86.Dockerfile create mode 100755 scripts/toolchain/build-cross.sh diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 4b438eacc0..574f771181 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -90,19 +90,22 @@ jobs: runner: [self-hosted, Linux, X64] suffix: x86-linux target: x86_64-unknown-linux-gnu - # - platform: windows - # runner: [self-hosted, Linux, X64] - # suffix: x86-windows.exe - # target: x86_64-pc-windows-gnu - - platform: macos + arch: x86 + - platform: windows + runner: [self-hosted, Linux, X64] + suffix: x86-windows.exe + target: x86_64-pc-windows-gnu + arch: x86 + - platform: mac runner: [self-hosted, Linux, X64] suffix: x86-mac target: x86_64-apple-darwin - - platform: macos + arch: x86 + - platform: mac runner: [self-hosted, Linux, ARM64] suffix: aarch64-mac target: aarch64-apple-darwin - arch: arm64 + arch: aarch64 runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@v4 @@ -117,15 +120,8 @@ jobs: # Use Docker BuildKit export DOCKER_BUILDKIT=1 - # Build the binary using our Dockerfile - ARCH_ARG="${{ matrix.arch }}" - if [ -n "$ARCH_ARG" ]; then - # For ARM64 macOS - docker/toolchain/build.sh ${{ matrix.platform }} $ARCH_ARG - else - # For other platforms - docker/toolchain/build.sh ${{ matrix.platform }} - fi + # Build the binary + scripts/toolchain/build-cross.sh ${{ matrix.platform }} ${{ matrix.arch }} # Make sure dist directory exists and binary is there ls -la dist/ @@ -323,4 +319,4 @@ jobs: ./scripts/release/main.ts --version "${{ github.event.inputs.version }}" --completeCi else ./scripts/release/main.ts --version "${{ github.event.inputs.version }}" --no-latest --completeCi - fi \ No newline at end of file + fi diff --git a/docker/toolchain/build.sh b/docker/toolchain/build.sh deleted file mode 100755 index 6bea6e6f17..0000000000 --- a/docker/toolchain/build.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -set -e - -# Default to Linux if no platform specified -PLATFORM=${1:-linux} -ARCH=${2:-} - -case $PLATFORM in - linux) - echo "Building for Linux platform" - DOCKERFILE="linux.Dockerfile" - BINARY="rivet-x86-linux" - ;; - macos) - if [ "$ARCH" == "arm64" ] || [ "$ARCH" == "aarch64" ]; then - echo "Building for macOS ARM64 platform" - DOCKERFILE="macos.Dockerfile" - BINARY="rivet-aarch64-mac" - else - echo "Building for macOS x86_64 platform" - DOCKERFILE="macos.Dockerfile" - BINARY="rivet-x86-mac" - fi - ;; - windows) - echo "Building for Windows platform" - DOCKERFILE="windows.Dockerfile" - BINARY="rivet-x86-windows.exe" - ;; - *) - echo "Unsupported platform: $PLATFORM" - echo "Usage: $0 [linux|macos|windows] [arch]" - echo " For macOS, specify 'arm64' as second parameter for ARM64 build" - exit 1 - ;; -esac - -# Build docker image -DOCKER_BUILDKIT=1 docker build -f docker/toolchain/$DOCKERFILE -t rivet-cli-builder-$PLATFORM . - -# Extract binary -CONTAINER_ID=$(docker create rivet-cli-builder-$PLATFORM) -mkdir -p dist -docker cp "$CONTAINER_ID:/artifacts/$BINARY" dist/ -docker rm "$CONTAINER_ID" - -# Make binary executable (skip for Windows .exe files) -if [[ ! "$BINARY" == *.exe ]]; then - chmod +x dist/$BINARY -fi - -echo "Binary saved to: dist/$BINARY" \ No newline at end of file diff --git a/docker/toolchain/linux-aarch64.Dockerfile b/docker/toolchain/linux-aarch64.Dockerfile new file mode 100644 index 0000000000..c0d559a1e0 --- /dev/null +++ b/docker/toolchain/linux-aarch64.Dockerfile @@ -0,0 +1,58 @@ +# syntax=docker/dockerfile:1.4 +FROM rust:1.82.0 + +# Install dependencies +RUN apt-get update && apt-get install -y \ + musl-tools \ + libssl-dev \ + pkg-config \ + protobuf-compiler \ + ca-certificates \ + git-lfs \ + musl-dev \ + gcc-aarch64-linux-gnu \ + && rm -rf /var/lib/apt/lists/* + +# Install musl target for aarch64 +RUN rustup target add aarch64-unknown-linux-musl + +# Set up OpenSSL for musl target +ENV SSL_VER=1.1.1w +RUN wget https://www.openssl.org/source/openssl-$SSL_VER.tar.gz \ + && tar -xzf openssl-$SSL_VER.tar.gz \ + && cd openssl-$SSL_VER \ + && ./Configure no-shared no-async --prefix=/musl-aarch64 --openssldir=/musl-aarch64/ssl linux-aarch64 \ + && make -j$(nproc) CC=aarch64-linux-gnu-gcc \ + && make install_sw \ + && cd .. \ + && rm -rf openssl-$SSL_VER* + +# Configure OpenSSL env vars for the build +ENV OPENSSL_DIR=/musl-aarch64 \ + OPENSSL_INCLUDE_DIR=/musl-aarch64/include \ + OPENSSL_LIB_DIR=/musl-aarch64/lib \ + PKG_CONFIG_ALLOW_CROSS=1 \ + CC_aarch64_unknown_linux_musl=aarch64-linux-gnu-gcc \ + CARGO_TARGET_AARCH64_UNKNOWN_LINUX_MUSL_LINKER=aarch64-linux-gnu-gcc + +# Set environment variables +ENV CARGO_INCREMENTAL=0 \ + RUSTFLAGS="--cfg tokio_unstable" \ + CARGO_NET_GIT_FETCH_WITH_CLI=true + +# Set working directory +WORKDIR /build + +# Build CLI instructions +COPY . . + +# Build for Linux with musl (static binary) +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/usr/local/cargo/git \ + --mount=type=cache,target=/build/target \ + cargo build --bin rivet --release --target aarch64-unknown-linux-musl -v && \ + mkdir -p /artifacts && \ + cp target/aarch64-unknown-linux-musl/release/rivet /artifacts/rivet-aarch64-linux + +# Default command to show help +CMD ["ls", "-la", "/artifacts"] \ No newline at end of file diff --git a/docker/toolchain/linux-x86.Dockerfile b/docker/toolchain/linux-x86.Dockerfile new file mode 100644 index 0000000000..fbbb0b0a6d --- /dev/null +++ b/docker/toolchain/linux-x86.Dockerfile @@ -0,0 +1,55 @@ +# syntax=docker/dockerfile:1.4 +FROM rust:1.82.0 + +# Install dependencies +RUN apt-get update && apt-get install -y \ + musl-tools \ + libssl-dev \ + pkg-config \ + protobuf-compiler \ + ca-certificates \ + git-lfs \ + musl-dev \ + && rm -rf /var/lib/apt/lists/* + +# Install musl target +RUN rustup target add x86_64-unknown-linux-musl + +# Set up OpenSSL for musl target +ENV SSL_VER=1.1.1w +RUN wget https://www.openssl.org/source/openssl-$SSL_VER.tar.gz \ + && tar -xzf openssl-$SSL_VER.tar.gz \ + && cd openssl-$SSL_VER \ + && ./Configure no-shared no-async --prefix=/musl --openssldir=/musl/ssl linux-x86_64 \ + && make -j$(nproc) \ + && make install_sw \ + && cd .. \ + && rm -rf openssl-$SSL_VER* + +# Configure OpenSSL env vars for the build +ENV OPENSSL_DIR=/musl \ + OPENSSL_INCLUDE_DIR=/musl/include \ + OPENSSL_LIB_DIR=/musl/lib \ + PKG_CONFIG_ALLOW_CROSS=1 + +# Set environment variables +ENV CARGO_INCREMENTAL=0 \ + RUSTFLAGS="--cfg tokio_unstable" \ + CARGO_NET_GIT_FETCH_WITH_CLI=true + +# Set working directory +WORKDIR /build + +# Build CLI instructions +COPY . . + +# Build for Linux with musl (static binary) +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/usr/local/cargo/git \ + --mount=type=cache,target=/build/target \ + cargo build --bin rivet --release --target x86_64-unknown-linux-musl -v && \ + mkdir -p /artifacts && \ + cp target/x86_64-unknown-linux-musl/release/rivet /artifacts/rivet-x86-linux + +# Default command to show help +CMD ["ls", "-la", "/artifacts"] \ No newline at end of file diff --git a/docker/toolchain/macos-aarch64.Dockerfile b/docker/toolchain/macos-aarch64.Dockerfile new file mode 100644 index 0000000000..3ca4d554f4 --- /dev/null +++ b/docker/toolchain/macos-aarch64.Dockerfile @@ -0,0 +1,66 @@ +# syntax=docker/dockerfile:1.4 +FROM rust:1.82.0 + +# Install dependencies +RUN apt-get update && apt-get install -y \ + git-lfs \ + protobuf-compiler \ + clang \ + cmake \ + patch \ + libxml2-dev \ + wget \ + xz-utils \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Install osxcross +RUN git config --global --add safe.directory '*' && \ + git clone https://github.com/tpoechtrager/osxcross /root/osxcross && \ + cd /root/osxcross && \ + wget -nc https://github.com/phracker/MacOSX-SDKs/releases/download/11.3/MacOSX11.3.sdk.tar.xz && \ + mv MacOSX11.3.sdk.tar.xz tarballs/ && \ + UNATTENDED=yes OSX_VERSION_MIN=10.7 ./build.sh + +# Add osxcross to PATH +ENV PATH="/root/osxcross/target/bin:$PATH" + +# Install macOS target +RUN rustup target add aarch64-apple-darwin + +# Configure Cargo for cross-compilation +RUN mkdir -p /root/.cargo && \ + echo '\ +[target.aarch64-apple-darwin]\n\ +linker = "aarch64-apple-darwin20.4-clang"\n\ +ar = "aarch64-apple-darwin20.4-ar"\n\ +' > /root/.cargo/config.toml + +# Set environment variables for cross-compilation +ENV CARGO_TARGET_AARCH64_APPLE_DARWIN_LINKER=aarch64-apple-darwin20.4-clang \ + CC_aarch64_apple_darwin=aarch64-apple-darwin20.4-clang \ + CXX_aarch64_apple_darwin=aarch64-apple-darwin20.4-clang++ \ + MACOSX_DEPLOYMENT_TARGET=10.7 \ + # Skip aws-lc-rs with rustls certs config when building for macOS + RUSTFLAGS="--cfg tokio_unstable --cfg rustls_native_certs --cfg aws_lc_rs" \ + CARGO_FEATURE_RUSTLS_NATIVE_CERTS=0 \ + CARGO_RUSTLS_NATIVE_CERTS=0 \ + CARGO_INCREMENTAL=0 \ + CARGO_NET_GIT_FETCH_WITH_CLI=true + +# Set working directory +WORKDIR /build + +# Copy the source code +COPY . . + +# Build for ARM64 macOS +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/usr/local/cargo/git \ + --mount=type=cache,target=/build/target \ + cargo build --bin rivet --release --target aarch64-apple-darwin && \ + mkdir -p /artifacts && \ + cp target/aarch64-apple-darwin/release/rivet /artifacts/rivet-aarch64-mac + +# Default command to show help +CMD ["ls", "-la", "/artifacts"] \ No newline at end of file diff --git a/docker/toolchain/macos-x86.Dockerfile b/docker/toolchain/macos-x86.Dockerfile new file mode 100644 index 0000000000..4a754c47a7 --- /dev/null +++ b/docker/toolchain/macos-x86.Dockerfile @@ -0,0 +1,66 @@ +# syntax=docker/dockerfile:1.4 +FROM rust:1.82.0 + +# Install dependencies +RUN apt-get update && apt-get install -y \ + git-lfs \ + protobuf-compiler \ + clang \ + cmake \ + patch \ + libxml2-dev \ + wget \ + xz-utils \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Install osxcross +RUN git config --global --add safe.directory '*' && \ + git clone https://github.com/tpoechtrager/osxcross /root/osxcross && \ + cd /root/osxcross && \ + wget -nc https://github.com/phracker/MacOSX-SDKs/releases/download/11.3/MacOSX11.3.sdk.tar.xz && \ + mv MacOSX11.3.sdk.tar.xz tarballs/ && \ + UNATTENDED=yes OSX_VERSION_MIN=10.7 ./build.sh + +# Add osxcross to PATH +ENV PATH="/root/osxcross/target/bin:$PATH" + +# Install macOS target +RUN rustup target add x86_64-apple-darwin + +# Configure Cargo for cross-compilation +RUN mkdir -p /root/.cargo && \ + echo '\ +[target.x86_64-apple-darwin]\n\ +linker = "x86_64-apple-darwin20.4-clang"\n\ +ar = "x86_64-apple-darwin20.4-ar"\n\ +' > /root/.cargo/config.toml + +# Set environment variables for cross-compilation +ENV CARGO_TARGET_X86_64_APPLE_DARWIN_LINKER=x86_64-apple-darwin20.4-clang \ + CC_x86_64_apple_darwin=x86_64-apple-darwin20.4-clang \ + CXX_x86_64_apple_darwin=x86_64-apple-darwin20.4-clang++ \ + MACOSX_DEPLOYMENT_TARGET=10.7 \ + # Skip aws-lc-rs with rustls certs config when building for macOS + RUSTFLAGS="--cfg tokio_unstable --cfg rustls_native_certs --cfg aws_lc_rs" \ + CARGO_FEATURE_RUSTLS_NATIVE_CERTS=0 \ + CARGO_RUSTLS_NATIVE_CERTS=0 \ + CARGO_INCREMENTAL=0 \ + CARGO_NET_GIT_FETCH_WITH_CLI=true + +# Set working directory +WORKDIR /build + +# Copy the source code +COPY . . + +# Build for x86_64 macOS +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/usr/local/cargo/git \ + --mount=type=cache,target=/build/target \ + cargo build --bin rivet --release --target x86_64-apple-darwin && \ + mkdir -p /artifacts && \ + cp target/x86_64-apple-darwin/release/rivet /artifacts/rivet-x86-mac + +# Default command to show help +CMD ["ls", "-la", "/artifacts"] \ No newline at end of file diff --git a/docker/toolchain/setup.sh b/docker/toolchain/setup.sh deleted file mode 100644 index b081f6442f..0000000000 --- a/docker/toolchain/setup.sh +++ /dev/null @@ -1,51 +0,0 @@ -#!/bin/bash -set -e - -# Install dependencies for cross-compilation -apt-get update && apt-get install -y \ - gcc-x86_64-linux-gnu \ - libc6-dev-amd64-cross \ - gcc-mingw-w64-x86-64 \ - clang \ - cmake \ - patch \ - libxml2-dev \ - wget \ - xz-utils \ - curl \ - git-lfs \ - awscli \ - && rm -rf /var/lib/apt/lists/* - -# Install macOS cross-compilation tools (osxcross) -git config --global --add safe.directory '*' -git clone https://github.com/tpoechtrager/osxcross /root/osxcross -cd /root/osxcross -wget -nc https://github.com/phracker/MacOSX-SDKs/releases/download/11.3/MacOSX11.3.sdk.tar.xz -mv MacOSX11.3.sdk.tar.xz tarballs/ -UNATTENDED=yes OSX_VERSION_MIN=10.7 ./build.sh -echo 'export PATH="/root/osxcross/target/bin:$PATH"' >> ~/.bashrc - -# Install Rust targets -rustup target add x86_64-unknown-linux-gnu -rustup target add x86_64-pc-windows-gnu -rustup target add x86_64-apple-darwin -rustup target add aarch64-apple-darwin - -# Configure Cargo for cross-compilation -mkdir -p /root/.cargo -cat > /root/.cargo/config.toml << 'EOF' -[target.x86_64-unknown-linux-gnu] -linker = "x86_64-linux-gnu-gcc" - -[target.x86_64-pc-windows-gnu] -linker = "x86_64-w64-mingw32-gcc" - -[target.x86_64-apple-darwin] -linker = "x86_64-apple-darwin20.4-clang" -ar = "x86_64-apple-darwin20.4-ar" - -[target.aarch64-apple-darwin] -linker = "aarch64-apple-darwin20.4-clang" -ar = "aarch64-apple-darwin20.4-ar" -EOF \ No newline at end of file diff --git a/docker/toolchain/windows-x86.Dockerfile b/docker/toolchain/windows-x86.Dockerfile new file mode 100644 index 0000000000..24004c5f0a --- /dev/null +++ b/docker/toolchain/windows-x86.Dockerfile @@ -0,0 +1,43 @@ +# syntax=docker/dockerfile:1.4 +FROM rust:1.82.0 + +# Install dependencies +RUN apt-get update && apt-get install -y \ + git-lfs \ + protobuf-compiler \ + gcc-mingw-w64-x86-64 \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# Install target +RUN rustup target add x86_64-pc-windows-gnu + +# Configure Cargo for Windows cross-compilation +RUN mkdir -p /root/.cargo && \ + echo '\ +[target.x86_64-pc-windows-gnu]\n\ +linker = "x86_64-w64-mingw32-gcc"\n\ +' > /root/.cargo/config.toml + +# Set environment variables for cross-compilation +ENV CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER=x86_64-w64-mingw32-gcc \ + RUSTFLAGS="--cfg tokio_unstable" \ + CARGO_INCREMENTAL=0 \ + CARGO_NET_GIT_FETCH_WITH_CLI=true + +# Set working directory +WORKDIR /build + +# Copy the source code +COPY . . + +# Build for Windows +RUN --mount=type=cache,target=/usr/local/cargo/registry \ + --mount=type=cache,target=/usr/local/cargo/git \ + --mount=type=cache,target=/build/target \ + cargo build --bin rivet --release --target x86_64-pc-windows-gnu && \ + mkdir -p /artifacts && \ + cp target/x86_64-pc-windows-gnu/release/rivet.exe /artifacts/rivet-x86-windows.exe + +# Default command to show help +CMD ["ls", "-la", "/artifacts"] \ No newline at end of file diff --git a/scripts/toolchain/build-cross.sh b/scripts/toolchain/build-cross.sh new file mode 100755 index 0000000000..a65714623f --- /dev/null +++ b/scripts/toolchain/build-cross.sh @@ -0,0 +1,65 @@ +#!/bin/bash +set -e + +# Both platform and arch are required +if [ "$#" -lt 2 ]; then + echo "Usage: $0 " + echo " platform: linux, mac, windows" + echo " arch: x86, aarch64" + exit 1 +fi + +PLATFORM="$1" +ARCH="$2" + +# Determine dockerfile and binary name based on platform and arch +case "$PLATFORM-$ARCH" in + linux-x86) + echo "Building for Linux x86_64 platform" + DOCKERFILE="linux-x86.Dockerfile" + BINARY="rivet-x86-linux" + ;; + linux-aarch64) + echo "Building for Linux ARM64 platform" + DOCKERFILE="linux-aarch64.Dockerfile" + BINARY="rivet-aarch64-linux" + ;; + mac-x86) + echo "Building for macOS x86_64 platform" + DOCKERFILE="macos-x86.Dockerfile" + BINARY="rivet-x86-mac" + ;; + mac-aarch64) + echo "Building for macOS ARM64 platform" + DOCKERFILE="macos-aarch64.Dockerfile" + BINARY="rivet-aarch64-mac" + ;; + windows-x86) + echo "Building for Windows platform" + DOCKERFILE="windows-x86.Dockerfile" + BINARY="rivet-x86-windows.exe" + ;; + *) + echo "Unsupported platform-arch combination: $PLATFORM-$ARCH" + echo "Usage: $0 " + echo " platform: linux, mac, windows" + echo " arch: x86, aarch64" + exit 1 + ;; +esac + +# Build docker image +DOCKER_BUILDKIT=1 docker build -f docker/toolchain/$DOCKERFILE -t rivet-cli-builder-$PLATFORM-$ARCH . + +# Extract binary +CONTAINER_ID=$(docker create rivet-cli-builder-$PLATFORM-$ARCH) +mkdir -p dist +docker cp "$CONTAINER_ID:/artifacts/$BINARY" dist/ +docker rm "$CONTAINER_ID" + +# Make binary executable (skip for Windows .exe files) +if [[ ! "$BINARY" == *.exe ]]; then + chmod +x dist/$BINARY +fi + +echo "Binary saved to: dist/$BINARY" \ No newline at end of file