【问题标题】:Drone CI failing on clone stepDrone CI 在克隆步骤中失败
【发布时间】:2018-02-26 20:47:06
【问题描述】:

我在一台机器上运行 docker-compose 以下内容:

  • gitlab
  • 无人机(服务器)
  • 无人机(代理)

当我触发构建(或由 git push 触发)时,drone 一直在这个问题上失败:

git init
Initialized empty Git repository in /drone/src/.git/
git remote add origin http://my-git/amaziagur/location-service.git
git fetch --no-tags origin +refs/heads/master:
fatal: unable to access 'http://my-git/amaziagur/location-service.git/': Couldn't resolve host 'my-git'
exit status 128

这里是 docker-compose.yml:

version: '2'
services:
  #PROXY
  gitlab:
    image: 'gitlab/gitlab-ce:9.1.0-ce.0'
    restart: always
    hostname: 'my-git'
    links:
      - postgresql:postgresql
      - redis:redis
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        postgresql['enable'] = false
        gitlab_rails['db_username'] = "gitlab"
        gitlab_rails['db_password'] = "gitlab"
        gitlab_rails['db_host'] = "postgresql"
        gitlab_rails['db_port'] = "5432"
        gitlab_rails['db_database'] = "gitlabhq_production"
        gitlab_rails['db_adapter'] = 'postgresql'
        gitlab_rails['db_encoding'] = 'utf8'
        redis['enable'] = false
        gitlab_rails['redis_host'] = 'redis'
        gitlab_rails['redis_port'] = '6379'
        external_url 'http://my-git'
        gitlab_rails['gitlab_shell_ssh_port'] = 30022
    ports:
      # both ports must match the port from external_url above
      - "80:80"
      # the mapped port must match ssh_port specified above.
      - "30022:22"
  # the following are hints on what volumes to mount if you want to persist data
    volumes:
     - /data/gitlab/config:/etc/gitlab:rw
     - /data/gitlab/logs:/var/log/gitlab:rw
     - /data/gitlab/data:/var/opt/gitlab:rw

  postgresql:
    restart: always
    image: postgres:9.6.2-alpine
    environment:
      - POSTGRES_USER=gitlab
      - POSTGRES_PASSWORD=gitlab
      - POSTGRES_DB=gitlabhq_production
  # the following are hints on what volumes to mount if you want to persist data
    volumes:
     - /home/foresight/postgresql:/var/lib/postgresql:rw

  redis:
    restart: always
    image: redis:3.0.7-alpine
  # DRONE
  drone-server:
    image: drone/drone:0.7.3
    ports:
      - "8000:8000"
    networks:
      - drone
      - gitlab
    links:
     - gitlab
    volumes:
      - /home/drone:/var/lib/drone/
    environment:
      #@@@@@
      DRONE_OPEN: "true"
      DRONE_HOST: "http://10.0.0.200:8000"
      DRONE_ADMIN: amaziagur
      DRONE_GITLAB: "true"
      DRONE_GITLAB_URL: "http://10.0.0.200"
      DRONE_GITLAB_CLIENT: "secret"
      DRONE_GITLAB_SECRET: "secret"
      DRONE_SECRET: "my_secret"
      #@@@@@@@
  drone-agent:
    image: drone/drone:0.7.3
    command: agent
    depends_on:
      - drone-server
    networks:
      - drone
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      DRONE_SERVER: ws://drone-server:8000/ws/broker
      DRONE_DEBUG: "true"
      DRONE_SECRET: "our_secret_4ever_and_ever"

networks:
  drone:
    driver: bridge
  gitlab:
    driver: bridge

两个都装在同一台机器上,搞不明白自己做错了什么,无人机老是不识别git主机是什么原因。

我已经在本地 /etc/hosts 和我在网上找到的 /etc/resolve.conf 提示中添加了映射。 有人可以帮忙吗?

【问题讨论】:

  • 配置gitlab时需要使用IP地址或域名。您不能使用内部 docker 主机名(例如 my-git),因为当无人机生成管道容器时,这些容器将位于不同的网络上,并且无法解析 my-git

标签: docker docker-compose gitlab drone drone.io


【解决方案1】:

因为这是本期中排名最高的问题,所以我想将其汇总。

previously mentioned issue 有您需要的回复,但不是很清楚,因为它在 github mentions 日志中,并且最初链接的问题在没有解决方案的情况下关闭。


解决方案

您可以将 DRONE_RUNNER_NETWORKS= 传递给代理(或 如果您不使用代理,请访问服务器)。当无人机生成容器时 它将所有容器附加到指定的网络。

来源:https://discourse.drone.io/t/gitea-drone-traefik-agent-cannot-reach-git-repo/4170/2?u=bradrydzewski

注意,您还想在 docker-compose:https://docs.docker.com/compose/networking/#specify-custom-networks 中将网络添加到您的跑步者 - 否则初始 ping 将失败并且不会产生更多跑步者。

一个完整的无人机 docker runner 示例:

