如何安全地从GitLab Runner KubernetesExecutor窗格推送到私有容器注册表?

时间:2020-03-05 10:00:27

标签: docker kubernetes continuous-integration gitlab-ci gitlab-ci-runner

目标

构建CI / CD管道可以使用具有一定项目结构的多个GitLab存储库。为此,将构建具有Python代码的Docker容器,然后将其安全地推送到Google Cloud的Container Registry。

设置

  • 使用GitLab提供的Helm chart将KubernetesExecutor安装在Kubernetes Engine上。
  • 构建过程的基本映像(runners.image中的values.yaml)是自定义映像,因为这有助于自动容器化提供的存储库。 值得一提的原因是,这是与相同专用存储库中的映像应推送到的位置。
  • 现在,从存储库构建容器已成功运行(请参见下面的代码)。

问题

如何图像推送到容器注册表而无需将服务帐户密钥添加到Docker图像(否则,请说服我这不是一个坏习惯) ?

代码

.gitlab-ci.yml

services:
  - docker:19.03.1-dind

stages:
  - build

build:
  stage: build
  script:
    - docker build -t ${CONTAINER_REGISTRY}/pyton-container-test:latest .
    # This line is where I'd need to use `docker login`, I guess.
    - docker push ${CONTAINER_REGISTRY}/python-container-test:latest

values.yaml(头盔)

值得一提的是,GitLab Runner设置了以下环境变量:

runners:
  env:
    DOCKER_DRIVER: overlay2
    DOCKER_HOST: tcp://localhost:2375
    DOCKER_TLS_CERTDIR: ""
    CONTAINER_REGISTRY: eu.gcr.io/<project_id>

解决方案的方向

我认为我应该能够将Kubernetes集群中的秘密安装到GitLab Runner构建吊舱中,但是我似乎找不到解决方法。然后,我应该能够将以下行添加到.gitlab-ci.yml中:

cat mounted_secret.json | docker login -u _json_key --password-stdin https://eu.gcr.io

设置config.toml以使用secret volume应该可以。但是,对于Helm图表,这似乎还不可能。

注释

  • 可以在GitLab CI中设置受保护的环境变量,但我宁愿不这样做,因为它们较难维护。
  • 我已经研究了this的答案,但这表明我需要在Docker映像中添加密钥。
  • 研究了GitLab documentation,有关使用私有容器注册表的信息,但似乎并没有获得更多帮助。
  • 例如,在构建过程中必须将其连接到数据库时,也会发生类似的问题。

1 个答案:

答案 0 :(得分:1)

GitLab提供的default Helm chart是不可能的。但是,自定义它们时有解决方法

templates/configmap.yaml中,可以编辑entrypoint。最后,跑步者如下启动:

# Start the runner
exec /entrypoint run --user=gitlab-runner \
     --working-directory=/home/gitlab-runner

要执行此操作,将根据提供的config.toml(带有正确的Runner令牌)生成一个values.yaml。这意味着在此步骤之前,我们可以根据需要编辑config.toml。就我而言,我只是添加了:

echo "    [[runners.kubernetes.volumes.secret]]" >> ${CONFIG_FILE}
echo "      name = \"{{ .Values.secretName }}\"" >> ${CONFIG_FILE}
echo "      mount_path = \"/keys\"" >> ${CONFIG_FILE}
echo "      read_only = true" >> ${CONFIG_FILE}

${CONFIG_FILE}/home/gitlab-runner/.gitlab-runner/config.toml的地方。

最后,您可以使用以下方法部署GitLab Runner:

$ helm install project_name -f values.yaml <path to chart>