解读 CI 失败

编辑

Kibana CI 使用名为 "Pipelines" 的 Buildkite 功能来自动化测试拉取请求和跟踪分支中的代码。管道在存储库中通过 Pipelines 定义,位于 .buildkite/pipelines 文件夹中。

有关 Buildkite 管道的更多信息,请参阅 文档

Github 检查

编辑

当测试失败时,将通过 Github 检查向 Github 报告。我们目前将测试分为几个类别并行运行,以加快 CI 速度。诸如 ciGroup{X} 之类的组在 Github 中获得单个检查,而其他测试(如 linting 或类型检查)则获得自己的检查。

单击拉取请求的对话选项卡中检查旁边的链接,将带您进入该部分测试的日志输出。如果该日志输出被截断,或者没有清楚地标识发生了什么,您通常可以通过直接访问 Buildkite 来获得更完整的信息。

在 Kibana 中查看作业执行

编辑

要查看 Buildkite 中作业执行的结果,请单击 @elasticmachine 留下的注释中的链接,或在 PR 底部的列表中搜索 kibana-ci 检查。此链接将带您进入失败的特定作业执行的顶层页面。

Buildkite pipeline view showing a few test failures
  1. Git 提交: 导致此构建的 git 提交。
  2. 测试结果: 指向测试结果屏幕的链接,以及指向失败测试的日志和作业的快捷方式。功能测试会捕获并存储每个特定测试的日志输出,并使其在这些链接中可见。
  3. 管道步骤::已执行管道的分解,以及管道中每个步骤的单独日志输出。

调试功能 UI 测试失败

编辑

“管道步骤”中的日志包含 Info 级别的日志记录。要调试功能 UI 测试,通常查看调试日志很有帮助。您可以单击 日志 (1) 转到测试失败详细信息。

Buildkite build screenshot

查看失败,我们首先查看错误和堆栈跟踪。在下面的示例中,此测试未在超时时间内找到元素;Error: retry.try timeout: TimeoutError: Waiting for element to be located By(css selector, [data-test-subj="createSpace"])

我们从堆栈跟踪中知道测试文件位于 test/accessibility/apps/spaces.ts 的第 50 行(此测试和堆栈跟踪上下文是 kibana/x-pack/,因此该文件是 https://github.com/elastic/kibana/blob/main/x-pack/test/accessibility/apps/group1/spaces.ts#L50)。单击元素的功能是从 test/functional/page_objects/space_selector_page.ts 中的页面对象方法调用的 https://github.com/elastic/kibana/blob/main/x-pack/test/functional/page_objects/space_selector_page.ts#L58

[00:03:36]             │ debg --- retry.try error: Waiting for element to be located By(css selector, [data-test-subj="createSpace"])
[00:03:36]             │      Wait timed out after 10020ms
[00:03:36]             │ info Taking screenshot "/dev/shm/workspace/parallel/24/kibana/x-pack/test/functional/screenshots/failure/Kibana spaces page meets a11y validations a11y test for click on create space page.png"
[00:03:37]             │ info Current URL is: https://127.0.0.1:61241/app/home#/
[00:03:37]             │ info Saving page source to: /dev/shm/workspace/parallel/24/kibana/x-pack/test/functional/failure_debug/html/Kibana spaces page meets a11y validations a11y test for click on create space page.html
[00:03:37]             └- ✖ fail: Kibana spaces page meets a11y validations a11y test for click on create space page
[00:03:37]             │      Error: retry.try timeout: TimeoutError: Waiting for element to be located By(css selector, [data-test-subj="createSpace"])
[00:03:37]             │ Wait timed out after 10020ms
[00:03:37]             │     at /dev/shm/workspace/parallel/24/kibana/node_modules/selenium-webdriver/lib/webdriver.js:842:17
[00:03:37]             │     at runMicrotasks (<anonymous>)
[00:03:37]             │     at processTicksAndRejections (internal/process/task_queues.js:93:5)
[00:03:37]             │       at onFailure (/dev/shm/workspace/parallel/24/kibana/test/common/services/retry/retry_for_success.ts:17:9)
[00:03:37]             │       at retryForSuccess (/dev/shm/workspace/parallel/24/kibana/test/common/services/retry/retry_for_success.ts:57:13)
[00:03:37]             │       at Retry.try (/dev/shm/workspace/parallel/24/kibana/test/common/services/retry/retry.ts:32:14)
[00:03:37]             │       at Proxy.clickByCssSelector (/dev/shm/workspace/parallel/24/kibana/test/functional/services/common/find.ts:420:7)
[00:03:37]             │       at TestSubjects.click (/dev/shm/workspace/parallel/24/kibana/test/functional/services/common/test_subjects.ts:109:7)
[00:03:37]             │       at SpaceSelectorPage.clickCreateSpace (test/functional/page_objects/space_selector_page.ts:59:7)
[00:03:37]             │       at Context.<anonymous> (test/accessibility/apps/spaces.ts:50:7)
[00:03:37]             │       at Object.apply (/dev/shm/workspace/parallel/24/kibana/node_modules/@kbn/test/src/functional_test_runner/lib/mocha/wrap_function.js:73:16)

但我们不知道测试为什么找不到元素。可能是它不在正确的页面上,或者元素已更改。

✖ fail: 行的上方,有一行 info Taking screenshot ...,它告诉我们在 Google Cloud Storage (GCS) 上传报告: 中要查找的屏幕截图的名称。

单击该 png 的 [下载] 链接会显示此图像

Kibana spaces page meets a11y validations a11y test for click on create space page.png

如果我们使用正在运行的 Kibana 实例并检查元素,我们会发现 createSpace data-test-subj 属性位于 Stack Management 的“空间”页面上的此按钮上。

Kibana screenshot of Spaces page with developer tools open

我们知道测试不在找到要单击的元素的正确页面上。我们在调试日志中看到重复查找元素的尝试。如果我们将滚动到这些重复尝试的开始位置,我们会看到测试所做的第一件事是尝试单击 createSpace 元素。

[00:01:30]           └-> a11y test for manage spaces menu from top nav on Kibana home
[00:01:30]           └-> a11y test for manage spaces page
[00:01:30]           └-> a11y test for click on create space page
[00:01:30]             └-> "before each" hook: global before each for "a11y test for click on create space page"
[00:01:30]             │ debg TestSubjects.click(createSpace)

我们可以通过查看测试代码来确认这一点。

因此,我们需要进一步回溯以找到测试打开“空间”页面的位置。事实证明,此之前的测试会导航到正确的页面,但是该测试被跳过(在 PR 中标记为 it.skip)。

it.skip('a11y test for manage spaces page', async () => {
  await PageObjects.spaceSelector.clickManageSpaces();

也许有人跳过了之前的测试,没有意识到测试不是独立的。最佳做法是每个测试都是原子的,不依赖于任何其他测试的结果。但是在 UI 测试中,设置需要时间,我们通常需要在描述块中优化测试组。