如何在Docker中使用GitLab Runner查看自定义CA根证书

And*_*ios 13 gitlab root-certificate docker gitlab-ci gitlab-ci-runner

我已安装并配置:

  1. 在HTTPS 上运行的ServerA上的本地GitLab Omnibus
  2. ServerB中作为Docker Service安装的本地GitLab-Runner

ServerA证书由自定义CA Root生成

配置

我已将CA根证书放在ServerB上:

/srv/gitlab-runner/config/certs/ca.crt
Run Code Online (Sandbox Code Playgroud)

按照容器中的Run GitLab Runner中的描述在ServerB上安装Runner - Docker镜像安装和配置:

docker run -d --name gitlab-runner --restart always \
           -v /srv/gitlab-runner/config:/etc/gitlab-runner \
           -v /var/run/docker.sock:/var/run/docker.sock \
           gitlab/gitlab-runner:latest
Run Code Online (Sandbox Code Playgroud)

注册跑步者 - 单行注册命令中所述注册跑步者:

docker run --rm -t -i 
            -v /srv/gitlab-runner/config:/etc/gitlab-runner 
           --name gitlab-docker-runner gitlab/gitlab-runner register \
           --non-interactive \
           --executor "docker" \
           --docker-image alpine:latest \
           --url "https://MY_PRIVATE_REPO_URL_HERE/" \
           --registration-token "MY_PRIVATE_TOKEN_HERE" \
           --description "MyDockerServer-Runner" \
           --tag-list "TAG_1,TAG_2,TAG_3" \
           --run-untagged \
           --locked="false"
Run Code Online (Sandbox Code Playgroud)

此命令提供以下输出:

更新CA证书...
运行时平台arch = amd64 os = linux pid = 5 revision = cf91d5e1 version = 11.4.2
在系统模式下运行.

注册跑步者...成功的跑步者= 8UtcUXCY
跑步者注册成功.随意启动它,但如果它已经运行,配置应该自动重新加载!

我查了一下

$ docker exec -it gitlab-runner bash 
Run Code Online (Sandbox Code Playgroud)

和一次在容器中

$ awk -v cmd='openssl x509 -noout -subject' '
/BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt
Run Code Online (Sandbox Code Playgroud)

并且自定义CA根目录正确.

问题

从GitLab-CI运行Gitlab-Runner时,管道失败告诉我:

$ git clone https:// gitlab-ci-token:$ {CI_BUILD_TOKEN} @ ServerA/foo/bar/My-Project.wiki.git


克隆到'My-Project.wiki'......


致命:无法访问' https:// gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@ServerA/foo/bar/My-Project.wiki.git/ ':服务器证书验证失败.CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile:none


错误:作业失败:退出代码1

它无法识别Issuer(我的自定义CA Root),但根据自签名证书或自定义证书颁发机构,点n.1,它应该是开箱即用的:

默认值:GitLab Runner读取系统证书存储,并根据存储在系统中的CA验证GitLab服务器.

然后,我从第n.3点开始尝试解决方案,编辑

/srv/gitlab-runner/config/config.toml:
Run Code Online (Sandbox Code Playgroud)

并添加:

[[runners]]
tls-ca-file = "/srv/gitlab-runner/config/certs/ca.crt"
Run Code Online (Sandbox Code Playgroud)

但它仍然无效.

如何让Gitlab Runner读取CA Root证书?

Phi*_*wig 7

您有两种选择:

忽略SSL验证

将其放在您的顶部.gitlab-ci.yml

variables:
  GIT_SSL_NO_VERIFY: "1"
Run Code Online (Sandbox Code Playgroud)

将GitLab-Runner指向正确的证书

官方文档中所述,您可以使用tls-*-file选项设置证书,例如:

[[runners]]
  ...
  tls-ca-file = "/etc/gitlab-runner/ssl/ca-bundle.crt"
  [runners.docker]
  ...
Run Code Online (Sandbox Code Playgroud)

文档所述,“每次运行程序尝试访问GitLab服务器时,都会读取此文件。”

其他选项包括tls-cert-file定义需要使用的证书。

  • 我怀疑文档中缺少某些内容,需要对config.toml进行一些调整(例如tls_verify应该具有什么值,priviledge_mode等具有什么值),仅靠tls-ca-file恕我直言是不够的。而且,不用说根据该页面,一切都应该不做任何事情:/ (2认同)

And*_*ios 5

尽管我仍然不知道为什么它不能开箱即用,但是我发现了哥伦布的蛋

Gitlab-Runner配置:

[[runners]]
  name = "MyDockerServer-Runner"
  url = "https://MY_PRIVATE_REPO_URL_HERE/"
  token = "MY_TOKEN_HERE"
  executor = "docker"
  ...
  [runners.docker]
    image = "ubuntu:latest"

  # The trick is the following:
    volumes = ["/cache","/srv/gitlab-runner/config:/etc/gitlab-runner"]
    ...
Run Code Online (Sandbox Code Playgroud)

Gitlab-ci.yml管道:

MyJob:
    image: ubuntu:latest

    script:
      - awk -v cmd='openssl x509 -noout -subject' '/BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt
      - git clone https://gitlab-ci-token:${CI_BUILD_TOKEN}@ServerA/foo/bar/My-Project.wiki.git
      - wget -O foo.png https://ServerA/foo/bar/foo.png 

    before_script:
      - apt-get update -y >/dev/null
      - apt-get install -y apt-utils dialog >/dev/null
      - apt-get install -y git >/dev/null
      - apt-get install -y wget >/dev/null

    # The trick is the following:
      - cp /etc/gitlab-runner/certs/ca.crt /usr/local/share/ca-certificates/ca.crt
      - update-ca-certificates
Run Code Online (Sandbox Code Playgroud)

而已:

  • 挂载一次卷(每个Docker执行器
  • 一次更新CA证书(每个作业

一切都将如预期git clonewget https,等...

一个不错的解决方法,直到GitLab上的某个人解决它或向我解释我错了(成为我的客人!)


mse*_*mys 5

不确定这是最好的方法,但至少它对我有用。您可以创建自定义的 gitlab runner 镜像并在其中添加您的根 CA:

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Dockerfile\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 myca.crt\n
Run Code Online (Sandbox Code Playgroud)\n\n
# Dockerfile\nFROM gitlab/gitlab-runner:latest\nCOPY myca.crt /usr/local/share/ca-certificates\nRUN update-ca-certificates\n
Run Code Online (Sandbox Code Playgroud)\n\n

构建它:

\n\n
docker build -t custom-gitlab-runner .\n
Run Code Online (Sandbox Code Playgroud)\n\n

并重新运行所有命令,只需记住使用这个新的图像名称即可。

\n\n

无关,但相关并且可能有用

\n\n

Dockerized gitlab-runner 似乎也会忽略您的 中的条目/etc/hosts,因此如果您在自定义域上启动了 Gitlab,例如https://gitlab.local.net,您需要传递来自/etc/hosts在启动/注册 gitlab runner 时传递值:

\n\n
docker run -d --name gitlab-runner --restart always \\\n       --add-host="gitlab.local.net:192.168.1.100" \\\n       ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果你想启动docker:dind(docker in docker service)容器来构建docker镜像,你还需要在里面设置这些值/srv/gitlab-runner/config/config.toml

\n\n
[[runners]]\n  url = "https://gitlab.local.net/"\n  executor = "docker"\n  pre_clone_script = "echo \'192.168.1.100 gitlab.local.net registry.local.net\' >> /etc/hosts"\n  ...\n
Run Code Online (Sandbox Code Playgroud)\n