我们有一个相当大的 C++ 项目,我们正在从 QT5.15.2 迁移到 QT6.5.3,在此过程中,我们的一些测试开始失败。 我们正在多个平台(Linux、MacOS 和 Windows)上进行构建,因此使用不同的托管运行器。
在 Linux 和 Mac 上,构建和测试像以前一样工作,但在 Windows 上,一些测试开始失败。我们从 GitHub 收到的唯一错误是“错误:进程已完成,退出代码为 127”。根据我的发现,这可能表明文件丢失。此时我已经尝试了几乎所有方法来确定可能是什么文件,但到目前为止还没有运气。
这是我们用于测试的步骤
jobs:
build-and-test:
strategy:
matrix:
os: ["windows", "linux", "macos"]
include:
- os: windows
runner: 07.04.05-windows-2022-16core
- os: linux
runner: 07.04.05-ubuntu-20.04-8core
- os: macos
runner: macos-12-large
fail-fast: true
runs-on: ${{matrix.runner}}
env:
build_type: RelWithDebInfo
- name: Run cmake
if: steps.prepare-env.outputs.shouldbuild == 1
env:
GITLAB_PAT: ${{ secrets.GITLAB_PAT }}
run: >
cd build &&
cmake .. ${{steps.prepare-env.outputs.buildflags}} -DCMAKE_BUILD_TYPE=${{env.build_type}} -DBUILD_NUMBER="Build GI-${{github.run_number}}" -DTEST_REPORT=1
- name: Set permissions on test
if: matrix.os == 'windows' && steps.prepare-env.outputs.shouldbuild == 1
env:
ACTIONS_STEP_DEBUG: true
QT_WIN_DEBUG_CONSOLE: attach
shell: bash
run: >
cd build &&
cmake --build . --config ${{env.build_type}} -j ${{steps.prepare-env.outputs.cores}} --target MyTest &&
cd Bin &&
dir &&
chmod +x "C:\a\projectName\build\Bin\MyTest.exe"
- name: Run test manually
if: matrix.os == 'windows' && steps.prepare-env.outputs.shouldbuild == 1
env:
ACTIONS_STEP_DEBUG: true
QT_WIN_DEBUG_CONSOLE: attach
shell: bash
run: >
cd build &&
"C:\a\projectName\build\Bin\MyTest.exe"
我尝试在构建之前运行测试,在这种情况下我也得到 127,但带有解释性“C:\projectname uild\Bin\MyTest.exe:没有这样的文件或目录”
我尝试在可用的 Windows 服务器上手动运行失败的测试(通过获取 dir 命令显示的 bin 文件夹中可用的文件),并且执行时没有出现任何问题。
失败的测试和正常的测试之间的区别在于,失败的测试使用的是我们自己构建的自定义库,但构建过程没有改变,只是 QT 版本改变了。我已经验证我们依赖的新 QT 模块存在于构建服务器上的 bin 文件夹中。
在理想的世界中,我会登录到构建服务器并从构建输出手动运行测试以获取一些信息,但我们遇到了这个相当无用的 127 错误。
关于如何调试此 127 错误有什么好主意吗?
所以错误的原因是我们使用的是针对 QT5 构建的 Sentry 库。当我绕过测试以进行发布时,我能够在自己的计算机上尝试该应用程序,然后向我显示一个弹出窗口,其中包含缺少的 dll (QT5)。 通过使用依赖项工具进行一些挖掘,我找到了罪魁祸首。
我仍然不明白,为什么 GitHub 除了 127 之外不能给出有用的答案,但至少现在我可以继续前进。