【问题标题】:Jenkins does not work properly on Mac M1 agentJenkins 在 Mac M1 代理上无法正常工作
【发布时间】:2021-03-19 09:42:20
【问题描述】:

我们希望使用配备 M1 处理器的 Mac Mini 作为 CI 管道中的代理,以确保使用新 Mac 的开发人员可以编译项目。我们复制了 x86 的设置,但是 cmake 找不到诸如 boost 之类的库:

CMake Error at /opt/homebrew/Cellar/cmake/3.19.7/share/cmake/Modules/FindPackageHandleStandardArgs.cmake:218 (message):
  Could NOT find Boost (missing: Boost_INCLUDE_DIR container system
  date_time)

奇怪的是,当通过 ssh 直接连接到机器时,这不是问题。即使手动设置环境变量也不会改变任何东西。

【问题讨论】:

    标签: jenkins cmake apple-m1 rosetta-2


    【解决方案1】:

    Jenkins 代理使用 Java。如果您通过 brew 安装 Java(例如,采用openjdk8),您可能会获得使用 Rosetta 翻译层运行的 x64 版本(截至 2021 年 3 月)。您可以通过执行sysctl sysctl.proc_translated 来验证这一点。在“正常”的 SSH 连接中,这应该返回 0,当在 Jenkins 中以 sh "sysctl sysctl.proc_translated" 执行时,您将看到 1。

    首选选项(安装原生 JDK)

    您可以安装原生可用的zulu JDK,而不是使用,例如,采用openjdk8,通过

    brew install --cask zulu
    

    在此之后,您应该能够在 Jenkins 中验证 proc_translated 是否为 0。您可以按如下所述验证本机二进制文件是否已构建。

    修补程序(不更改 JDK)

    以下是无法安装原生 JDK 的修补程序

    我们可以通过如下修改我们的 Jenkinsfile 来强制 cmake 本地运行(从而找到本地库):

    旧:

    sh "cmake .."
    sh "make hyriseTest"
    

    新:

    sh "PATH=/opt/homebrew/bin:$PATH arch -arm64 cmake .."
    sh "arch -arm64 make hyriseTest"
    

    不得不一遍又一遍地重复 arch 命令并不是很漂亮。也许有人有更好的解决方案。

    结果验证

    我们可以验证我们生成的二进制文件是原生 ARM 二进制文件:

    sh "file hyriseTest"
    

    结果:

    + file ./hyriseTest
    ./hyriseTest: Mach-O 64-bit executable arm64
    

    编译器警告

    注意:我们仍然会看到有关“ltmp3”和“ltmp4”的链接器警告。我还没有在网上找到任何关于它的信息,它似乎不会影响结果的正确性。示例:

    ld: warning: direct access in function 'ltmp4' from file 'CMakeFiles/hyriseMvccDeletePlugin.dir/Unity/unity_0_cxx.cxx.o' to global weak symbol 
    

    【讨论】:

      猜你喜欢
      • 2021-11-03
      • 1970-01-01
      • 2022-08-20
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2021-10-12
      • 1970-01-01
      相关资源
      最近更新 更多