我有一个 GitLab 项目 gitlab.com/my-group/my-project
它有一个 CI 管道,可以构建图像并将其推送到项目的 GitLab 注册表 registry.gitlab.com/my-group/my-project:tag
。我想将此镜像部署到 Google Compute Engine,其中我有一个运行 docker 的虚拟机。
通过 ssh 进入虚拟机即可轻松手动完成此操作,然后 docker login registry.gitlab.com
和docker run ... registry.gitlab.com/my-group/my-project:tag
。除了docker login
命令是交互式的,这对于 CI 来说是不行的。它可以在命令行上接受用户名和密码,但这似乎不是正确的做法,即使我的登录信息位于 secret variable 中。 (将我的 GitLab 登录凭据存储在 GitLab secret 变量中?...)
这是管道部署阶段的预期工作流程:
- 安装
gcloud
工具或使用预安装的镜像 -
gcloud compute ssh my-gce-vm-name --quiet --command \ "docker login registry.gitlab.com && docker run registry.gitlab.com/my-group/my-project:tag"
自 gcloud
命令将在 GitLab CI Runner 中运行,它可以访问 secret 变量,但这确实是通过 ssh 从 GitLab 登录 GitLab 注册表的最佳方式 ?
最佳答案
我会回答我自己的问题,以防其他人偶然发现它。 GitLab creates ephemeral access tokens for each build of the pipeline授予用户 gitlab-ci-token 访问 GitLab 注册表的权限。解决方案是在构建中以 gitlab-ci-token
用户身份登录。
.gitlab-ci.yml(摘录):
deploy:
stage: deploy
before_script:
- gcloud compute ssh my-instance-name --command "docker login registry.gitlab.com/my-group/my-project -u gitlab-ci-token -p $CI_BUILD_TOKEN"
关于docker - GitLab CI ssh 注册表登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41267827/