GitLab CI/CD 中的合并请求 API 返回未经授权的错误 cURL 命令中的凭据CI 工作令牌CI 构建令牌个人访问令牌

问题描述

我找到了答案: How to get Gitlab merge request description in Gitlab CI?

但是请求没有得到答复:

$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

更新。 我创建了脚本:

#!/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 Documentation,因为有很多问题。

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 documentation 指定可以使用 $CI_JOB_TOKEN 进行哪些 API 调用:

通过一些 API 端点,您可以使用 GitLab CI/CD 作业令牌对 API 进行身份验证:包、工件、管道触发器、发布创建、Terraform 计划。

请注意,合并请求不在该列表中,因此不起作用。

CI 构建令牌

根据此 issue$CI_BUILD_TOKEN 在 GitLab 9.x 中已弃用并重命名为 $CI_JOB_TOKEN,因此这也不起作用。

个人访问令牌

您可以使用 Personal Access Tokens 或 PAT 对 GitLab API 进行身份验证。首先,使用这些 instructions 创建您的 PAT。确保选择 api 作为范围。然后,将令牌添加到这些 instructions 之后的 GitLab 变量中。确保启用“掩码变量”,以便您的令牌不会在日志中公开。现在,在 gitlab-ci.yml 中,您创建的变量将可用作环境变量。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...