如何使用Jenkins声明性管道在多个平台上构建和测试

如何使用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 也许您忘记了用一个提

我想做一些我觉得应该简单的事情,但我不知道怎么做

基本上我有一个Jenkins主机(在Linux上运行)和两个从机,一个在Windows上,另一个在macOS上

我想在所有3个平台上构建我的项目,并在所有3个平台上运行GTest测试

我可以构建和运行测试,但是junit步骤似乎没有收集任何测试结果

我试着把
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
                    )
                }
            }
        }
    }