这部分主要开始围绕CI/CD的排错进行.
说明: 本文依赖的环境是早期
docker + kubeadm + gogs + jenkins组合, 以下补充会把一些新版本更稳的做法一起标出来.
0x00.gogs相关问题
1.gogs初始化到/data目录时Permission denied (安装harbor后)
如图,尝试过给chmod 777 的权限了,还是不行,而且手动在/data下创建文件夹 是完全没问题的. 创建之后仍然报一样的错. 说明是哪里设置了阻碍. 搞清楚映射关系之后才发现之前想的方向错了…. 过程就不多说了
更新:
导致原因是cent7的selinux ,参考 . 因为自己测试的虚拟机是新的…忘记关selinux了.真是坑爹.setenforce 0.永久关参考k8
补一条更推荐的处理方式: 如果只是容器挂载卷权限问题, 优先给 volume/bind mount 增加 :z 或 :Z 标签, 不要直接长期关闭 SELinux.
2.gogs关机之后不会自动启动.
这个照理说是不应该的,参考的办法都比较老旧. 还是得参考一下官方github的issue. 这样比较稳妥. 待后续更新
0x01.docker相关问题
1.docker17.x版本安装
cent下默认yum install -y docker 的版本是1.12 (最近遇到有些jenkins插件不支持docker-daemon <1.25的) 加之17.6版本已经很稳定了.所以提供一波更新方法. (k8也不用去改cgroups这鬼了) 参考官方 ,这是最快最稳的,
1 | #0.删除老旧的 |
这里补一个时效说明: 这段是 17.x 年代的安装路径, 现在版本号和仓库结构都变了; 如果是新集群, 更常见是直接使用 containerd, Docker 则更多用于本地构建与调试.
2.docker0网卡172.17.0.1冲突
这种情况应该说很少见…因为经过测试发现需要同时满足两个情况 : (2需要继续确认)
- 安装docker前,主机ip不是172.17.x.x 网段. (这样docker0会默认选择
172.17.0.1作为ip) - 安装docker后,主机ip被人为改成了172.17.x.x网段…并且172.17 ip段的网关正好是
171.17.0.1.
那么一般网关是不会给你改的..就需要手动修改docker0的地址. 但是这个并不是直接修改个ip这么简单.需要做以下工作: (参考blog cent7.4为例)
ip link set dev docker0 down停止docker0, 然后reboot重启机器 ,注意这里非常坑,网上都没有提到,或者说重启网络或者docker就行了,实际是无效的.. 重启后docker0才会消失yum -y install bridge-utils安装网桥工具. 这个地方有个很坑的是,如果docker0跟网关冲突,那你如果不先停掉docker0,重启网络服务只能获得大概5s左右的网. 也就没法安装,所以有了 第0步..删除网桥(如果有第0步可以跳过),查看
1
2$ brctl delbr docker0
$ brctl show #检验是否为空创建新网桥,设置网桥ip,启动
1
2
3$ brctl addbr bridge0
$ ip addr add 172.18.0.1/16 dev bridge0 #ip可以自行修改,注意/后正确
$ ip link set dev bridge0 up #启动然后修改docker启动配置,重新启动docker (启动配置不同OS不一样,不要乱参考.改错地方是不能生效的)
1
2
3
4
5
6
7$ vi /usr/lib/systemd/system/docker.service
#修改启动这行为
#ExecStart=/usr/bin/dockerd-current -b bridge0 \
#重新启动.报错注意\后不能有空格
$ systemctl daemon-reload
$ systemctl restart docker
现在更建议把网桥网段放进 /etc/docker/daemon.json(例如 bip 或 default-address-pools), 避免长期改 systemd unit 导致后续升级被覆盖.
(*.重装) 如果上面的方法你觉得不妥,选择重装docker亦可. (镜像&容器默认会保存下来,这个不用担心.)
1 | $ yum list installed | grep docker |
你会发现,原本默认选择172.17.0.1的docker0,如果识别到你的主机ip是172.17.x.x ,会自动避开. 推断2得以验证 (确定需要看源码.)
0x02.jenkins相关问题
1.docker中同一主机无法访问gogs仓库
进入jenkins容器内部查看发现本质是因为jenkins无法curl到映射到外网的端口,比如gogs的UI页面是ip:10080 ,jenkins是无法curl ip:10080成功的. 会提示Host unreachable . 原因不明,估计是docker内容器通信的问题.不能直接使用这种方法?
补: 这类问题在“容器访问宿主机端口”场景很常见, 可以优先尝试以下路径:
- 把 Jenkins/Gogs 放到同一个 user-defined bridge 网络, 直接用容器名互访。
- Linux 环境下给 Jenkins 加
--add-host=host.docker.internal:host-gateway, 再用host.docker.internal:10080访问宿主机端口。 - 在 K8s 中尽量通过 Service 名称互访, 减少对宿主机端口映射的依赖。
暂时的解决方案是分开jenkins和gogs. 因为gogs+harbor是不在k8上的目前. 所以jenkins整合进k8即可.
2.docker中jenkins不会开机自动重启
首先推荐jenkins构建在k8中,这样就不会存在这种烦恼. 其次注意jenkins启动时间比较长….(因为java虚拟机).所以重启后不要急着访问,等个1分钟左右才会完全加载好. 所以最好k8中放置1个以上的jenkins-master.以免出现长时间服务中断.
3.maven打包构建时速度巨慢,掉线 (*)
这个非常重要,而且不解决极其坑爹….我这边虚拟机性能网络弱的时候直接会把docker都卡死. 首先千万不要下坑爹的maven:slim 镜像,官方实例多用的这,这是用的精简Linux+没任何依赖的库. 全都是构建的时候再去下. 去maven官方库下时间.可能会让你崩溃 通用. maven-slim 也悠着用,虽然生产中应该是这个最好,因为需要什么下什么,但是一定需要先配下载源… 天朝还是用普通maven:3.5.2-jdk-8 类似这种完整版吧. (自带常见包.大小700Mb+)
4.gogs webhook+pipeline时丢失pom文件
这个问题也非常之坑,折腾了好久. 长话短说…. 首先不要随便使用pipeline的deleteDir() 命令. 这会清空workspace 目录. (这个目录实际是maven镜像里面的 /var/jenkins_home/workspace) 目录. 下面放了你创建的各种jenkins job 的文件如图.
这里可以看到, workspace下面的项目都是空的了. 就会报这样的错.
分析原因可能如下:
jenkins的gogs插件之所以可以不需要设置其他参数就能直接简单实现webhook本质还是依赖git-hook本身.只不过这里当你设置webhook地址为http://192.168.157.92:8080/gogs-webhook/?job=java1 的时候,它会自动去帮你在对应的maven容器的/var/jenkins_home/workspace/java1/.git/ 下创建git钩子. 所以当你删除了workspace,那么就把git钩子也删除了,那么虽然gogs每次会触发自动推送,但是就再也找不到你对应目录的触发器了. 也就无法完成构建.
这个问题可以补一个流程图, 更直观看出 deleteDir() 的影响范围:
flowchart LR
G["Gogs Webhook"] --> J["Jenkins Job Trigger"]
J --> W["workspace/<job>/.git/hooks"]
W --> B["Pipeline Build"]
D["deleteDir()"] -.clears.-> W
W -.missing.-> F["Webhook触发失败/找不到POM"]
可以考虑把清理粒度收敛到构建产物目录, 不直接清空整个 workspace, 或者在流水线里显式重建 webhook 依赖目录.
关联资料(与本文问题直接相关):
- Docker install on CentOS
- Docker bind mounts(SELinux labels)
- Docker bridge network 配置
- Jenkins Pipeline Steps Reference
待核验:补一份“Jenkins 在 Docker 内访问 Gogs”的最小复现场景(同网桥 / host-gateway / K8s Service 三种路径)并给出稳定性对比。




