调用GitLab API获取Job制品返回404,求权限验证API
GitLab Job制品API返回404的排查与权限验证
问题场景
操作依据GitLab的jobs和jobs/…/artifacts API,执行以下命令:
CI_API_V4_URL="https://${GITLAB_HOST}/api/v4" curl --silent --header "PRIVATE-TOKEN: ${ACCESS_TOKEN}" "${CI_API_V4_URL}/projects/${projectId}/jobs/${jobId}" | jq '{artifacts: .artifacts, artifacts_expire_at: .artifacts_expire_at}' echo "-----" curl --silent --header "PRIVATE-TOKEN: ${ACCESS_TOKEN}" "${CI_API_V4_URL}/projects/${projectId}/jobs/${jobId}/artifacts" echo echo "----"
得到输出:
{ "artifacts": [ { "file_type": "trace", "size": 3480918, "filename": "job.log", "file_format": null }, { "file_type": "junit", "size": 189178, "filename": "junit.xml.gz", "file_format": "gzip" } ], "artifacts_expire_at": "2023-09-01T16:07:04.315Z" } ---- {"message":"404 Not Found"} ----
已确认该Job存在制品且未过期,但调用获取制品的API返回404,需排查原因及获取权限验证方法。
可能的原因
- 项目ID格式错误:GitLab API支持两种项目标识,若使用数字ID无效,尝试用URL编码后的项目路径(如
namespace/project-name转成namespace%2Fproject-name)。部分私有组下的项目仅支持路径编码标识。 - 权限不足:获取Job基本信息的权限低于获取制品的权限:
- 个人访问令牌需包含
read_repository或api范围 - 项目角色需为Reporter(30级)及以上,Guest角色无制品访问权限
- 个人访问令牌需包含
- 制品路径未指定:Job的
junit.xml.gz可能存放在非根目录下,默认请求根目录会返回404。需在API路径后追加制品所在路径(如/jobs/${jobId}/artifacts/path/to/junit.xml.gz) - GitLab版本bug:旧版本GitLab对含特殊字符的制品路径解析存在问题,导致404。
权限验证API
1. 检查令牌的权限范围
curl --silent --header "PRIVATE-TOKEN: ${ACCESS_TOKEN}" "${CI_API_V4_URL}/user" | jq '.scopes'
确认返回的scopes列表包含read_repository或api。
2. 验证对目标项目的访问权限
curl --silent --header "PRIVATE-TOKEN: ${ACCESS_TOKEN}" "${CI_API_V4_URL}/projects/${projectId}" | jq '.permissions'
查看project_access.access_level值,需≥30(Reporter级别)。
3. 直接验证特定制品的可访问性
若已知制品路径,直接请求该文件:
curl --silent --header "PRIVATE-TOKEN: ${ACCESS_TOKEN}" "${CI_API_V4_URL}/projects/${projectId}/jobs/${jobId}/artifacts/junit.xml.gz"
若返回文件内容而非404,说明是根目录路径问题。
内容的提问来源于stack exchange,提问作者Loki Astari
相关产品推荐
相关产品推荐

