众所周知的原因,在国内访问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插件站点换为你想要的任何镜像站点。

方法示意图:

Jenkins.png

  • 修改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.javacheckUpdateServer 方法可以看到。

要解决这个问题,也很简单,只需要添加 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,用此方法可以很方便地使用这些内网源。

标签: none

添加新评论