GitLab CI sshregistrylogin
我有一个GitLab项目gitlab.com/my-group/my-project
它有一个CIpipe道,build立一个图像,并将其推送到项目的GitLabregistryregistry.gitlab.com/my-group/my-project:tag
。 我想将此映像部署到Google Compute Engine,在那里我有一个运行docker的VM。
很容易做到手动通过ssh'ing进入虚拟机,然后docker login registry.gitlab.com
和docker run ... registry.gitlab.com/my-group/my-project:tag
。 除了docker login
命令是交互式的,这对于CI来说是不可行的。 它可以在命令行上接受用户名和密码,但即使我的login信息在一个秘密variables (将我的GitLablogin凭证存储在GitLab秘密variables中?
这是pipe道Deploy阶段的预期工作stream程:
- 安装
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中运行,因此它可以访问秘密variables,但这真的是通过GitLab通过sshlogin到GitLab Registry的最佳方式吗?
我们在其他托pipe服务提供商有相同的“问题”。 我们的解决scheme是使用某种在目标机器上运行的自定义脚本,并且可以通过Rest-Api端点(通过Basic-Auth进行保护)来调用。
因此,您可以触发远程主机执行dockerlogin并升级服务,而不通过gitlab-ci授予SSH访问权限。
docker login
命令创build一个本地configuration文件,其中的凭证存储在$HOME/.docker/config.json
,如下所示(另请参阅文档 ):
{ "auths": { "<registry-url>": { "auth": "<credentials>" } } }
只要config.json
文件存在于你的主机上,并且你的凭证(在这种情况下简单地存储为base64("<username>:<password>")
)不会改变,那么就不需要运行docker login
每个版本或将您的凭证存储为CI作业的variables。
我的build议是简单地确保config.json
文件存在于目标机器上(通过手动运行docker login
一次或使用任何你喜欢的configurationpipe理工具来部署文件)。 这样可以避免在构buildpipe道中处理login和pipe理凭据。
关于SSHlogin本身; 这应该工作得很好。 如果你真的想要消除SSHlogin,你可以在目标机器上设置Docker引擎来侦听外部套接字,使用官方文档中描述的TLS客户端证书configurationauthentication和encryption,并直接与远程服务器的Docker API进行通信从构build作业中:
variables: DOCKER_HOST: "tcp://<target-server>:2376" DOCKER_TLS_VERIFY: "1" script: - docker run registry.gitlab.com/my-group/my-project:tag
我会回答我自己的问题,以防其他人绊倒它。 GitLab为pipe道的每个构build创build临时访问令牌,使用户可以通过gitlab-ci-token
访问GitLabregistry。 解决scheme是在构build中以gitlab-ci-token
用户身份login。
.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"