背景和需求
社区广场的自动化用例中,需要执行完用例,转化测试报告格式,测试结果发送钉钉群,测试结果上报质量平台等多个流程,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执行失败!"
}
}
}