GitLab CI/CD中的Pipeline无法拉取仓库

83次阅读
没有评论

问题描述

在使用GitLab CI/CD时,遇到了一个问题。他的CI pipeline无法拉取仓库,并且出现了以下错误信息:

Running with gitlab-runner 14.3.1 (8b63c432)  on 61f761c24d2a 6sxYm825
Preparing the "docker" executor
Using Docker executor with image gcc ...
Pulling docker image gcc ...
Using docker image sha256:f323b5207c6c929853380a3bfa268c899d8f0120f4364768af24dae31e92c279 for gcc with digest gcc@sha256:1b0593e75693f0f2480910b33b02119f6ad891a5a02a61a6e293ad09c8c3eef1 ...
Preparing environment
Running on runner-6sxym825-project-2-concurrent-0 via da14575dda62...
Getting source from Git repository
Fetching changes with git depth set to 50...
Reinitialized existing Git repository in /builds/root/project/.git/
fatal: unable to access 'http://gitlab/root/project.git/': Could not resolve host: gitlab
ERROR: Job failed: exit code 1

用户怀疑是由于Docker容器无法解析主机名导致的,因为它运行在另一个Docker容器内部。他想知道如何解决这个问题,是否需要将Docker添加到Docker Compose网络中,或者以某种方式告诉它http://gitlab/实际上是什么。

用户还提到他已经更改了/etc/gitlab/gitlab.rb文件中的外部URL配置。

以下是用户提供的相关配置文件:

# .gitlab-ci.yml
image: gcc
build:
  stage: build
  script:
    - echo 123

# /etc/gitlab/gitlab.rb
external_url 'http://gitlab/'

# /etc/gitlab-runner/config.toml
concurrent = 1
check_interval = 0

[[runners]]
  name = "61f761c24d2a"
  url = "http://gitlab/"
  token = "6sxYm825Sa7mwRwRBpyg"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "docker:19.03.12"
    privileged = true
    disable_cache = false
    volumes = ["/certs/client", "/cache"]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]

# docker-compose.yml
version: '3.5'
services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    hostname: gitlab
    container_name: gitlab
    restart: unless-stopped
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        gitlab_rails['gitlab_shell_ssh_port'] = 8822
    ports:
      - "8000:80"
      - "8822:22"
    volumes:
      - ./config/gitlab:/etc/gitlab
      - ./data/gitlab:/var/opt/gitlab
      - ./logs:/var/log/gitlab
    networks:
      - gitlab
  gitlab-runner:
    image: gitlab/gitlab-runner
    container_name: runner
    restart: unless-stopped
    depends_on:
      - gitlab
    volumes:
      - ./config/gitlab-runner:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - gitlab
networks:
  gitlab:

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据用户提供的配置文件,我们可以看到GitLab和GitLab Runner都运行在Docker容器中。在这种情况下,Docker容器内部无法直接解析主机名。

要解决这个问题,我们可以将GitLab和GitLab Runner容器添加到同一个Docker网络中。这样它们就可以通过容器名称相互解析。

以下是解决方案的步骤:
1. 打开docker-compose.yml文件。
2. 在networks部分添加一个新的网络,例如gitlab_network
3. 将gitlabgitlab-runner服务的networks属性修改为新的网络名称。
4. 保存并关闭文件。
5. 在终端中,导航到包含docker-compose.yml文件的目录。
6. 运行以下命令启动GitLab和GitLab Runner容器:
docker-compose up -d
这将启动GitLab和GitLab Runner容器,并将它们连接到同一个网络中。
7. 等待容器启动完成。
8. 现在,GitLab Runner应该能够解析主机名gitlab。重新运行CI pipeline,应该能够成功拉取仓库。

方案2

如果方案1无法解决问题,你可以尝试在GitLab Runner容器中添加额外的DNS解析配置。

以下是解决方案的步骤:
1. 打开/etc/gitlab-runner/config.toml文件。
2. 在[[runners.docker]]部分添加以下配置:
toml
[runners.docker]
dns = ["your_dns_server_ip"]

your_dns_server_ip替换为你的DNS服务器的IP地址。
3. 保存并关闭文件。
4. 重新启动GitLab Runner容器,以使配置生效。

现在,GitLab Runner容器应该能够使用指定的DNS服务器解析主机名。重新运行CI pipeline,应该能够成功拉取仓库。

方案3

如果以上两种方案都无法解决问题,你可以尝试在GitLab Runner容器中修改/etc/hosts文件,手动添加主机名和IP地址的映射关系。

以下是解决方案的步骤:
1. 打开/etc/gitlab-runner/config.toml文件。
2. 在[[runners.docker]]部分添加以下配置:
toml
[runners.docker]
extra_hosts = ["gitlab:your_gitlab_ip"]

your_gitlab_ip替换为你的GitLab服务器的IP地址。
3. 保存并关闭文件。
4. 重新启动GitLab Runner容器,以使配置生效。

现在,GitLab Runner容器应该能够通过主机名gitlab解析到指定的IP地址。重新运行CI pipeline,应该能够成功拉取仓库。

总结

在GitLab CI/CD中,如果Pipeline无法拉取仓库,可能是由于Docker容器无法解析主机名导致的。你可以尝试将GitLab和GitLab Runner容器添加到同一个Docker网络中,或者在GitLab Runner容器中配置额外的DNS解析或修改/etc/hosts文件来解决这个问题。

正文完