一劳永逸解决Jenkins安装插件超时、慢等问题
众所周知的原因,在国内访问Jenkins的插件站点不是很稳定,经常访问很慢或者超时。
如果你网上搜索Jenkins更换国内源
等关键字,大多数文章都会告诉你做以下三个步骤:
- 修改"Manage Jenkins"--->"Manage Plugins"--->"Advanced" --->"Update Site" URL为国内源,如
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
- 把
/var/jenkins_home/updates/default.json
文件内容中https://updates.jenkins.io/download
替换为国内源,如https://mirrors.tuna.tsinghua.edu.cn/jenkins
- 重启Jenkins
第一步有一个坑:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json下载的是始终是最新的插件,和旧版本的Jenkins是不兼容的,要替换为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/dynamic-stable-VERSION/update-center.json
才能装到匹配的插件版本,其中VERSION
是当前Jenkins的版本。如果不是LTS版本,则dynamic-stable-VERSION
要换成dynamic-VERSION
。
第二步修改了之后,过一段时间你想再装插件你会发现/var/jenkins_home/updates/default.json
这个文件又被恢复成官方的了。此举并不是一劳永逸的,因为Jenkins会定时更新这个文件。
那么有没有更好的办法呢?答案是有的,下面就教大家如何一劳永逸地将Jenkins插件站点换为你想要的任何镜像站点。
方法示意图:
- 修改hosts,使updates.jenkins.io指向nginx的IP
- 配置nginx反向代理,指向你所希望访问的Jenkins插件站点
需要解决一个问题,Jenkins源站点是https协议的,Jenkins会校验SSL证书的有效性,因此我这里将使用nginx的sub_filter模块将update-center.json
返回的内容修改为http协议的。
修改hosts
192.168.30.100 updates.jenkins.io # nginx地址
nginx配置
server { listen 80; listen [::]:80; server_name updates.jenkins.io; root /usr/share/nginx/html; # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; error_page 404 /404.html; location = /404.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } location / { sub_filter_once off; sub_filter_types *; sub_filter 'https://updates.jenkins.io' 'http://updates.jenkins.io'; proxy_pass https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/; } location /download/plugins { proxy_pass http://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins; } }
Jenkins配置
修改"Manage Jenkins"--->"Manage Plugins"--->"Advanced" --->"Update Site" URL为
http://updates.jenkins.io/dynamic-stable-2.346.3/update-center.json
回到Available plugins
页面,点击右边的刷新按钮刷新插件数据。选择插件安装即可。
如果刷新插件数据报错:
There were errors checking the update sites: SHA-512 digest mismatch: expected=xxxx in 'update site 'default''
这个情况是因为我们修改了update-center.json的内容,Jenkins会对其内容进行校验。校验逻辑在源码 core/src/main/java/hudson/PluginManager.java
中 checkUpdateServer
方法可以看到。
要解决这个问题,也很简单,只需要添加 hudson.model.DownloadService.noSignatureCheck=true
启动参数即可,该参数对应的源码位置在 core/src/main/java/hudson/model/DownloadService.java
signatureCheck
如果你使用的是docker,那么添加参数的方法如下:
docker run --name jenkins -d -v /data/jenkins_home:/var/jenkins_home -e JAVA_OPTS=-Dhudson.model.DownloadService.noSignatureCheck=true jenkins/jenkins:2.452.1-lts-jdk17
至此,所有配置都完成了,此方法非常的灵活且一劳永逸,更加不需要重启Jenkins。如果要更换源,只需要修改nginx反向代理配置中的proxy_pass
的地址即可。
在一些云服务器厂家中,厂家通常都有维护内网的镜像加速镜像源,如阿里云的内网Jenkins源为http://mirrors.cloud.aliyuncs.com/jenkins
,腾讯云的内网Jenkins源为http://mirrors.tencentyun.com/jenkins
,用此方法可以很方便地使用这些内网源。