gitlab-ci - GitLab CI/CD 中的合并请求 API 返回未经授权的错误
问题描述
我找到了答案: 如何在 Gitlab CI 中获取 Gitlab 合并请求描述?
但是这个请求没有得到答复:
$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID
我添加了一个标题:
PRIVATE-TOKEN: $TOKEN
其中 $TOKEN - CI_BUILD_TOKEN 或 CI_JOB_TOKEN,但回答:
HTTPCode: 401
UPD。我创建了脚本:
#!/usr/bin.env bash
# -*- coding: utf-8 -*-
urlBase="${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}
echo "[--] urlBase: ${urlBase}"
echo "[--] key + build"
curl "${urlBase}?private_token=${CI_BUILD_TOKEN}"
echo "[--] key + job"
curl "${urlBase}?private_token=${CI_JOB_TOKEN}"
echo "[--] header + build"
curl --header "PRIVATE-TOKEN: ${CI_BUILD_TOKEN}" "${urlBase}"
echo "[--] header + job"
curl --header "PRIVATE-TOKEN: ${CI_JOB_TOKEN}" "${urlBase}"
echo "[--] header2 + build"
curl --header "Authorization: Bearer ${CI_BUILD_TOKEN}" "${urlBase}"
echo "[--] header2 + job"
curl --header "Authorization: Bearer ${CI_JOB_TOKEN}" "${urlBase}"
但输出:
{"message":"401 Unauthorized"}
解决方案
假设您使用 cURL 调用 GitLab API,您需要显式传递 API 令牌。仔细阅读GitLab 文档,因为有很多陷阱。
cURL 命令中的凭据
以下是在 cURL 命令中传递凭据的一些常用方法:
作为参数:
curl "$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID?private_token=<your_access_token>"
作为标题:
curl --header "PRIVATE-TOKEN: <your_access_token>" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/merge_requests/$CI_MERGE_REQUEST_IID"
CI 作业令牌
GitLab文档指定了可以使用哪些 API 调用$CI_JOB_TOKEN
:
使用几个 API 端点,您可以使用 GitLab CI/CD 作业令牌通过 API 进行身份验证:包、工件、管道触发器、发布创建、Terraform 计划。
请注意,合并请求不在该列表中,因此不起作用。
CI 构建令牌
根据这个问题,$CI_BUILD_TOKEN
在 GitLab 9.x 中被弃用并重命名为$CI_JOB_TOKEN
,所以这也不起作用。
个人访问令牌
您可以使用个人访问令牌或 PAT对 GitLab API 进行身份验证。首先,使用这些说明创建您的 PAT 。确保选择api作为范围。然后,按照这些说明将令牌添加到 GitLab 变量。确保启用“掩码变量”,以便您的令牌不会在日志中公开。现在,在 中gitlab-ci.yml
,您创建的变量将可用作环境变量。
推荐阅读
- python - 尝试使用 if/else 语法返回用户输入时,“必须是实数,而不是 NoneType”
- python - 将excel的多列与具有不同长度和索引的一列进行比较
- c++ - 动态规划 - 评估网格大小
- javascript - 如何在响应的发布请求中将 zip 文件作为正文发送?
- python - 在 Python 中查找 SVG 路径元素的最终位置
- c++ - 不尝试为我的数组中的值获取随机数
- swift - 如何在 macOS 上通过 SwiftUI 正确实现 List 中的分隔符
- reactjs - ReactDOM.createPortal modal 挂载在 DOM 上,但屏幕上没有显示任何内容
- python - 如何从詹金斯获取系统信息
- amazon-web-services - 如何使用 Terraform 刷新 API Gateway 的 AWS Lambda 权限?