微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Jenkins 在 Mac M1 代理上无法正常工作

如何解决Jenkins 在 Mac M1 代理上无法正常工作

我们希望使用配备 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 代理使用 Java。如果您通过 brew(例如,adaptopenjdk8)安装 Java,您可能会获得一个使用 Rosetta 翻译层运行的 x64 版本(截至 2021 年 3 月)。您可以通过执行 sysctl sysctl.proc_translated 来验证这一点。在“正常”SSH 连接中,这应该返回 0,当在 Jenkins 中作为 sh "sysctl sysctl.proc_translated" 执行时,您将看到 1。

首选选项(安装本机 JDK)

您可以通过以下方式安装 zulu JDK,而不是使用,例如,adaptopenjdk8,这是本机可用的

brew install --cask zulu

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

Hotfix(不改变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 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。