我有一个GitLab项目 gitlab.com/my-group/my-project
,它有一个CI管道,可以构建一个图像并将其推送到项目的GitLab注册表 registry.gitlab.com/my-group/my-project:tag
. 我想将此图像部署到Google Compute Engine,在那里我有一个运行docker的VM .
通过ssh进入VM手动轻松完成,然后 docker login registry.gitlab.com
和 docker run ... registry.gitlab.com/my-group/my-project:tag
. 除了 docker login
命令是交互式的,这对CI来说是不可取的 . 它可以在命令行上接受用户名和密码,但即使我的登录信息位于secret variable(将我的GitLab登录凭据存储在GitLab秘密变量中......),这也不是正确的事情 .
这是管道的Deploy阶段的预期工作流程:
-
安装
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中运行,它可以访问秘密变量,但这是否真的是从GitLab通过ssh登录GitLab Registry的最佳方式?
3 回答
我会回答我自己的问题,万一其他人偶然发现它 . GitLab creates ephemeral access tokens for each build of the pipeline给予用户
gitlab-ci-token
访问GitLab注册表 . 解决方案是以构建中的gitlab-ci-token
用户身份登录 ..gitlab-ci.yml(摘录):
docker login
命令创建一个本地配置文件,其中您的凭据存储在$HOME/.docker/config.json
,如下所示(另请参见the documentation):只要主机上存在
config.json
文件且您的凭据(在这种情况下只是存储为base64("<username>:<password>")
)不会更改,就不需要在每次构建时运行docker login
或将凭据存储为CI作业的变量 .我的建议是简单地确保目标机器上存在
config.json
文件(通过手动运行docker login
或使用您喜欢的任何配置管理工具部署文件) . 这使您无需在构建管道中处理登录和管理凭据 .关于SSH登录本身;这应该工作得很好 . 如果您真的想要取消SSH登录,您可以在目标计算机上设置Docker引擎以侦听外部套接字,使用the official documentation中所述的TLS客户端证书配置身份验证和加密,并直接与远程服务器的Docker API通信构建工作:
我们在其他托管服务提供商处遇到了同样的“问题” . 我们的解决方案是使用在目标机器上运行的某种自定义脚本,并且可以通过Rest-Api endpoints 调用(由Basic-Auth或任何其他设备保护) .
因此,您可以触发远程主机执行docker登录并升级您的服务,而无需通过gitlab-ci授予SSH访问权限 .