下载失败的 gitlab 管道的最新工件
Download the latest artifacts of failed gitlab pipeline
我想将我的 gitlab 管道(基本上是一个 xml 文件)的测试结果自动加载到我的项目管理应用程序中。这两者之间不可能有直接联系。然而,gitlab API 提供了以下选项来下载管道的工件:
- 最新成功管道的所有工件运行(按作业名称选择)
GET /projects/:id/jobs/artifacts/:ref_name/download?job=name`
- 特定工作的所有工件(按工作 ID 选择)
GET /projects/:id/jobs/:job_id/artifacts
- 单个工件文件(按作业 ID 选择)
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
执行管道的 id
。 https://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
我想将我的 gitlab 管道(基本上是一个 xml 文件)的测试结果自动加载到我的项目管理应用程序中。这两者之间不可能有直接联系。然而,gitlab API 提供了以下选项来下载管道的工件:
- 最新成功管道的所有工件运行(按作业名称选择)
GET /projects/:id/jobs/artifacts/:ref_name/download?job=name`
- 特定工作的所有工件(按工作 ID 选择)
GET /projects/:id/jobs/:job_id/artifacts
- 单个工件文件(按作业 ID 选择)
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
执行管道的 id
。 https://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