drone-runner-docker:
  volumes:
      - '/var/run/docker.sock:/var/run/docker.sock'
  environment:
      - DRONE_RPC_PROTO=http
      - DRONE_RPC_HOST=172.20.0.19
      - DRONE_RPC_SECRET=SECRET
      - DRONE_RUNNER_CAPACITY=2
      - DRONE_RUNNER_NAME=drone-runner-docker
      - DRONE_RUNNER_NETWORKS=droneio_network,another_network
  networks:
      droneio_network:
      another_network:
  ports:
      - '3000'
  restart: always
  image: 'drone/drone-runner-docker:latest'

有关变量的说明,请参阅drone docs

确保您在环境中为DRONE_RUNNER_NETWORKS 提供的名称是来自docker network ls 的实际网络名称。 (如果通过 docker-compose 生成,它们通常前面有文件夹名称,例如 foldername_default

【讨论】:

    【解决方案2】:

    Brad Rydzewski's comment 让我走上了正轨。他说:

    配置 gitlab 时需要使用 IP 地址或域名。您不能使用内部 docker 主机名(例如 my-git),因为当无人机生成管道容器时,这些容器将位于不同的网络上,并且无法解析 my-git

    这完全正确。这是对我有用的最终配置:

    version: '2'
    services:
        web:
          image: 'gitlab/gitlab-ce:latest'
          restart: always
          environment:
            GITLAB_OMNIBUS_CONFIG: |
              external_url '<IP address or domain name>'
              gitlab_rails['gitlab_shell_ssh_port'] = 22
              # Add any other gitlab.rb configuration here, each on its own line
          ports:
            - '80:80'
            - '443:443'
            - '22:22'
          volumes:
            - '/srv/gitlab/config:/etc/gitlab'
            - '/srv/gitlab/logs:/var/log/gitlab'
            - '/srv/gitlab/data:/var/opt/gitlab'
    
        drone-server:
          image: drone/drone:0.7.3
          links:
            - web
          ports:
            - "8000:8000"
          volumes:
            - /home/drone:/var/lib/drone/
          environment:
            DRONE_OPEN: "true"
            DRONE_HOST: "<IP address or domain name> : <port>"
            DRONE_ADMIN: <admin users - should be git user names>
            DRONE_GITLAB: "true"
            DRONE_GITLAB_URL: "<IP address or domain name>"
            DRONE_GITLAB_CLIENT: "<Application Id in gitlab>"
            DRONE_GITLAB_SECRET: "<Secret in gitlab>"
            DRONE_SECRET: "<secret drone>"
        drone-agent:
          image: drone/drone:0.7.3
          command: agent
          depends_on:
            - drone-server
          volumes:
            - /var/run/docker.sock:/var/run/docker.sock
          environment:
            DRONE_SERVER: ws://drone-server:8000/ws/broker
            DRONE_DEBUG: "true"
            DRONE_SECRET: "<secret drone>"
    

    【讨论】:

      【解决方案3】:

      TL;DR

      主要原因,是因为实际的克隆步骤是由一个 adhoc 独立的 docker 容器驱动的,即在它自己的 docker 网络中。所以它无法解析名称my-git,即使它能够解析它,它也无法到达它。

      预期的解决方法失败:

      首先,您会注意到您的错误是关于解决 my-git。这必须在实际执行克隆的 docker git 容器实例上解决,而不是在任何其他地方。这意味着修改这个 docker 实例的/etc/hosts。这可以在您的.drone.yml 中完成,方法是将克隆步骤替换为您的步骤,并使用docker-composeextra_hosts 功能(参见docs)。它是这样完成的:

      kind: pipeline
      name: default
      
      clone:
        disable: true
      
      steps:
      - name: myclone
        image: docker:git
        ## If you wanted to solve resolving part
        extra_hosts:
          - "my-git:10.0.0.200"
        ## Alas this will also be needed, and is NOT supported yet
        # networks:
        #  - gitlab
        commands:
          ## this will show you if ``my-git`` is resolved.
          - ping -c 1 my-git
          - git clone http://my-git/amaziagur/location-service.git/
      
      ##
      ## ... your normal steps follows ...
      ##
      
      

      唉,如果您的容器现在能够将 my-git 解析为实际 IP,它仍然无法访问它,因为它是在未连接到另一个的自定义网络中生成的。

      为此,我们还需要指定 docker 实例应该连接到的网络,这通常通过 docker-compose 中的 networks 键完成(您可以在docker-compose reference about specifying custom networks)。

      唉,目前drone 不支持此功能,这是目前通过this issue 跟踪的一个错误。在撰写本文时,即使在 1.0.0-rc.5 中也仍未解决。

      请注意,如果networks 键按预期工作,extra_hosts 将是多余的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-16
        • 2019-05-10
        • 2023-03-12
        • 2014-11-17
        • 2011-06-11
        • 1970-01-01
        • 2017-07-28
        • 2014-09-08
        相关资源
        最近更新 更多