如何使用Jenkins声明性管道在多个平台上构建和测试
我想做一些我觉得应该简单的事情,但我不知道怎么做 基本上我有一个Jenkins主机(在Linux上运行)和两个从机,一个在Windows上,另一个在macOS上 我想在所有3个平台上构建我的项目,并在所有3个平台上运行GTest测试 我可以构建和运行测试,但是junit步骤似乎没有收集任何测试结果 我试着把如何使用Jenkins声明性管道在多个平台上构建和测试,jenkins,cmake,jenkins-pipeline,googletest,jenkins-declarative-pipeline,Jenkins,Cmake,Jenkins Pipeline,Googletest,Jenkins Declarative Pipeline,我想做一些我觉得应该简单的事情,但我不知道怎么做 基本上我有一个Jenkins主机(在Linux上运行)和两个从机,一个在Windows上,另一个在macOS上 我想在所有3个平台上构建我的项目,并在所有3个平台上运行GTest测试 我可以构建和运行测试,但是junit步骤似乎没有收集任何测试结果 我试着把post块放在任何地方,但它就是不起作用。如果我试图将post块放在测试阶段或作为stages的同级,我会得到以下错误: 缺少必需的上下文类hudson.FilePath 也许您忘记了用一个提
post
块放在任何地方,但它就是不起作用。如果我试图将post
块放在测试阶段或作为stages
的同级,我会得到以下错误:
缺少必需的上下文类hudson.FilePath
也许您忘记了用一个提供此功能的步骤来包围代码,例如:node
这是由agent none
引起的-post
块不知道在哪里运行
因此,我尝试在测试阶段的parallel
步骤中将post
块放在节点
块中,但它似乎没有做任何事情-它甚至没有显示在控制台输出中
这是我的Jenkinsfile
:
管道{
一号特工
舞台{
舞台(“清洁”){
台阶{
平行的(
“linux”:{
节点(“linux”){
目录(“构建”){
deleteDir()
writeFile:'dummy',文本:“”//创建目录
}
}
},
“窗口”:{
节点('窗口'){
目录(“构建”){
deleteDir()
writeFile:'dummy',文本:“”//创建目录
}
}
},
“mac”:{
节点('mac'){
目录(“构建”){
deleteDir()
writeFile:'dummy',文本:“”//创建目录
}
}
}
)
}
}
阶段(‘构建’){
台阶{
平行的(
“linux”:{
节点(“linux”){
校验scm
目录(“构建”){
sh'/opt/cmake/bin/cmake..-DCMAKE\u BUILD\u TYPE=Release'
“制造”
}
}
},
“窗口”:{
节点('窗口'){
签出(changelog:false,scm:scm)//将日志更改为false,否则Jenkins将显示重复项。只有linux(Jenkins主控)启用了更改日志。
目录(“构建”){
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\u NUMBER}/m”
}
}
},
“mac”:{
节点('mac'){
签出(changelog:false,scm:scm)//将日志更改为false,否则Jenkins将显示重复项。只有linux(Jenkins主控)启用了更改日志。
目录(“构建”){
sh'cmake..-DCMAKE\u PREFIX\u PATH=/usr/local/ceral/qt/5.9.1-DCMAKE\u BUILD\u TYPE=Release'
“制造”
}
}
}
)
}
}
阶段(“测试”){
台阶{
平行的(
“linux”:{
节点(“linux”){
目录('Build'){
sh./bin/project tests--gtest_output=xml:project tests results.xml'
//在此处添加其他测试可执行文件。
}
职位{
总是{
junit'*-tests results.xml'
}
}
}
},
“窗口”:{
节点('窗口'){
目录(“构建”){
bat'tests\\project\\Release\\project tests--gtest_output=xml:project tests results.xml'
//在此处添加其他测试可执行文件。
}
职位{
总是{
junit'*-tests results.xml'
}
}
}
},
“mac”:{
节点('mac'){
目录(“构建”){
sh./bin/project tests--gtest_output=xml:project tests results.xml'
//在此处添加其他测试可执行文件。
}
职位{
总是{
junit'*-tests results.xml'
}
}
}
}
)
}
}
}
}
我做错了什么
post{}
块只能跟在st之后
void Clean() {
dir("build") {
deleteDir()
writeFile file:'dummy', text:'' // Creates the directory
}
}
void SmthElse(def optionalParams) {
// some actions here
}
pipeline {
agent none
options {
skipDefaultCheckout(true) // to avoid force checkouts on every node in a first stage
disableConcurrentBuilds() // to avoid concurrent builds on same nodes
}
stages {
stage('Clean') {
failfast false
parallel {
stage('Linux') {
agent {label 'linux'}
steps {Clean()}
post {
// post statements for 'linux' node
SmthElse(someParameter)
}
}
stage('Windows') {
agent {label 'windows'}
steps {Clean()}
post {
// post statements for 'windows' node
}
}
stage('MacOS') {
agent {label 'mac'}
steps {Clean()}
post {
// post statements for 'mac' node
}
}
}
post {
// Post statements OUTSIDE of nodes (i.e. send e-mail of a stage completion)
}
}
// other stages (Build/Test/Etc.)
}
}
stage('Test') {
steps {
// your parallel Test steps
}
post {
always {
script {
parallel (
"linux" : {
node('linux') {
// 'linux' node post steps
}
},
"windows" : {
node('windows') {
// 'windows' node post steps
}
}
// etc
)
}
}
}
}