在AWS CodeBuild中运行Cypress
您将学习到
- 如何在AWS CodeBuild中设置Cypress测试
- 如何缓存依赖项和构建产物
- 如何在AWS CodeBuild中并行运行Cypress测试
- 如何将Cypress Cloud与AWS CodeBuild结合使用
基础设置
以下示例展示了使用AWS CodeBuild在Electron浏览器中运行Cypress测试的基础CI设置和任务。此AWS CodeBuild配置位于buildspec.yml
中。
详细文档请参阅AWS CodeBuild文档。
version: 0.2
phases:
install:
runtime-versions:
nodejs: latest
commands:
# 设置COMMIT_INFO变量以便在录制时将Git信息发送到Cypress Cloud
# https://docs.cypress.io/app/continuous-integration/overview#Git-information
- export COMMIT_INFO_BRANCH="$(git rev-parse HEAD | xargs git name-rev |
cut -d' ' -f2 | sed 's/remotes\/origin\///g')"
- export COMMIT_INFO_MESSAGE="$(git log -1 --pretty=%B)"
- export COMMIT_INFO_EMAIL="$(git log -1 --pretty=%ae)"
- export COMMIT_INFO_AUTHOR="$(git log -1 --pretty=%an)"
- export COMMIT_INFO_SHA="$(git log -1 --pretty=%H)"
- export COMMIT_INFO_REMOTE="$(git config --get remote.origin.url)"
- npm ci
pre_build:
commands:
- npm run cy:verify
- npm run cy:info
build:
commands:
- npm run start:ci &
- npx cypress run --record
此buildspec的工作原理:
- 当代码推送到此仓库时,此任务将启动一个AWS托管的Amazon Linux实例,并安装Node.js以运行配置中
commands
部分声明的pre_build
和build
命令。 - AWS CodeBuild将从我们的GitHub仓库检出代码。
- 最后,我们的
buildspec.yml
配置将:- 安装npm依赖项
- 启动项目Web服务器(
npm start:ci
) - 在Electron中运行GitHub仓库中的Cypress测试。
要亲自尝试上述示例,请分叉Cypress Kitchen Sink示例项目,并将上述AWS CodeBuild配置放入buildspec.yml
。
使用Cypress Docker镜像测试
从版本0.2开始,CodeBuild不提供为单个构建配置指定自定义镜像的方法。一种解决方法是使用AWS CodeBuild批量构建列 表策略。
启用批量构建
根据AWS CodeBuild批量构建文档,AWS CodeBuild为批量构建列表策略中的每个可能配置组合创建单独的构建。因此,必须创建或更新AWS CodeBuild项目以运行批量配置。
按照以下步骤为现有的AWS CodeBuild项目启用批量配置:
- 导航到AWS CodeBuild控制台
- 选择项目
- 点击"编辑" --> "批量配置"
- 创建"新服务角色"并输入角色名称
- 保留其他选项为可选
- 点击"更新批量配置"
- 开始构建
Cypress Amazon公共ECR
AWS CodeBuild提供了一种构建列表策略,用于为单个作业定义指定不同的作业配置。
构建列表策略提供了一种方法来指定托管在Docker Hub或Amazon Elastic Container Registry (ECR)上的镜像。
用于在本地和CI中运行Cypress的Docker镜像发布到Amazon ECR公共画廊:
阅读Cypress docker变体以决定哪个镜像最适合您的项目。
version: 0.2
## AWS CodeBuild 批量配置
## https://docs.aws.amazon.com/codebuild/latest/userguide/batch-build-buildspec.html
## 定义使用Cypress Amazon ECR公共画廊中的
## "cypress/browsers:22.15.0"镜像运行的构建
batch:
fast-fail: false
build-list:
- identifier: cypress-e2e-tests
env:
image: public.ecr.aws/cypress-io/cypress/browsers:22.15.0
phases:
install:
runtime-versions:
nodejs: latest
commands:
# 设置COMMIT_INFO变量以便在录制时将Git信息发送到Cypress Cloud
# https://docs.cypress.io/app/continuous-integration/overview#Git-information
- export COMMIT_INFO_BRANCH="$(git rev-parse HEAD | xargs git name-rev |
cut -d' ' -f2 | sed 's/remotes\/origin\///g')"
- export COMMIT_INFO_MESSAGE="$(git log -1 --pretty=%B)"
- export COMMIT_INFO_EMAIL="$(git log -1 --pretty=%ae)"
- export COMMIT_INFO_AUTHOR="$(git log -1 --pretty=%an)"
- export COMMIT_INFO_SHA="$(git log -1 --pretty=%H)"
- export COMMIT_INFO_REMOTE="$(git config --get remote.origin.url)"
- npm ci
pre_build:
commands:
- npm run cy:verify
- npm run cy:info
build:
commands:
- npm run start:ci &
- npx cypress run --record --browser firefox
缓存依赖项和构建产物
直接使用AWS CodeBuild进行缓存可能具有挑战性。AWS CodeBuild中的构建缓存文档详细介绍了本地或Amazon S3缓存。
根据文档,"本地缓存在构建主机上本地存储缓存,仅对该构建主机可用"。这在并行测试运行期间不会有用。
"Amazon S3缓存在Amazon S3桶中存储缓存,可在多个构建主机之间共享"。虽然这听起来很有用,但实际上上传缓存的依赖项可能需要一些时间。此外,每个工作器都会尝试将其依赖项缓存保存到Amazon S3,这会显著增加构建时间。
超出本指南范围,但AWS CodePipeline可能有助于缓存初始源代码、依赖项和构建输出,以便在使用AWS CodePipeline输入和输出产物的AWS CodeBuild作业中使用。
参考AWS CodePipeline与CodeBuild集成及多输入源和输出产物示例示例,了解如何配置带有输出产物的CodePipeline。
并行化
Cypress Cloud提供了并行化和分组测试运行的能力,以及Cypress测试的额外洞察和分析。
AWS CodeBuild提供了一种批量构建矩阵策略,用于为单个作业定义声明不同的作业配置。批量构建矩阵策略提供了指定作业容器镜像的选项。在构建矩阵策略中声明的作业可以并行运行,这使我们能够同时运行多个Cypress实例,如本节后面所示。
有关如何启用批量构建的说明,请参阅启用批量构建。
以下配置使用--parallel
和--record
标志到cypress run,需要将测试结果录制到Cypress Cloud。
并行化构建
要设置多个容器并行运行,build-matrix
配置使用一组变量(CY_GROUP_SPEC
和WORKERS
),其中包含构建中每个组的特定项目列表。
字段由管道(|
)字符分隔,如下所示:
## 组名 | 浏览器 | 测试规范 | Cypress配置选项(可选)
'UI-Chrome-Mobile|chrome|cypress/tests/ui/*|viewportWidth=375,viewportHeight=667'
build-matrix
将运行所有分隔项目的排列组合。
batch:
fast-fail: false
build-matrix:
# ...
dynamic:
env:
# ...
variables:
CY_GROUP_SPEC:
- 'UI-Chrome|chrome|cypress/tests/ui/*'
- 'UI-Chrome-Mobile|chrome|cypress/tests/ui/*|viewportWidth=375,viewportHeight=667'
- 'API|chrome|cypress/tests/api/*'
- 'UI-Firefox|firefox|cypress/tests/ui/*'
- 'UI-Firefox-Mobile|firefox|cypress/tests/ui/*|viewportWidth=375,viewportHeight=667'
在安装阶段,我们使用shell脚本和cut命令将传递给工作器的分隔CY_GROUP_SPEC
中的值分配给shell变量,这些变量将在build
阶段运行cypress run
时使用。
batch:
# ...
phases:
install:
commands:
# 设置COMMIT_INFO变量以便在录制时将Git信息发送到Cypress Cloud
# https://docs.cypress.io//app/continuous-integration/overview#Git-information
- export COMMIT_INFO_BRANCH="$(git rev-parse HEAD | xargs git name-rev |
cut -d' ' -f2 | sed 's/remotes\/origin\///g')"
- export COMMIT_INFO_MESSAGE="$(git log -1 --pretty=%B)"
- export COMMIT_INFO_EMAIL="$(git log -1 --pretty=%ae)"
- export COMMIT_INFO_AUTHOR="$(git log -1 --pretty=%an)"
- export COMMIT_INFO_SHA="$(git log -1 --pretty=%H)"
- export COMMIT_INFO_REMOTE="$(git config --get remote.origin.url)"
- CY_GROUP=$(echo $CY_GROUP_SPEC | cut -d'|' -f1)
- CY_BROWSER=$(echo $CY_GROUP_SPEC | cut -d'|' -f2)
- CY_SPEC=$(echo $CY_GROUP_SPEC | cut -d'|' -f3)
- CY_CONFIG=$(echo $CY_GROUP_SPEC | cut -d'|' -f4)
- npm ci
## ...
为了并行化运行,我们需要向构建矩阵策略添加一个额外的变量WORKERS
。
batch:
fast-fail: false
build-matrix:
# ...
dynamic:
env:
# ...
variables:
CY_GROUP_SPEC:
# ...
WORKERS:
- 1
- 2
- 3
- 4
- 5
WORKERS
数组填充了填充(或_虚拟_ )项目,以在批量构建矩阵策略中配置所需数量的CI机器实例,并将为CY_GROUP_SPEC
中定义的每个组提供5个工作器。
最后,脚本变量传递给cypress run
的调用。
phases:
install:
# ...
build:
commands:
- npm start:ci &
- npx cypress run --record --parallel --browser $CY_BROWSER --ci-build-id
$CODEBUILD_INITIATOR --group "$CY_GROUP" --spec "$CY_SPEC" --config
"$CY_CONFIG"
将Cypress Cloud与AWS CodeBuild结合使用
仪表板分析依赖于您的CI环境可靠地提供提交SHA数据(通常通过环境变量),而这在默认情况下并不总是存在。这对大多数用户来说不是问题,但如果您在与CodeBuild设置集成时遇到问题,请确保按照这些指南正确发送git信息,或者只需查看本页顶部的示例codebuild.yml
文件。 如果在此之后仍然遇到问题,请联系我们。
在我们在前一节中定义的AWS CodeBuild配置中,我们利用了Cypress Cloud的三个有用功能:
-
使用
--record
标志将测试结果记录到Cypress Cloud- 深入且可共享的测试报告
- 通过快速访问测试回放、错误信息、堆栈跟踪、截图、视频和上下文详情,清晰掌握测试失败原因
- 通过与拉取请求(PR)流程集成测试,包括提交状态检查防护和便捷的测试报告评论
- 检测不稳定测试,并通过Slack警报或GitHub PR状态检查进行展示
-
通过
--parallel
标志实现测试并行运行,并借助智能负载均衡跨CI机器优化测试规范执行 -
通过标签分组将多个
cypress run
调用组织合并为Cypress Cloud中的单一报告。如上例所示,我们使用--group UI-Chrome
标志将所有Chrome浏览器的UI测试组织到Cypress Cloud报告中标记为"UI-Chrome"的组内。