gitlab runner pytest 失败,但显示工作成功

Posted

技术标签:

【中文标题】gitlab runner pytest 失败,但显示工作成功【英文标题】:gitlab runner pytest fails but it shows job success 【发布时间】:2021-01-22 07:39:23 【问题描述】:

我在整个互联网上搜索了这个问题,但找不到答案。

作业的输出是这样的:

test/test_something.py:25: AssertionError
========================= 1 failed, 64 passed in 2.10s =========================

Job succeeded

我的.gitlab-ci.yml 测试文件:

run_tests:
  stage: test
  tags:
    - tests
  script:
    - echo "Running tests"
    - ./venv/bin/python -m pytest

我正在使用 shell 执行器。 以前有人遇到过这个问题吗?据我了解,gitlab CI 取决于 pytest 的退出代码,如果退出代码不为零,它应该会失败,但在这种情况下,pytest 应该有退出代码 1,因为测试失败。

【问题讨论】:

尝试运行./venv/bin/python -m pytest || echo $? 查看实际退出代码 在您的 yml 配置中添加这些 pytest 开关以检查实际错误是什么:-rA-vvv--showlocals 【参考方案1】:

这与您的 gitlab-ci 脚本无关,而是您的 pytest 脚本(您用于运行测试的脚本或模块)。

下面我为您提供了一个示例,假设您可能使用 Flask CLI 之类的工具来管理您的测试。

您可以使用SystemExit 来提高退出代码。如果返回 0 以外的任何内容,则该过程将失败。简而言之,如果返回的退出代码是0,GitLab 阶段就会成功。

Pytest 只运行测试但不返回退出代码。你可以在你的代码中实现它:

您的 manage.py(假设您使用的是 flask CLI)将如下所示:

import pytest
import click
from flask import Flask

app = Flask(__name__)


@app.cli.command("tests")
@click.argument("option", required=False)
def run_test_with_option(option: str = None):
    if option is None:
        raise SystemExit(pytest.main())

注意上面的代码是如何raiseing 并定义了tests 的flask CLI 命令。要运行您的代码,您只需将以下内容添加到您的 gitlab-ci 脚本中:

run_tests:
  stage: test
  tags:
    - tests
  variables:
    FLASK_APP: manage.py
  script:
    - echo "Running tests"
    - ./venv/bin/activate
    - flask tests

将运行您的测试的脚本将是 flask tests,它正在提升 SystemExit,如图所示。

仅供参考:您可能不使用 Flask CLI 来管理您的测试脚本,而只是想运行一个测试脚本。在这种情况下,this answer 也可能会有所帮助。

【讨论】:

以上是关于gitlab runner pytest 失败,但显示工作成功的主要内容,如果未能解决你的问题,请参考以下文章

linux 安装 gitlab-runner 失败

GitLab runner 获取子模块的“主机密钥验证失败”

在本地运行 GitLab 和 GitLab-Runner docker 实例时,管道中的构建步骤因连接被拒绝错误而失败

通过 SSH 将 gitlab-runner(服务器)连接到虚拟机失败:权限被拒绝(公钥、密码)

Gitlab-runner dind 导致错误:作业失败(系统故障):来自守护进程的错误响应:OCI 运行时创建失败:container_linux.go:380:

Gitlab runner:无法在 Ubuntu 上回收 Docker 空间 - 设备上没有剩余空间