我想做一件我觉得应该很简单的事,但我不知道怎么做。
基本上我有一个Jenkins主程序(运行在Linux上)和两个从程序,一个在Windows上,另一个在MacOS上。
我想在所有3个平台上构建我的项目,并在所有3个平台上运行GTest测试。
我可以构建并运行测试,但是junit步骤似乎没有收集到任何测试结果。
我试着把post
块放在任何地方,但是它不起作用。如果我试着把post
块放在测试阶段或者作为stages
的兄弟,我会得到下面的错误:Required context class hudson.FilePath is missing Perhaps you forgot to surround the code with a step that provides this, such as: node
,由agent none
引起-post
块不知道运行到哪里。
因此,我尝试在测试阶段的parallel
步骤中将post
块放在node
块内,但它似乎没有做任何事情-它甚至没有显示在控制台输出中。
下面是我的Jenkinsfile
:
pipeline {
agent none
stages {
stage ('Clean') {
steps {
parallel (
"linux" : {
node ("linux") {
dir("build") {
deleteDir()
writeFile file:'dummy', text:'' // Creates the directory
}
}
},
"windows" : {
node('windows') {
dir("build") {
deleteDir()
writeFile file:'dummy', text:'' // Creates the directory
}
}
},
"mac" : {
node('mac') {
dir("build") {
deleteDir()
writeFile file:'dummy', text:'' // Creates the directory
}
}
}
)
}
}
stage ('Build') {
steps {
parallel (
"linux" : {
node ("linux") {
checkout scm
dir("build") {
sh '/opt/cmake/bin/cmake .. -DCMAKE_BUILD_TYPE=Release'
sh 'make'
}
}
},
"windows" : {
node('windows') {
checkout(changelog: false, scm: scm) // Changelog to false, otherwise Jenkins shows duplicates. Only linux (the Jenkins master) has the changelog enabled.
dir("build") {
bat 'cmake .. -G "Visual Studio 15 2017 Win64" -DCMAKE_PREFIX_PATH=C:/Qt/5.9.1/msvc2017_64'
bat "\"${tool 'MSBuild'}\" project.sln /p:Configuration=Release /p:Platform=\"x64\" /p:ProductVersion=1.0.0.${env.BUILD_NUMBER} /m"
}
}
},
"mac" : {
node('mac') {
checkout(changelog: false, scm: scm) // Changelog to false, otherwise Jenkins shows duplicates. Only linux (the Jenkins master) has the changelog enabled.
dir("build") {
sh 'cmake .. -DCMAKE_PREFIX_PATH=/usr/local/Cellar/qt/5.9.1 -DCMAKE_BUILD_TYPE=Release'
sh 'make'
}
}
}
)
}
}
stage ('Test') {
steps {
parallel (
"linux" : {
node ("linux") {
dir('Build') {
sh './bin/project-tests --gtest_output=xml:project-tests-results.xml'
// Add other test executables here.
}
post {
always {
junit '*-tests-results.xml'
}
}
}
},
"windows" : {
node('windows') {
dir("build") {
bat 'tests\\project\\Release\\project-tests --gtest_output=xml:project-tests-results.xml'
// Add other test executables here.
}
post {
always {
junit '*-tests-results.xml'
}
}
}
},
"mac" : {
node('mac') {
dir("build") {
sh './bin/project-tests --gtest_output=xml:project-tests-results.xml'
// Add other test executables here.
}
post {
always {
junit '*-tests-results.xml'
}
}
}
}
)
}
}
}
}
我做错了什么?
1条答案
按热度按时间ikfrs5lh1#
post{}
块应仅在steps{}
或parallel{}
(对于并行级)之后生效。1.如果需要在节点环境中执行post,则应向整个阶段提供一个节点(
agent{}
语句)。你可以尝试使用并行阶段执行。我也建议使用函数来缩短代码。
大概是这样的:
或者,您可以在post语句中使用
node
: