用途
glab-artifact-registry 是 glab(GitLab CLI)中的命令组,用于把当前活跃的 GitLab 凭据交换为短期的 Artifact Registry 访问令牌、验证令牌身份,以及为包管理器配置认证。命令组别名可写作 glab ar。该命令组为实验性功能,在用于持久化自动化之前应核实实际帮助信息与目标 GitLab 实例。
前置条件
- GitLab Enterprise Edition 19.1 或更高版本。
- 实例管理员已启用 gate_token_exchange_endpoint 功能标志。
- glab 已对预期主机完成身份验证。
令牌是临时的,但仍是凭据。切勿将其打印在日志中、存储在仓库里、包含在命令参数中,或粘贴到 issue/MR 内容里。
主要能力
先检查访问权限
status 会执行令牌交换并打印非机密的身份元数据:issuer、subject、audience 和 expiry。每次检查都会在服务端铸造一个令牌并立即丢弃;面向自动化建议使用 JSON,但不要在紧凑循环中调用。
glab artifact-registry status --hostname gitlab.example.com --output json
只提取非机密的过期元数据:
glab artifact-registry status \
--hostname gitlab.example.com \
--output json \
--jq '.expires_at'
在为其他进程请求令牌之前,先确认 issuer、subject 和 audience 指向预期的实例、操作者和 registry。
请求短期令牌
文本输出会把裸令牌写到 stdout,便于 shell 捕获或管道传递。默认时长为 15 分钟;可接受时长为 1 秒至 12 小时。请使用能覆盖操作的最短时长。
# 避免命令追踪,仅将令牌保存在进程内局部变量中
set +x
artifact_token="$(glab artifact-registry get-token \
--hostname gitlab.example.com \
--duration 15m)"
# 通过 stdin 传入,而不是作为命令行参数。从目标 registry 的文档或
# 管理员处获取 registry 主机与所需用户名。
printf '%s' "$artifact_token" | \
docker login <artifact-registry-host> \
--username '<registry-username>' \
--password-stdin
unset artifact_token
仅当消费方还需要过期时间时才使用 --output json。由于 JSON 文档包含令牌,应将其视为机密。不要使用会把令牌打印到日志中的 --jq 表达式。
使用方式:配置包管理器认证
glab artifact-registry login 每次运行只配置一个包管理器:
- --docker 安装 docker-credential-glab shim,并在 Docker 的按 registry credHelpers 中注册 glab。
- --maven 向 ~/.m2/settings.xml 写入一个 <server> 块,以 --registry-alias 为键;消费端 <repository> 必须使用相同的 <id>。
- --gradle 向 ~/.gradle/gradle.properties 写入 {alias}Url、{alias}Username 和 {alias}Password,其中 {alias} 为 --registry-alias。
- --npm 向 ~/.npmrc 写入 //{host}{path}/:_authToken 条目;你仍需配置 registry= 或 @scope:registry= 以让 npm 指向该 registry。
- --sbt 向 ~/.sbt/1.0/credentials.sbt 写入一行 credentials +=;使用自定义全局 base 的 sbt 安装可能不会读取该文件。
# 先检查预期的 Docker 配置与已存储的 GitLab 身份
printf 'Docker config: %s\n' "${DOCKER_CONFIG:-$HOME/.docker}/config.json"
glab auth status --hostname gitlab.example.com
# 仅配置经核实的 Artifact Registry 主机名
glab artifact-registry login \
--hostname gitlab.example.com \
--docker \
--registry registry.example.com
# 为 Maven 配置两小时有效期的令牌
glab artifact-registry login \
--hostname gitlab.example.com \
--maven \
--registry https://ar.example.com \
--registry-alias gitlab-ar \
--duration 2h
适用场景与限制
安全与兼容性规则:
- 对于 --docker,--registry 必须是裸主机名,可选带端口。对于 Maven、Gradle、npm 和 sbt,--registry 通常是 URL。
- Docker 在每次拉取或推送时兑换一个新令牌,因此 --duration 不适用。Maven、Gradle、npm 和 sbt 会收到一个静态令牌;需在 --duration 到期前重新运行命令。
- Docker 辅助子进程有意忽略 GITLAB_TOKEN。它通常读取由 glab auth login 存储的令牌;在 GitLab CI 作业中,当通过 GLAB_ENABLE_CI_AUTOLOGIN=true 启用 CI 自动登录时,它也遵循 CI_JOB_TOKEN。Maven、Gradle、npm 和 sbt 的登录路径可以读取 GITLAB_TOKEN,因为 glab 会把交换后的令牌写入各工具的配置文件。
- 仅对确实由 GitLab Artifact Registry 支撑的 registry 使用此功能。误将普通容器 registry 归类,可能使每次拉取都失败,因为交换得到的 Artifact Registry 令牌会优先。
- 写入前请检查目标配置路径:${DOCKER_CONFIG:-$HOME/.docker}/config.json、~/.m2/settings.xml、~/.gradle/gradle.properties、~/.npmrc 或 ~/.sbt/1.0/credentials.sbt。
- --registry-alias 仅适用于 Maven 和 Gradle。对于 Gradle,请选择在构建脚本中为合法标识符的别名;派生出的默认值可能包含连字符。
- 对同一 registry 重新运行命令会刷新或替换匹配的条目。配置完成后,针对预期主机测试一个非破坏性的包管理器操作,且不要打印凭据。
故障排查
- 不支持或未找到:请与实例管理员核实 GitLab EE 19.1+ 与 gate_token_exchange_endpoint 功能标志。
- issuer/subject/audience 错误:停止操作;重新检查 --hostname、环境变量令牌优先级以及 glab auth status --hostname <host>。
- 时长被拒绝:使用 1s 至 12h 之间的 Go 风格时长。
- 令牌过期:请求一个新的短期令牌;不要持久化或尝试刷新旧令牌。
- Docker 设置期间出现存储令牌错误:运行 glab auth login --hostname <host>;仅环境变量的令牌不会被 Docker 辅助程序使用。
- 凭据助手冲突:检查 Docker 现有的 credHelpers 条目,除非操作者明确批准迁移,否则保留当前助手。
- 构建工具仍未通过认证:核实该工具读取的是 glab artifact-registry login 写入的文件,且其 registry URL 或 repository ID 与写入的键匹配。
命令帮助采集内容见 references/commands.md。