如何配置Jenkins Pipeline推送代码时单命令运行指定Cypress测试目录
Cypress + Jenkins 按指定目录执行测试配置方案
1. 改造Cypress运行命令支持动态传参
打开项目根目录package.json,在scripts节点新增支持接收目录参数的运行指令,避免每次改动配置:
{ "scripts": { "cy:run": "cypress run", "cy:run:folder": "cypress run --spec \"cypress/integration/$TEST_FOLDER/**/*.js\"" } }
如果需要兼容Windows执行环境,先安装cross-env做跨平台环境变量处理,把上面的cy:run:folder脚本改成:"cy:run:folder": "cross-env cypress run --spec \"cypress/integration/$TEST_FOLDER/**/*.js\""
2. 编写参数化Jenkins Pipeline
在项目根目录新建Jenkinsfile,核心逻辑是通过构建参数控制要执行的测试目录,既支持手动选择目录触发,也支持代码推送时自动匹配目录:
pipeline { agent any // 定义可选测试目录参数 parameters { choice( name: 'TEST_FOLDER', choices: ['', 'pulse', 'apps'], description: '选择要执行的测试目录,留空则执行全量用例' ) } stages { stage('拉取代码&安装依赖') { steps { checkout scm sh 'npm ci' } } // 自动触发场景下,根据代码变更路径自动匹配测试目录 stage('自动匹配测试目录(webhook触发专用)') { when { not { triggeredBy 'UserIdCause' } // 手动触发时跳过该逻辑 } steps { script { def changedPaths = currentBuild.changeSets.collect { cs -> cs.items.collect { it.affectedPaths } }.flatten() // 按代码改动路径匹配对应测试目录,可根据自己的业务代码路径调整规则 if (changedPaths.any { it.startsWith('src/pulse/') }) { params.TEST_FOLDER = 'pulse' } else if (changedPaths.any { it.startsWith('src/apps/') }) { params.TEST_FOLDER = 'apps' } else { params.TEST_FOLDER = '' // 公共配置/依赖改动默认跑全量 } } } } stage('执行Cypress测试') { steps { script { if (params.TEST_FOLDER?.trim()) { sh "npm run cy:run:folder" } else { sh "npm run cy:run" } } } } stage('归档测试产物') { steps { archiveArtifacts artifacts: 'cypress/screenshots/**/*,cypress/videos/**/*', allowEmptyArchive: true } } } }
3. 单命令触发指定目录测试
配置好Pipeline后,不管是本地触发、CI系统联动还是推送代码自动触发,都可以通过参数控制执行范围:
- 手动在Jenkins面板触发时,直接在参数下拉框选目标目录即可
- 命令行触发pulse目录测试:
curl -X POST 你的Jenkins地址/job/你的流水线任务名/buildWithParameters?TEST_FOLDER=pulse --user 你的Jenkins用户名:你的Jenkins API Token
- 配置Git webhook触发时,在钩子逻辑里按改动路径带上
TEST_FOLDER参数即可,推送pulse模块代码时自动传入TEST_FOLDER=pulse,对应目录用例自动执行,不用跑全量。
注意:如果你使用Cypress 10及以上版本,默认测试目录已经从cypress/integration调整为cypress/e2e,对应修改脚本里的spec路径匹配规则即可。后续如果新增其他测试目录,只需要在Jenkins参数的choices列表里加上对应目录名,再补充下自动匹配的路径规则就行,不需要改动核心执行逻辑。
内容的提问来源于stack exchange,提问作者Jay Patel
相关产品推荐
相关产品推荐

