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.comdocker run ... registry.gitlab.com/my-group/my-project:tag 。 除了docker login命令是交互式的,这对于CI来说是不可行的。 它可以在命令行上接受用户名和密码,但即使我的login信息在一个秘密variables (将我的GitLablogin凭证存储在GitLab秘密variables中?

这是pipe道Deploy阶段的预期工作stream程:

  1. 安装gcloud工具或使用预安装的映像
  2. 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"