赛普拉斯/GitLab CI/CD 集成 - 赛普拉斯不会在无头模式下启动

Posted

技术标签:

【中文标题】赛普拉斯/GitLab CI/CD 集成 - 赛普拉斯不会在无头模式下启动【英文标题】:Cypress/GitLab CI/CD integration - Cypress won't start in headless mode 【发布时间】:2021-12-02 14:22:25 【问题描述】:

在 Cypress 中编写了几个测试并以无头和有头方式在本地尝试它们(两者都工作得很好)之后,在集成过程中插入测试后,我无法让我们的 GitLab 以无头方式启动 Cypress。这似乎是一个问题: [FAILED] Your system is missing the dependency: Xvfb 为什么我需要 Xvfb 在 Cypress 中运行无头测试?我已经坚持了两天了,任何帮助或想法将不胜感激。

.gitlab-ci.yml 中的测试配置:

test:
  image: node:latest
  stage: test
  script:
    - npm ci
    - npm start &
    - npm test

package.json 中的相关行:

"start": "ng serve --proxy-config proxy.conf.json --port 4222 -o"
"test": "cypress run --spec cypress/integration/test_zber/test.spec.js"

成功通过npm ci后尝试运行测试时的gitlab输出

$ npm start &
$ npm test
> sdcl@0.1.30 start
> ng serve --proxy-config proxy.conf.json --port 4222 -o
> sdcl@0.1.30 test
> cypress run --spec cypress/integration/test_zber/test.spec.js
It looks like this is your first time using Cypress: 8.6.0
[STARTED] Task without title.
[FAILED] Your system is missing the dependency: Xvfb
[FAILED] 
[FAILED] Install Xvfb and run Cypress again.
[FAILED] 
[FAILED] Read our documentation on dependencies for more information:
[FAILED] 
[FAILED] https://on.cypress.io/required-dependencies
[FAILED] 
[FAILED] If you are using Docker, we provide containers with all required dependencies installed.
[FAILED] 
[FAILED] ----------
[FAILED] 
[FAILED] Error: spawn Xvfb ENOENT
[FAILED] 
[FAILED] ----------
[FAILED] 
[FAILED] Platform: linux (Debian - 10.11)
[FAILED] Cypress Version: 8.6.0
Your system is missing the dependency: Xvfb
Install Xvfb and run Cypress again.
Read our documentation on dependencies for more information:
https://on.cypress.io/required-dependencies
If you are using Docker, we provide containers with all required dependencies installed.
----------
Error: spawn Xvfb ENOENT
----------
Platform: linux (Debian - 10.11)
Cypress Version: 8.6.0
Warning: Entry point 'ng2-ace-editor' contains deep imports into '/builds/D7tLJUkz/0/uvz/evz/sdc/sdcl-fe/node_modules/brace/theme/monokai'. This is probably not a problem, but may cause the compilation of entry points to be out of order.

在本地运行时的控制台输出:

PS C:\projectlocation> npm test

> sdcl@0.1.30 test C:\projectlocation
> cypress run --spec cypress/integration/test_zber/test.spec.js


[10644:1014/090627.480:ERROR:display_layout.cc(559)] PlacementList must be sorted by first 8 bits of display_id

====================================================================================================

  (Run Starting)

  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ Cypress:    8.6.0                                                                              │
  │ Browser:    Electron 93 (headless)                                                             │
  │ Specs:      1 found (test_zber/test.spec.js)                                                   │
  │ Searched:   cypress\integration\test_zber\test.spec.js                                         │
  └────────────────────────────────────────────────────────────────────────────────────────────────┘


────────────────────────────────────────────────────────────────────────────────────────────────────

  Running:  test_zber/test.spec.js                                                          (1 of 1)


  simple_statement_test
    √ test1 (3090ms)
    √ test2 (4969ms)
    √ test3 (882ms)
    √ test4 (2489ms)
    √ test5 (503ms)


  5 passing (14s)


  (Results)

  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ Tests:        5                                                                                │
  │ Passing:      5                                                                                │
  │ Failing:      0                                                                                │
  │ Pending:      0                                                                                │
  │ Skipped:      0                                                                                │
  │ Screenshots:  0                                                                                │
  │ Video:        true                                                                             │
  │ Duration:     13 seconds                                                                       │
  │ Spec Ran:     test_zber/test.spec.js                                                           │
  └────────────────────────────────────────────────────────────────────────────────────────────────┘


  (Video)

  -  Started processing:  Compressing to 32 CRF
  -  Finished processing: C:\projectlocation\cypress\videos\test_zber\test.     (1 second)
                          spec.js.mp4


====================================================================================================

  (Run Finished)


       Spec                                              Tests  Passing  Failing  Pending  Skipped  
  ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
  │ √  test_zber/test.spec.js                   00:13        5        5        -        -        - │
  └────────────────────────────────────────────────────────────────────────────────────────────────┘
    √  All specs passed!                        00:13        5        5        -        -        -  

【问题讨论】:

用 xvfb-run 包装运行命令怎么样 - xvfb-run npx cypress run 【参考方案1】:

解决方案是使用赛普拉斯指南 https://docs.cypress.io/guides/continuous-integration/gitlab-ci#Testing-in-Chrome-and-Firefox-with-Cypress-Docker-Images 提供的 docker 映像

.gitlab.ci.yml 中的配置

test:
  image: cypress/browsers:node12.14.1-chrome85-ff81
  stage: test
  script:
    # install dependencies
    - npm ci
    # start the server in the background
    - npm start &
    # run Cypress tests
    - npx cypress run --browser chrome

【讨论】:

【参考方案2】:

您是否尝试过将--headless 选项传递给cypress run 命令?我在问题中没有看到它,但它似乎是基于 SO 上提出的其他一些问题的解决方案,例如这个one。您可以在文档 here 中找到此选项。

另一种解决方案是使用官方赛普拉斯 Docker 映像或在运行赛普拉斯之前安装 Xvfb 包。

【讨论】:

--headlesscypress run 的默认选项,在本地运行的终端输出中,它甚至明确声明它是无头的。 Browser: Electron 93 (headless) 它只在 GitLab CI 上它想要安装 Xvfb【参考方案3】:

我正在使用 cypress 测试 nextJS (React) 应用程序。对我来说,cypress 指南中的 docker 镜像不起作用,因为 nextJS 需要更新版本的 node。如果你去this GitHub 仓库,你可以找到更多有用的 docker 镜像。

最后这对我有用:

在 .gitlab-ci.yml 中:

image: cypress/browsers:node14.16.0-chrome89-ff86

stages:
  - test

test:
  stage: test
  script:
    # install dependencies
    - npm ci
    # start the server in the background
    - npm run start:ci &
    # run Cypress tests
    - npm run test:ci

不要忘记在 package.json 中定义使用的脚本:


  "scripts": 
    "start:ci": "next dev",
    "test:ci": "cypress run"
  ,

【讨论】:

以上是关于赛普拉斯/GitLab CI/CD 集成 - 赛普拉斯不会在无头模式下启动的主要内容,如果未能解决你的问题,请参考以下文章

赛普拉斯利用 Gitlab 变量

赛普拉斯可以运行在赛普拉斯文件夹之外导入的测试文件吗?

推荐一款赛普拉斯强大的 USB2.0 控制芯片

赛普拉斯报告者结果文件名

赛普拉斯:我们如何在赛普拉斯中使用不记名令牌编写 GET 请求?

赛普拉斯:测试元素是不是不存在