我正在做一个CMake项目。对于CI,我已经决定使用Azure管道。然而,在测试阶段,我在MacOS上面临一个小问题。问题是MacOS无法找到测试可执行文件,即使它在那里也是如此。
早些时候,我的项目建设得不太好。但是现在,除了MacOS上的小故障之外,整个管道成功运行(多亏了Stack溢出社区)。我已经更新了我的问题,现在它告诉了问题是什么,我如何解决它,以便它可能是有益于其他像我这样的人,谁是新的世界的CI。
编辑1
早些时候,我的CMake任务没有触发构建过程。这是因为我没有向CMake提供任何命令行参数。我所做的就是:
- task: CMake@1
displayName: Generate CMake Cache
inputs:
workingDirectory: build我假设CMake任务会自动驱动构建过程,因为在文档中并没有明确说明该任务的实际操作。这除了打印CMake用法之外,什么也没有做。然后,我发现我们必须使用适当的命令行参数两次运行CMake任务(一次用于项目配置,然后用于实际构建)。
编辑2
这是我更新的AzurePipelines.yml文件
Azure管道CI
stages:
- stage: Build
displayName: Build
jobs:
- job: RunCMakeTask
displayName: Run CMake Task
strategy:
matrix:
LinuxDebug:
OS: 'Linux'
imageName: 'ubuntu-latest'
BuildConfiguration: 'Debug'
LinuxRelease:
OS: 'Linux'
imageName: 'ubuntu-latest'
BuildConfiguration: 'RelWithDebInfo'
MacOSDebug:
OS: 'MacOS'
imageName: 'macos-latest'
BuildConfiguration: 'Debug'
MacOSRelease:
OS: 'MacOS'
imageName: 'macos-latest'
BuildConfiguration: 'RelWithDebInfo'
WindowsDebug:
OS: 'Windows'
imageName: 'windows-latest'
BuildConfiguration: 'Debug'
WindowsRelease:
OS: 'Windows'
imageName: 'windows-latest'
BuildConfiguration: 'RelWithDebInfo'
pool:
vmImage: $(imageName)
steps:
- script: mkdir $(BuildConfiguration)
displayName: Create Build Directory
workingDirectory: $(Build.SourcesDirectory)
- task: CMake@1
displayName: Generate CMake Cache
inputs:
workingDirectory: $(BuildConfiguration)
cmakeArgs: '-DCMAKE_BUILD_TYPE=$(BuildConfiguration) ..'
- task: CMake@1
displayName: Run Build Process
inputs:
workingDirectory: $(BuildConfiguration)
cmakeArgs: '--build . --config $(BuildConfiguration)'
- task: PublishPipelineArtifact@1
displayName: Publish Build Artifact
inputs:
targetPath: $(BuildConfiguration)
artifactName: '$(OS)$(BuildConfiguration)'
- stage: Test
displayName: Test
dependsOn: Build
jobs:
- job: RunCTestOnWindows
displayName: Run CTest on Windows
variables:
OS: Windows
strategy:
matrix:
Debug:
BuildConfiguration: 'Debug'
Release:
BuildConfiguration: 'RelWithDebInfo'
pool:
vmImage: 'windows-latest'
steps:
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact
inputs:
artifact: '$(OS)$(BuildConfiguration)'
path: $(Build.SourcesDirectory)/$(BuildConfiguration)
- script: ctest -C $(BuildConfiguration) --output-on-failure
workingDirectory: $(BuildConfiguration)
- job: RunCTestOnUnixBasedSystems
displayName: Run CTest on Unix Based Systems
strategy:
matrix:
LinuxDebug:
OS: 'Linux'
imageName: 'ubuntu-latest'
BuildConfiguration: 'Debug'
LinuxRelease:
OS: 'Linux'
imageName: 'ubuntu-latest'
BuildConfiguration: 'RelWithDebInfo'
MacOSDebug:
OS: 'MacOS'
imageName: 'macos-latest'
BuildConfiguration: 'Debug'
MacOSRelease:
OS: 'MacOS'
imageName: 'macos-latest'
BuildConfiguration: 'RelWithDebInfo'
steps:
- task: DownloadPipelineArtifact@2
displayName: Download Build Artifact
inputs:
artifact: '$(OS)$(BuildConfiguration)'
path: $(Build.SourcesDirectory)/$(BuildConfiguration)
- script: find $(BuildConfiguration)/Tests -type f -name "Test*" ! -name "*.*" ! -exec chmod u+rx {} \;
displayName: Change File Permissions
- script: ctest -C $(BuildConfiguration) --output-on-failure
workingDirectory: $(BuildConfiguration)该管道在Windows和Linux上运行良好,但我在MacOS上面临一个小问题。在MacOS上,即使在测试可执行文件存在的情况下,ctest也无法找到它。(如果我的管道或CMakeLists.txt文件有任何问题,它也应该在Windows和Linux上失败)
编辑3
在MacOS的测试阶段,我得到了错误:
测试项目/home/vst/work/1/s/Debug 1: /Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations无法在以下位置找到可执行的StringOperations_CaseIgnore : /Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations /Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations /Users/runner/work/1/s/Debug/Tests/StringOperations/Debug/TestStringOperations /User/runner/work/1/s/Debug/ Test /字符串操作/调试/测试字符串操作Debug//Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations Debug//Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations Users/runner/work/1/s/Debug/Tests/StringOperations/Debug/TestStringOperations Users/runner/work/1/s/Debug/Tests/StringOperations/Debug/TestStringOperations调试/用户/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations Debug/Users/runner/work/1/s/Debug/Tests/StringOperations/TestStringOperations 1/1测试#1: StringOperations_CaseIgnore ......***Not运行0.00秒 0%通过测试,1次测试失败 测试总时间(实)= 0.00秒 以下测试失败:1- StringOperations_CaseIgnore (未运行)在运行CTest时无法找到可执行文件:CTest错误
编辑4
我试图通过以下方法检查测试可执行文件是否实际存在:
ls -l Debug/Tests/StringOperations这是输出:
drwxr-xr-x 3 vsts docker 4096 Aug 6 15:05 CMakeFiles
-rw-r--r-- 1 vsts docker 1208 Aug 6 15:05 cmake_install.cmake
-rw-r--r-- 1 vsts docker 642 Aug 6 15:05 CTestTestfile.cmake
-rw-r--r-- 1 vsts docker 9838 Aug 6 15:05 Makefile
-rwxr--r-- 1 vsts docker 1715072 Aug 6 15:05 TestStringOperations这证实了测试可执行文件(TestStringOperations)在Windows和Linux中相同的位置,但进程仍然失败。
如果您需要这个可执行文件,下面是它的CMakeLists.txt:
Set(SRC StringOperations.cpp)
Add_Executable(TestStringOperations ${SRC})
Target_Include_Directories(TestStringOperations PUBLIC
${HEADER_PATH}/StringOperations
)
Target_Link_Libraries(TestStringOperations
PRIVATE ${GTEST_LIBS}
PRIVATE StringOperations
)
Add_Test(NAME StringOperations_CaseIgnore COMMAND TestStringOperations)我试着在Stack溢出和其他一些网站上寻求这个问题的帮助,但是他们的解决方案并没有让我受益。
例如:CTest找不到可执行文件和CMake:如何指定ctest应该查找可执行文件的目录?
如果您需要更多信息,这里是我在GitHub上的项目。您还可以参考dev.azure.com上的管道日志。
你能帮我解决这个问题吗?任何关于这个文件的全面实施的建议也是值得欢迎的。
发布于 2020-08-05 15:06:03
在构建之后尝试运行一个发布管道工件任务。正如注释中所回避的那样,这将发布您的构建内容,并允许跨阶段共享。
完成此操作之后,您还可以将其视为管道UI中发布的工件。
# Publish pipeline artifacts
# Publish (upload) a file or directory as a named artifact for the current run
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Pipeline.Workspace)'
artifactName: # 'drop'另外,在阶段结束时可以完成的另一个肠道检查是包含一个powershell脚本,以查看您正在工作的目录的内容:
-powershell: Get-ChildItem -Path 'Insert root path' -recursehttps://stackoverflow.com/questions/63131708
复制相似问题