GitHub Actions中Ubuntu24.04模拟arm64时GCC崩溃,无法构建gem原生扩展
解决Ubuntu 24.04下QEMU构建arm64 Rails Docker镜像的GCC段错误问题
问题根源
Ubuntu 24.04默认搭载的GCC 13.x版本,在QEMU模拟arm64架构的环境中存在兼容性bug,导致编译Ruby gem原生扩展时触发GCC内部段错误。这个问题不特定于某款gem(msgpack、pg都出现),而是编译环境层面的问题——回退到Ubuntu 22.04(GCC 11.x)就能正常构建,也验证了这一点。
可行解决方案
1. 直接回退到Ubuntu 22.04(最省心的临时方案)
在GitHub Actions workflow文件里,把runner从ubuntu-latest明确指定为ubuntu-22.04,这是已经验证有效的方案:
jobs: build: runs-on: ubuntu-22.04 # 后续构建步骤...
2. 在Dockerfile中针对arm64降级GCC版本
如果必须使用Ubuntu 24.04,可以在Dockerfile中为arm64架构单独安装旧版GCC(比如12.x),并设置为默认编译器:
# 安装依赖时加入GCC 12(仅arm64生效) RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential gcc-12 g++-12 \ && if [ "$(dpkg --print-architecture)" = "arm64" ]; then \ # 将gcc-12设为默认编译器 update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100 \ && update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100; \ fi # 之后正常执行bundle install等步骤 RUN bundle install --jobs 4 --retry 3
3. 更新QEMU版本尝试修复兼容性
在GitHub Actions中使用最新版的QEMU镜像,可能修复与新版GCC的交互问题:
- name: Set up QEMU uses: docker/setup-qemu-action@v3 with: image: tonistiigi/binfmt:latest
补充说明
如果后续Ubuntu官方或QEMU团队修复了这个兼容性bug,就可以换回ubuntu-latest。在此之前,优先用方案1或方案2解决问题。
内容的提问来源于stack exchange,提问作者mattwise
相关产品推荐
相关产品推荐

