当前位置: 首页 > 知识库问答 >
问题:

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

明松
2023-03-14

我在尝试做一些我觉得应该很简单的事情,但是我不知道怎么做。

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

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

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

我试图把< code>post块放在任何地方,但是它就是不工作。如果我尝试将< code>post块放入测试阶段或作为< code>stages的同级,我会得到以下错误:

必需的上下文类 hudson。FilePath 丢失 也许您忘记用提供此内容的步骤将代码括起来,例如:代理 none 引起的节点 - post 块不知道在哪里运行。

因此,我尝试在测试阶段的< code>parallel步骤中,将< code>post块放在< code>node块内,但是它似乎没有做任何事情——它甚至没有出现在控制台输出中。

这是我的詹金斯文件

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个答案

韩飞翮
2023-03-14

>

  • <code>post{}</code>块只应遵循<code>步骤{{}</code>或<code>并行{}

    如果您需要在节点环境中执行post,您应该为整个阶段提供一个节点(agent{}语句)。

    您可以尝试使用并行阶段执行。我还建议使用函数来缩短代码

    大概是这样的:

    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.)
        }
    }
    

    或者,您可以在 post 语句中使用 node

    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
                    )
                }
            }
        }
    }
    

  •  类似资料:
    • 我刚开始使用Jenkins声明性管道。在我支持一些类似的项目时,我考虑将类似的管道步骤(甚至阶段)放入可重用的构建块中。这些区块应保持在一个中心点,然后由单独的管道包括在内(例如:干燥)。 我将共享库视为脚本化管道的一个选项,但我不确定它是否也适用于声明性管道。 你知道在Jenkins声明性管道中使用像构建块这样的东西的方法吗? 举例说明: 如果您有一个用于Maven项目的标准管道(例如Sprin

    • 我在詹金斯内部写了一个声明性管道。此管道应在远程Docker服务器上的Docker容器中运行。 我阅读了自定义执行环境: 自定义执行环境 Pipeline的设计可以轻松地将Docker映像用作单个阶段或整个管道的执行环境。这意味着用户可以定义其管道所需的工具,而无需手动配置代理。实际上,任何可以打包在Docker容器中的工具。只需对Jenkins文件进行少量编辑即可轻松使用。 它工作,但它使用詹金

    • 我有几个不同repo的Jenkins声明性管道,它们触发数据库刷新,以及依赖于数据库的单元测试。这些Jenkins作业是从GitHub中的pull请求触发的。 为了避免资源冲突,我需要防止这些作业同时运行——无论是在每个项目内还是在各个项目之间。 “油门并发构建”插件似乎就是为此而构建的。 我已经安装了插件,并配置了如下类别: 我在Jenkins文件中添加了“throttle”选项,其中一个存储库

    • 我的存储库中有一个带有Jenkinsfile的多分支管道,我能够拥有我的CI工作流程(构建 为了设置我的夜间构建,我添加了 但是现在,如果我们只是在晚上构建由cron表达式触发的作业,如何执行分析步骤呢? 我的简化构建阶段如下所示:

    • 我想从Jenkins声明性管道中设置构建名称和描述,但是找不到正确的方法。我尝试在管道后使用环境括号,在代理括号中使用节点括号,等等。我总是得到语法错误。 我的Jenkinsfile的最后版本是这样的: 错误是: 理想情况下,我希望能够从构建中读取MY_PROJECT和MY_VERSION_NUMBER。属性文件,或从Jenkins构建日志。对于该要求的任何指导也将不胜感激。 更新 根据我下面的回

    • 在Jenkins脚本管道中,您可以像这样设置PATH env变量: 注意这里解释的路径MAVENhttps://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#code-withenv代码集环境变量: 要设置的环境变量列表,每个变量的形式为VARIABLE=value或VARIABLE=以取消设置其他定义的变量。您还可以使用语法PATH wh