Jenkins 在 Mac M1 代理上无法正常工作
Jenkins does not work properly on Mac M1 agent
我们想在我们的 CI 管道中使用带有 M1 处理器的 Mac Mini 作为代理,以确保具有新 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 代理使用 Java。如果您通过 brew 安装 Java(例如,adoptopenjdk8),您可能会得到一个使用 Rosetta 翻译层的 运行 x64 版本(截至 2021 年 3 月)。您可以通过执行 sysctl sysctl.proc_translated
来验证这一点。在“正常”的 SSH 连接中,这应该是 return 0,当在 Jenkins 中执行为 sh "sysctl sysctl.proc_translated"
时,你会看到一个 1.
首选选项(安装本机 JDK)
而不是使用,例如,adoptopenjdk8,你可以安装 zulu JDK,它是本地可用的,通过
brew install --cask zulu
在此之后,您应该能够验证 proc_translated
在 Jenkins 中是否为 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
我们想在我们的 CI 管道中使用带有 M1 处理器的 Mac Mini 作为代理,以确保具有新 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 代理使用 Java。如果您通过 brew 安装 Java(例如,adoptopenjdk8),您可能会得到一个使用 Rosetta 翻译层的 运行 x64 版本(截至 2021 年 3 月)。您可以通过执行 sysctl sysctl.proc_translated
来验证这一点。在“正常”的 SSH 连接中,这应该是 return 0,当在 Jenkins 中执行为 sh "sysctl sysctl.proc_translated"
时,你会看到一个 1.
首选选项(安装本机 JDK)
而不是使用,例如,adoptopenjdk8,你可以安装 zulu JDK,它是本地可用的,通过
brew install --cask zulu
在此之后,您应该能够验证 proc_translated
在 Jenkins 中是否为 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