GitLab Runner 常见问题


1. 使用docker executor runner时,出现Runner无法连接网络的问题

这个是关于宿主机与Container的DNS的映射问题,详情可以访问https://github.com/docker/libnetwork/issues/2187。

你的pipeline可能出现如下情况:
fatal: unable to access 'https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@code.siemens.com/zhen.xie/iavgitlabrunnertest.git/': Could not resolve host: code.siemens.com

该问题的解决办法是在Runner的配置文件config.toml里增加dns = ["..."],dns的值你可以通过在宿主机上运行nmcli dev show来获得。
这个问题讲述的是docker executor无法访问外网的问题,需要添加dns配置参数来实现

我这边遇到这个问题跟这个有点类似,是无法解析自定义的域名的问题,处理办法是添加参数:extra_hosts = ["gitlab.example.com:192.168.80.201","jdd.io:192.168.2.162"]
详看文章 gitlab和gitlab-runner的一个小坑:https://www.cnblogs.com/sanduzxcvbnm/p/14668269.html

2.Pipeline出现"JAVA_HOME is not set and no java command could be found in your PATH"

这个错误通常出现在使用Shell executor时,可以在GitLab page上设置这个环境变量,具体路径是GitLab page -> Settings -> CI/CD -> Variables。

3.Runner间隔多久去GitLab上检查是否有job

config.toml文件的check_interval字段会决定这个时间间隔,它的默认值是3秒(注意当你把它设为0时依然采用的是默认值3秒,而不是0秒)。

在config.toml文件中定义了很多runner,它们可能executor类型不同,可能注册地址不同,但都是由GitLab Runner这个服务来管理的,为了与GitLab Runner区分开,我们将config.toml文件中定义的runner称为worker。对于不同的worker,worker之间(如worker A ---> worker B)的间隔为check_interval / worker_nums,但是对于worker A本身来说它下次去检查是否有job的时间间隔仍为check_interval。我们再举个简单例子:config.toml定义了3个worker—— worker A, worker B 和 worker C,check_interval采用默认值为3秒,第0秒时worker A会去检查是否有属于自己的job,第1秒时worker B会去检查,第2秒时worker C去检查,第3秒时worker A再检查……这个过程中worker A到worker B的间隔为3 / 3 = 1秒,而对于worker A下次检查job时的时间间隔为check_interval,即3秒。

4.config.toml里的concurrent字段的意义

concurrent限制了整个GitLab Runner能并发处理job的数量。特别注意concurrent与worker数量无任何关系,所有worker的工作是受GitLab Runner控制的,如果concurrent值为1并且有一个worker已经在工作了,那么即使其他worker达到了可以工作的条件也只能“pending”。

5.cache存储在哪里,怎样清除cache

cache是没有过期时间的,而且每一次新的push触发的pipeline,都会重新生成cache,重新生成的cache的名字为“-”,其中num是随着push数量递增的。如果不去清除cache,cache会永久保留在Runner上,日积月累会填满存储空间的,因此最好隔一段时间进行一次清除,清除方法请参考https://docs.gitlab.com/ee/ci/caching/#clearing-the-cache, 清除cache的原理是将相关的volume移除,当然,docker也有自带的清除命令,推荐将docker system prune -f --volumes加入到定时任务中。

6.当我的Runner采用docker作为executor时,无法build docker image

这是个“dind(docker in docker)” 问题,一般pipeline会报如下错误:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
time="2018-12-17T11:12:33Z" level=error msg="failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial unix

有两种解决办法:
第一种解决办法:将本地的docker socket绑定到container里来解决这个问题,具体方法是将volumes = ["/var/run/docker.sock:/var/run/docker.sock"]配置到config.toml文件里。
第二种解决办法:.gitlab-ci.yml文件中增加如下设置

services:
    - docker:dind

7.如何在job所对应的container里使用git clone命令

首先要确保宿主机有权限clone代码,然后你就可以将你的secret挂载到container里,例如,你是通过ssh的方式克隆代码,并且你的ssh目录为/home/.ssh,你就可以在config.toml文件里添加如下配置:

volumes = ["/home/.ssh:/root/.ssh:ro"]

然后,这个job所对应的container就可以拉取指定代码了。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM