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

9

我们希望使用搭载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直接连接到机器时没有这个问题。即使手动设置环境变量也没有改变任何东西。
1个回答

9

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

首选选项(安装本地JDK)

不要使用,例如adoptopenjdk8,你可以安装zulu JDK,它是可用本地的,通过如下方式安装:

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 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接