diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 89244c6..83808e8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,6 +8,7 @@ on: branches: - main paths: + - '.github/workflows/release.yml' - 'frontend/**' - '**.sh' - '**.go' @@ -27,7 +28,7 @@ jobs: - armv5 - 386 - s390x - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v5.0.0 @@ -45,23 +46,6 @@ jobs: with: node-version: '22' registry-url: 'https://registry.npmjs.org' - - - name: Install dependencies - run: | - sudo apt-get update - if [ "${{ matrix.platform }}" == "arm64" ]; then - sudo apt install gcc-aarch64-linux-gnu - elif [ "${{ matrix.platform }}" == "armv7" ]; then - sudo apt install gcc-arm-linux-gnueabihf - elif [ "${{ matrix.platform }}" == "armv6" ]; then - sudo apt install gcc-arm-linux-gnueabihf - elif [ "${{ matrix.platform }}" == "armv5" ]; then - sudo apt install gcc-arm-linux-gnueabi - elif [ "${{ matrix.platform }}" == "386" ]; then - sudo apt install gcc-i686-linux-gnu - elif [ "${{ matrix.platform }}" == "s390x" ]; then - sudo apt install gcc-s390x-linux-gnu - fi - name: Build frontend run: | @@ -77,31 +61,34 @@ jobs: export CGO_ENABLED=1 export GOOS=linux export GOARCH=${{ matrix.platform }} - if [ "${{ matrix.platform }}" == "arm64" ]; then - export GOARCH=arm64 - export CC=aarch64-linux-gnu-gcc - elif [ "${{ matrix.platform }}" == "armv7" ]; then - export GOARCH=arm - export GOARM=7 - export CC=arm-linux-gnueabihf-gcc - elif [ "${{ matrix.platform }}" == "armv6" ]; then - export GOARCH=arm - export GOARM=6 - export CC=arm-linux-gnueabihf-gcc - elif [ "${{ matrix.platform }}" == "armv5" ]; then - export GOARCH=arm - export GOARM=5 - export CC=arm-linux-gnueabi-gcc - elif [ "${{ matrix.platform }}" == "386" ]; then - export GOARCH=386 - export CC=i686-linux-gnu-gcc - elif [ "${{ matrix.platform }}" == "s390x" ]; then - export GOARCH=s390x - export CC=s390x-linux-gnu-gcc - fi + # Use Bootlin prebuilt cross-toolchains (musl 1.2.5 in stable series) + case "${{ matrix.platform }}" in + amd64) BOOTLIN_ARCH="x86-64" ;; + arm64) BOOTLIN_ARCH="aarch64" ;; + armv7) BOOTLIN_ARCH="armv7-eabihf"; export GOARCH=arm GOARM=7 ;; + armv6) BOOTLIN_ARCH="armv6-eabihf"; export GOARCH=arm GOARM=6 ;; + armv5) BOOTLIN_ARCH="armv5-eabi"; export GOARCH=arm GOARM=5 ;; + 386) BOOTLIN_ARCH="x86-i686" ;; + s390x) BOOTLIN_ARCH="s390x-z13" ;; + esac + echo "Resolving Bootlin musl toolchain for arch=$BOOTLIN_ARCH (platform=${{ matrix.platform }})" + TARBALL_BASE="https://toolchains.bootlin.com/downloads/releases/toolchains/$BOOTLIN_ARCH/tarballs/" + TARBALL_URL=$(curl -fsSL "$TARBALL_BASE" | grep -oE "${BOOTLIN_ARCH}--musl--stable-[^\"]+\\.tar\\.xz" | sort -r | head -n1) + [ -z "$TARBALL_URL" ] && { echo "Failed to locate Bootlin musl toolchain for arch=$BOOTLIN_ARCH" >&2; exit 1; } + echo "Downloading: $TARBALL_URL" + cd /tmp + curl -fL -sS -o "$(basename "$TARBALL_URL")" "$TARBALL_BASE/$TARBALL_URL" + tar -xf "$(basename "$TARBALL_URL")" + TOOLCHAIN_DIR=$(find . -maxdepth 1 -type d -name "${BOOTLIN_ARCH}--musl--stable-*" | head -n1) + export PATH="$(realpath "$TOOLCHAIN_DIR")/bin:$PATH" + export CC=$(realpath "$(find "$TOOLCHAIN_DIR/bin" -name '*-gcc.br_real' -type f -executable | head -n1)") + [ -z "$CC" ] && { echo "No gcc.br_real found in $TOOLCHAIN_DIR/bin" >&2; exit 1; } + cd - ### Build s-ui - go build -ldflags="-w -s" -tags "with_quic,with_grpc,with_utls,with_acme,with_gvisor" -o sui main.go + go build -ldflags="-w -s -linkmode external -extldflags '-static'" -tags "with_quic,with_grpc,with_utls,with_acme,with_gvisor" -o sui main.go + file sui + ldd sui || echo "Static binary confirmed" mkdir s-ui cp sui s-ui/