我有一个GitLab项目gitlab.com/my-group/my-project,它有一个CI管道,用于构建图像并将其推送到项目的GitLab注册表registry.gitlab.com/my-group/my-project:tag。我想将这个映像部署到,在那里,我有一个正在运行的VM停靠程序。
通过ssh‘’ing到VM,然后是docker login registry.gitlab.com和docker run ... registry.gitlab.com/my-group/my-project:tag,就可以很容易地手动完成它。除了docker login命令是交互式的,这对于CI来说是不可接受的。它可以在命令行上接受用户名和密码,但是即使我的登录信息在秘密变量中(将GitLab登录凭据存储在GitLab秘密变量中?),这也不是正确的做法。
这是管道部署阶段的预期工作流:
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运行程序中运行,它可以访问秘密变量,但这真的是从GitLab通过ssh登录到GitLab注册表的最佳方式吗?
发布于 2016-12-21 20:11:37
我会回答我自己的问题,以防其他人发现它。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"发布于 2016-12-21 20:09:11
docker login命令创建一个本地配置文件,其中您的凭据存储在$HOME/.docker/config.json中,如下所示(请参阅此文件中的文献资料 ):
{
"auths": {
"<registry-url>": {
"auth": "<credentials>"
}
}
}只要主机上存在config.json文件,并且凭据(在本例中只是存储为base64("<username>:<password>"))不发生更改,就不需要在每个构建上运行docker login,也不需要将凭据存储为CI作业的变量。
我的建议是确保目标计算机上存在config.json文件(手动运行docker login一次,或者使用任何您喜欢的配置管理工具部署该文件)。这将避免您在构建管道中处理登录和管理凭据。
关于SSH登录本身,这应该工作得很好。如果您真的希望消除SSH登录,可以在目标计算机上设置Docker引擎,以侦听外部套接字,使用正式文件中描述的TLS客户端证书配置身份验证和加密,并在构建作业中直接与远程服务器的Docker对话:
variables:
DOCKER_HOST: "tcp://<target-server>:2376"
DOCKER_TLS_VERIFY: "1"
script:
- docker run registry.gitlab.com/my-group/my-project:tag发布于 2016-12-21 16:56:21
我们对其他主机提供商也有同样的“问题”。我们的解决方案是使用某种自定义脚本,它运行在目标机器上,可以通过Rest-Api端点(由Basic或其他任何方式保护)调用。
因此,您可以只触发远程主机进行对接登录和升级服务,而无需通过gitlab-ci授予SSH访问权限。
https://stackoverflow.com/questions/41267827
复制相似问题