在使用Jenkins进行自动化部署时,常常会遇到各类问题,其中最常见的是与Git拉取相关的错误。这篇文章将详细介绍在Jenkins拉取Git仓库失败并伴随Docker重启问题的排查与解决过程,希望能帮助更多开发者快速定位并解决类似问题。
1. 错误场景描述
在一次Jenkins自动化部署过程中,我遇到了如下报错:
Started by user admin
Running as SYSTEM
Building in workspace /var/jenkins_home/workspace/first_webserver
The recommended git tool is: NONE
using credential 4b9c6a78-46bc-47e5-8647-8a4ce64fc2ab
> git rev-parse --resolve-git-dir /var/jenkins_home/workspace/first_webserver/.git # timeout=10
...
Caused by: hudson.plugins.git.GitException: Command "git fetch --tags --force --progress -- https://gitee.com/xxx/sa-backend.git +refs/heads/*:refs/remotes/origin/*" returned status code 128:
stderr: fatal: unable to access 'https://gitee.com/xxx/sa-backend.git/': Could not resolve host: gitee.com
Jenkins在从Gitee拉取代码时抛出GitException错误,主要提示Could not resolve host: gitee.com,无法解析主机地址。
2. 错误排查步骤
在遇到此类问题时,第一步是逐步排查网络、DNS和Jenkins配置等相关因素。我按照如下思路进行了详细检查。
2.1 确认网络连接是否正常
首先,我们要排查是否是网络连接问题。使用以下命令来测试能否ping通Gitee:
ping gitee.com
如果返回超时或无法解析,则可能是网络连接问题。
2.2 检查DNS解析是否正常
如果 ping gitee.com
不通,下一步需要检查是否是 DNS 解析问题。可以通过以下命令检测 DNS 解析是否正常:
nslookup gitee.com
如果 nslookup
显示无法解析域名,说明 DNS 解析有问题。此时可以尝试手动设置 DNS 解析器。编辑 /etc/resolv.conf
文件,使用 Google 的公共 DNS:
sudo vim /etc/resolv.conf
在文件中添加以下内容:
nameserver 8.8.8.8
nameserver 8.8.4.4
保存修改后,重新尝试 ping gitee.com
或重新运行 Jenkins 构建任务,看看问题是否解决。
2.3 确认Gitee服务可访问
如果网络和DNS解析都正常,那么就要确认是否能通过浏览器正常访问Gitee。打开浏览器,输入https://gitee.com
,如果可以正常访问,说明Gitee的服务没有问题。

2.4 检查Jenkins凭据配置
如果前面的问题都不存在,可以怀疑是Jenkins中的凭据配置错误。进入Jenkins的凭据管理
部分,删除现有的凭据,然后重新添加正确的凭据并重新测试拉取代码。
2.5 重启Docker容器
如果凭据无误但问题仍未解决,尝试重启Jenkins的Docker容器。可以使用以下命令重启Docker容器:
docker restart <container_id>
然而,在重启容器时,我遇到了以下错误:
3. Docker容器重启问题的解决方法
这个错误提示表明 Docker 容器在重启时,无法正确配置外部网络连接,具体是因为 iptables
命令失败,错误消息如下:
iptables failed: No chain/target/match by that name
这是与 Docker 容器的网络配置有关的问题,通常是由于 iptables
(负责网络连接的防火墙规则)在配置容器的端口转发规则时出现了问题。
可能原因:
iptables
规则损坏或丢失:Docker 依赖iptables
来配置容器的网络,如果iptables
配置不正确或某些规则被删除,容器的端口转发可能失败。- 防火墙冲突:在 CentOS 系统上,
firewalld
和 Docker 的iptables
规则有时会冲突,导致 Docker 无法正确配置端口转发规则。 - 网络驱动问题:Docker 使用了不正确或损坏的网络驱动,导致网络规则无法应用。
1. 重启 Docker 服务
有时,简单地重启 Docker 服务可以解决网络配置问题:
sudo systemctl restart docker
然后再尝试重启容器:
docker restart <container_id>
2. 重启 iptables服务
如果问题与 iptables
规则相关,重启 iptables
服务可能会修复问题:
sudo systemctl restart iptables
3. 检查 firewalld和 iptables 冲突
在 CentOS 上,如果同时使用了 firewalld
和 iptables
,它们之间可能会发生冲突。你可以通过以下命令查看 firewalld
的状态:
sudo systemctl status firewalld
如果 firewalld
正在运行,建议停止它,防止其与 Docker 的 iptables
规则冲突:
sudo systemctl stop firewalld
然后尝试重启容器。
4. 检查 Docker 网络设置
查看当前 Docker 的网络配置,确保没有冲突或损坏的网络:
docker network ls
如果 Docker 网络损坏,可以通过以下命令重新创建默认的 Docker 网桥:
docker network prune
注意:docker network prune
会删除所有未使用的 Docker 网络,请谨慎操作。
5. 手动检查并修复 iptables规则
如果你熟悉 iptables
,可以手动检查 Docker 添加的 iptables
规则:
sudo iptables -t nat -L -n
如果发现 Docker 相关的规则丢失或损坏,可以尝试重新加载 Docker 的 iptables
规则。通过重启 Docker 服务来自动重新加载规则:
sudo systemctl restart docker
6. 更新 Docker 和内核版本
有时这个问题可能是由于 Docker 或操作系统内核的版本不兼容导致的。可以尝试升级 Docker 和系统内核:
sudo yum update docker
sudo yum update kernel
然后重启服务器并重试。