jenkins pipeline学习笔记

背景和需求

社区广场的自动化用例中,需要执行完用例,转化测试报告格式,测试结果发送钉钉群,测试结果上报质量平台等多个流程,jenkins自由风格不太好满足这个需求,因此考虑用pipeline管线来实现。
手动工作流程运行(下面的流程需要依赖上面的流程):
流程1:npx playwright test
流程2:npx ts-node ci/report-converter.ts
流程3:npx ts-node ci/dingtalk-notifier.ts

介绍

Jenkins Pipeline 是一种用于定义CI/CD(持续集成/持续交付)流程的自动化工具。它允许开发者通过代码的形式定义构建、测试和部署过程,从而实现高度的可维护性和灵活性。

主要概念

1. 声明式Pipeline与脚本式Pipeline

  • 声明式Pipeline:使用更简洁的语法来定义Pipeline,适合大多数场景。

  • 脚本式Pipeline:基于Groovy语言,提供更大的灵活性,适用于复杂的逻辑处理。

2. Pipeline的参数说明

  • Stage:代表了Pipeline中的一个步骤,如编译、测试等。

  • Step:在Stage内执行的具体操作。

  • Agent:指定运行Pipeline或特定Stage的工作节点。

  • Post:定义Pipeline结束后的行为,比如发送通知或者清理环境。

创建你的第一个Pipeline

示例 - 简单的声明式Pipeline

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo 'Building..'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing..'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying....'
            }
        }
    }
}

解释

  • agent any 表示这个Pipeline可以在任何可用的代理上运行。

  • 每个stage定义了一个构建阶段,而每个阶段包含若干steps来完成具体任务。

  • echo是Jenkins提供的一个简单命令,用来输出信息到控制台。

高级特性

并行执行

通过parallel参数可以并行执行多个Stage以提高效率:

pipeline {
    agent any
    stages {
        stage('Parallel Stage') {
            parallel {
                stage('Build Web') {
                    steps {
                        echo 'Building Web...'
                    }
                }
                stage('Build Mobile') {
                    steps {
                        echo 'Building Mobile...'
                    }
                }
            }
        }
    }
}

参数化Pipeline

通过parameters参数,用户可以在触发Pipeline时输入参数:

pipeline {
    agent any
    parameters {
        string(name: 'BRANCH_NAME', defaultValue: 'master', description: 'Branch to build')
    }
    stages {
        stage('Build') {
            steps {
                echo "Building ${params.BRANCH_NAME} branch..."
            }
        }
    }
}

项目代码

pipeline {
    agent {
        label 'mobile-record-playback' ,//运行的工作节点
    }
    
    stages {
        stage('Setup & Test') {
            steps {
                sh '''
                    cd ${WORKSPACE}
                    npm install
                    npx playwright install --with-deps
                    echo "✅ 依赖安装完成"
                    npx playwright test || true
                    echo "✅ 测试运行完成"
                '''
            }
        }
        
        stage('Report & Notify') {
            steps {
                sh '''
                    cd ${WORKSPACE}
                    npx ts-node ci/report-converter.ts 
                    echo "✅ 报告转换完成"
                    npx ts-node ci/dingtalk-notifier.ts
                    echo "✅ 钉钉通知发送完成"
                '''
            }
        }
    }
    
    post {
        always {
            publishHTML([
                allowMissing: false,
                alwaysLinkToLastBuild: true,
                keepAll: true,
                reportDir: 'playwright-report',
                reportFiles: 'index.html',
                reportName: 'Playwright Test Report'
            ])
            publishHTML([
                allowMissing: false,
                alwaysLinkToLastBuild: true,
                keepAll: true,
                reportDir: 'playwright-report',
                reportFiles: 'report.json',
                reportName: 'Playwright Test Report JSON'
            ])
            script {
                echo '上报测试结果'
                sh(returnStdout: false, script: "(sleep 30 && curl -X GET --header 'Accept: application/json' '后端提供的接口?jobName=editor-test-qa-platform') &")
            }
        }
        
        success {
            echo "🎉 Pipeline执行成功!"
        }
        
        failure {
            echo "❌ Pipeline执行失败!"
        }
    }
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。