繁体   English   中英

GitLab CI ssh注册表登录

[英]GitLab CI ssh registry login

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

这是管道的Deploy阶段的预期工作流程:

  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中运行,它可以访问秘密变量,但这是否真的是从GitLab通过ssh登录GitLab Registry的最佳方式?

我会回答我自己的问题,万一其他人偶然发现它。 GitLab为管道的每个构建创建临时访问令牌,为用户提供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 login命令创建一个本地配置文件,其中您的凭据存储在$HOME/.docker/config.json ,如下所示(另请参阅此文档 ):

{
    "auths": {
        "<registry-url>": {
            "auth": "<credentials>"
        }
    }
}

只要主机上存在config.json文件并且您的凭据(在这种情况下只是存储为base64("<username>:<password>") )不更改,就不需要运行docker login on每次构建或将您的凭据存储为CI作业的变量。

我的建议是简单地确保目标机器上存在config.json文件(通过手动运行docker login或使用您喜欢的任何配置管理工具部署文件)。 这使您无需在构建管道中处理登录和管理凭据。

关于SSH登录本身; 这应该工作得很好。 如果您真的想要消除SSH登录,可以在目标计算机上设置Docker引擎以侦听外部套接字,使用官方文档中所述的TLS客户端证书配置身份验证和加密,并直接与远程服务器的Docker API进行通信从构建工作中:

variables:
  DOCKER_HOST: "tcp://<target-server>:2376"
  DOCKER_TLS_VERIFY: "1"
script:
  - docker run registry.gitlab.com/my-group/my-project:tag

我们在其他托管服务提供商处遇到了同样的“问题”。 我们的解决方案是使用在目标机器上运行的某种自定义脚本,并且可以通过Rest-Api端点调用(由Basic-Auth或任何其他设备保护)。

因此,您可以触发远程主机执行docker登录并升级您的服务,而无需通过gitlab-ci授予SSH访问权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM