下载失败的 gitlab 管道的最新工件

Download the latest artifacts of failed gitlab pipeline

我想将我的 gitlab 管道(基本上是一个 xml 文件)的测试结果自动加载到我的项目管理应用程序中。这两者之间不可能有直接联系。然而,gitlab API 提供了以下选项来下载管道的工件:

GET /projects/:id/jobs/artifacts/:ref_name/download?job=name`

GET /projects/:id/jobs/:job_id/artifacts

GET /projects/:id/jobs/:job_id/artifacts/*artifact_path

我目前的情况如下:

我有测试报告,这些报告在 运行 连接管道时保存在作业工件中。工件是在管道的每个 运行 上创建的,与其结果无关

gitlab-ci.yaml

...
artifacts:

     when: always
...

我尝试下载的工件有一个动态名称

./reports/junit/test-results-${CI_JOB_ID}.xml

如果我现在想将 latest 测试结果下载到与 gitlab 服务器不同的服务器,我必须意识到我不知道最新的作业 ID,这意思是:

这让我面临这样的情况,如果测试时没有出错,我只能下载最新的测试结果。委婉地说,这是次优的。

是否有某种方法可以从最新作业 运行(不知道作业 ID)下载工件,而不管其结果如何?

Is there some way to download the artifacts from the latest job run (without knowing the job ID), independent of its outcome?

为了实现这一点,我们将结合使用 Gitlab API 和 jq 包。

让我们把这个问题分解成几个部分。

首先,我们需要找出此项目的 last 执行管道的 idhttps://docs.gitlab.com/ee/api/pipelines.html#list-project-pipelines

GET /projects/:id/pipelines

对于这次通话,您需要 access token,如果您还没有,请检查 https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html#create-a-personal-access-token https://docs.gitlab.com/ee/user/project/settings/project_access_tokens.html#create-a-project-access-token

您还需要 Project ID

LAST_PIPELINE_ID=$(curl -s --header "PRIVATE-TOKEN: <access_token>" https://gitlab.com/api/v4/projects/<project_id>/pipelines | jq '.[0].id')

接下来我们将通过使用以下 API 提供 job name 来检索 job id https://docs.gitlab.com/ee/api/jobs.html#list-pipeline-jobs

GET /projects/:id/pipelines/:pipeline_id/jobs

在您的情况下,您需要将以下示例更改为 your job's name,在此示例中我们将其称为 my_job

JOB_ID=$(curl -s --header "PRIVATE-TOKEN: <access_token>" https://gitlab.com/api/v4/projects/<project_id>/pipelines/$LAST_PIPELINE_ID/jobs | jq '.[] | select(.name=="my_job") | .id')

现在我们准备好实际取回工件,使用以下 API

GET /projects/:id/jobs/:job_id/artifacts

https://docs.gitlab.com/ee/api/job_artifacts.html#get-job-artifacts

wget -U "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.17 (KHTML,like Gecko) Ubuntu/11.04 Chromium/11.0.654.0 Chrome/11.0.654.0 Safari/534.17" --header "PRIVATE-TOKEN: <access_token>" "https://gitlab.com/api/v4/projects/<project_id>/jobs/$JOB_ID/artifacts" -O artifacts.zip

这些工件在您从

执行wget的文件夹中以artifacts.zip的形式提供

为了清楚起见,在这里将它们结合起来

LAST_PIPELINE_ID=$(curl -s --header "PRIVATE-TOKEN: <access_token>" https://gitlab.com/api/v4/projects/<project_id>/pipelines | jq '.[0].id')
JOB_ID=$(curl -s --header "PRIVATE-TOKEN: <access_token>" https://gitlab.com/api/v4/projects/<project_id>/pipelines/$LAST_PIPELINE_ID/jobs | jq '.[] | select(.name=="my_job") | .id')
wget -U "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.17 (KHTML,like Gecko) Ubuntu/11.04 Chromium/11.0.654.0 Chrome/11.0.654.0 Safari/534.17" --header "PRIVATE-TOKEN: <access_token>" "https://gitlab.com/api/v4/projects/<project_id>/jobs/$JOB_ID/artifacts" -O artifacts.zip