【问题标题】:How to show tests from another repository in GitLab CI如何在 GitLab CI 中显示来自另一个存储库的测试
【发布时间】:2018-04-11 22:30:54
【问题描述】:

所以我的项目带有单元测试,当我在 GitLab 中配置 CI 系统后执行合并请求时,它们很好地显示为绿色或红色圆圈。

但现在我也有一些集成测试,它们驻留在一个单独的存储库中(为什么要问?因为我有多个需要一起测试的微服务,每个微服务都有自己的存储库)。

当我对此集成测试的存储库执行合并请求时,它们显示得很好,但我需要它让这些测试显示在其他存储库的合并请求上。

我确实设法使用 GitLab CI 给我的 URL/命令从微服务的存储库中触发它们,例如:curl -X POST -F token=... -F ref=master https://gitlab.com/api/v4/projects/.../trigger/pipeline

但是在微服务的存储库中,它总是显示为绿色圆圈,表示它已成功启动集成测试,但我不知道如何显示测试结果(或者至少它们是否损坏) .

谁能给我指出正确的文档(如果有的话),或者只是向我解释如何去做以及是否可能?

我能想到的最佳解决方案是将我的集成测试创建为一个库,然后我会在所有其他项目中导入并使用该库,但我绝对宁愿避免这种情况,因为它会迫使我使用与项目相同的编程语言编写集成测试(假设它们相同)或进行一些修改以在其他语言上运行它。

谢谢。

【问题讨论】:

  • 如果你有多个 repo,但每个 repo 只能在 everything 通过时合并,那么你比 mono-repo 有什么优势?
  • 所有微服务的优点:团队可以独立工作;项目可以用不同的编程语言编写;等等。另外,多个存储库的决定不值得讨论:/(Ps.:不是我的决定)。
  • 那是微服务,不是多仓库。基本上,听起来你被要求构建一个零散的单一存储库。但是,是的,我想这超出了问题的范围;)
  • 通常每个微服务都在单独的存储库中创建,特别是如果您想单独扩展它们或支持多种语言。

标签: continuous-integration gitlab integration-testing


【解决方案1】:

您可以做的是使用 Python/Bash 脚本扩展您当前正在做的事情;

从主项目,使用上述脚本:

  1. 触发微服务管道(并获取管道 ID)
  2. 使用捕获的ID(可以是runningpendingfailedcanceledskipped)轮询管道的status
  3. 如果失败则引发异常/错误...

这应该可以满足您的要求,但这意味着您将使用跑步者只是为了不断向 GitLab 实例发送 curl 请求(并且该跑步者无法接受另一份工作,具体取决于您的工作方式)设置跑步者的限制和并发设置)。


示例 run_pipeline.py

import gitlab
import time, timeit
import sys

from datetime import timedelta

gl = gitlab.Gitlab("https://your_gitlab_instance.com/",
                    private_token="you_private_token")

project = gl.projects.get('your_project')
create_pipeline = project.pipelines.create({'ref': 'master'})

# Set default
status = "pending"
start_time = timeit.default_timer()

while (status == "running" or status == "pending"):
    pipeline = project.pipelines.get(create_pipeline.id)

    status = pipeline.status

    elapsed_time = timeit.default_timer() - start_time
    formated_time = str(timedelta(seconds=elapsed_time))
    sys.stderr.write("Still running pipeline... ({})\n".format(formated_time))

    if status == "success":
        sys.stderr.write("\nPipeline success\n")
        break
    elif status == "failed":
        raise Exception
    elif status == "canceled":
        raise Exception

    time.sleep(10)

然后在你的gitlab-ci.yml 中调用这个 python 脚本作为一个阶段。

【讨论】:

  • 但是我该怎么做呢?确切的 Python 脚本是什么,我在哪里配置它?
  • @RodrigoRuiz 这只是您的存储库中您自己的自定义 python 脚本,您可以调用它来代替当前的构建触发器。例如,您可以使用python-gitlab 或编写自己的方法来执行此操作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 2019-04-08
  • 2020-04-17
  • 2021-12-22
相关资源
最近更新 更多