如何在 GitLab CI 中显示来自另一个存储库的测试
How to show tests from another repository in GitLab CI
所以我有我的项目及其单元测试,当我在 GitLab 中配置 CI 系统后执行合并请求时,它们很好地显示为绿色或红色圆圈。
但现在我也有一些集成测试,它们驻留在一个单独的存储库中(你为什么问?因为我有多个微服务需要一起测试,每个都有自己的存储库)。
当我在这个集成测试的存储库上执行合并请求时,它们显示得很好,但是我需要它让这些测试显示在其他存储库的合并请求上。
我确实设法用 GitLab CI 给我的 URL/command 从微服务的存储库中触发它们,像这样:curl -X POST -F token=... -F ref=master https://gitlab.com/api/v4/projects/.../trigger/pipeline
但是在微服务的存储库中,它总是显示为一个绿色圆圈,意味着它成功启动了集成测试,但我不知道如何显示测试结果(或者至少如果它们损坏或不是)。
谁能告诉我正确的文档(如果有的话),或者只是向我解释如何做以及是否可能?
我能想到的最佳解决方案是将我的集成测试创建为一个库,然后我将在所有其他项目中导入并使用该库,但我绝对宁愿避免这样做,因为它会强制我用与项目相同的编程语言编写集成测试(假设它们是相同的)或者用其他语言对 运行 进行一些修改。
谢谢。
您可以使用 Python/Bash 脚本扩展您当前正在做的事情;
从主项目,使用所述脚本:
- 触发微服务流水线(并抓取流水线ID)
- 轮询管道的 status,使用捕获的 ID(可以是
running
、pending
、failed
、canceled
或 skipped
)
- 如果失败则引发异常/错误...
这应该可以满足您的要求,但这意味着您将使用一个跑步者来不断向 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)
然后将此 python 脚本称为 gitlab-ci.yml
中的一个阶段。
所以我有我的项目及其单元测试,当我在 GitLab 中配置 CI 系统后执行合并请求时,它们很好地显示为绿色或红色圆圈。
但现在我也有一些集成测试,它们驻留在一个单独的存储库中(你为什么问?因为我有多个微服务需要一起测试,每个都有自己的存储库)。
当我在这个集成测试的存储库上执行合并请求时,它们显示得很好,但是我需要它让这些测试显示在其他存储库的合并请求上。
我确实设法用 GitLab CI 给我的 URL/command 从微服务的存储库中触发它们,像这样:curl -X POST -F token=... -F ref=master https://gitlab.com/api/v4/projects/.../trigger/pipeline
但是在微服务的存储库中,它总是显示为一个绿色圆圈,意味着它成功启动了集成测试,但我不知道如何显示测试结果(或者至少如果它们损坏或不是)。
谁能告诉我正确的文档(如果有的话),或者只是向我解释如何做以及是否可能?
我能想到的最佳解决方案是将我的集成测试创建为一个库,然后我将在所有其他项目中导入并使用该库,但我绝对宁愿避免这样做,因为它会强制我用与项目相同的编程语言编写集成测试(假设它们是相同的)或者用其他语言对 运行 进行一些修改。
谢谢。
您可以使用 Python/Bash 脚本扩展您当前正在做的事情;
从主项目,使用所述脚本:
- 触发微服务流水线(并抓取流水线ID)
- 轮询管道的 status,使用捕获的 ID(可以是
running
、pending
、failed
、canceled
或skipped
) - 如果失败则引发异常/错误...
这应该可以满足您的要求,但这意味着您将使用一个跑步者来不断向 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)
然后将此 python 脚本称为 gitlab-ci.yml
中的一个阶段。