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