首页 文章

GitLab CI ssh注册表登录

提问于
浏览
3

我有一个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.comdocker 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 回答

  • 0

    我会回答我自己的问题,万一其他人偶然发现它 . 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"
    
  • 1

    docker login 命令创建一个本地配置文件,其中您的凭据存储在 $HOME/.docker/config.json ,如下所示(另请参见the documentation):

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

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

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

    关于SSH登录本身;这应该工作得很好 . 如果您真的想要取消SSH登录,您可以在目标计算机上设置Docker引擎以侦听外部套接字,使用the official documentation中所述的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
    
  • 2

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

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

相关问题