自从去年用上了 Jenkins 进行 CI/CD 之后,工作效率高了不少,摸鱼的时间更多了。不过 Jenkins 好是好,但在功夫网的影响下,插件就是经常更新不成功的,就像下面这样子:

查了不少资料,绝大部分都说把升级站点改了就行

然而并没有什么卵用,只是获取插件列表从这个地方获取而已,安装/更新插件的时候该炸还是得炸。

作为一个有代码洁癖的人,看着有插件更新不了那感觉就像有屎拉不出的难受。于是乎这几个月以来一直是通过上面图中的手动上传插件来进行更新的。可是效率实在是低,一两个插件还好,有时候一堆插件有更新,那一个个上传是真的烦。

最近几天又相对闲了点,察觉到 Jenkins 是有个 REST API 的,那么能不能通过程序化来解决问题呢。尝试了下,算是有个比较满意的解决方案了。

首先,要用 Jenkins REST API 是需要权限的,并不是说随便来个人都可以调用。Jenkins REST API 是通过 token 进行验证的。默认是没有 token 的,需要手动添加。

登录 Jenkins 管理面板,进入管理用户

然后选择一个用户,点击左侧设置,然后添加 token 并且用你的小本本记录下来

这样就为这个用户添加了一个 REST API 的 token 了,后续调用 REST API 带上这个 token 就是了

以 C# 的 HttpClient 为例:

var httpClient = new HttpClient();
httpClient.SetBasicAuthentication("username", "apiToken");

这样写就行了,SetBasicAuthentication 方法来自 IdentityModel 这个 nuget 包。(https://www.nuget.org/packages/IdentityModel/

接下来我们要先获取哪些插件是有更新的。

在浏览器中来到 /pluginManager/api/ 这个页面,点开 JSON API。

理论上会得到这么个 JSON:

一堆空白?再看一下文档,加上 depth 参数就好了。加上 depth=1,再次请求 /pluginManager/api/json?pretty=true&depth=1

当前安装的所有插件的信息都返回了。而且这里还返回了 hasUpdate 代表这个插件是否有更新。

用 C# 稍微建个模好了

public class JenkinsPlugin
{
[JsonProperty("hasUpdate")]
public bool HasUpdate { get; set; } [JsonProperty("shortName")]
public string ShortName { get; set; } [JsonProperty("url")]
public string Url { get; set; } [JsonProperty("version")]
public string Version { get; set; }
}

接下来假如某个插件有更新的话,那么就下载这个插件的新版本好了,打开清华大学 Jenkins 的镜像页,并转到插件目录 https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/

以 git 插件为例,最新版本的下载地址如下:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/git/latest/git.hpi

也就是说某个插件的最新版本在清华大学镜像站的下载地址是

https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/{plugin.shortName}/git/lastest/{plugin.shortName}.hpi

用 C# 撸个下载代码好了:

public class TsinghuaClient
{
private static readonly HttpClient Client = new HttpClient(); public async Task<byte[]> DownloadPluginAsync(string pluginName)
{
var url = $"https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/{pluginName}/latest/{pluginName}.hpi";
var bytes = await Client.GetByteArrayAsync(url);
return bytes;
}
}

接下来就是把这个传到 Jenkins 上。

以 C# 代码为例就是

using (var content = new MultipartFormDataContent())
{
content.Add(new ByteArrayContent(plugin), "name", fileName);// plugin 为 byte[]
var response = await client.PostAsync("/pluginManager/uploadPlugin", content);
response.EnsureSuccessStatusCode();
}

上传成功的话,状态码是 200 OK。

最后就是要让 Jenkins 安装新版本的插件了,这个只需要重启一下 Jenkins 即可。在浏览器中打开 /api 路径,并滚动到最底部

左边那个是强制重启,右边那个是等待到没任务时再重启。我们用右边那个。

代码撸一下:

public async Task RestartAsync()
{
var response = await client.PostAsync("/safeRestart", null);
Debug.Assert(response.StatusCode == HttpStatusCode.ServiceUnavailable);
}

重启指令发送成功后会返回 503 Service Unavailable 的。

总结一下流程就是:

获取已安装插件列表 –> 筛选有更新的插件 –> 到清华大学镜像站下载插件最新版本 –> 上传到 Jenkins –> 重启 Jenkins

顺手撸了个 WPF 的 app,也把源码传上来好了

https://files.cnblogs.com/files/h82258652/JenkinsUpdator.zip

使用的时候注意配置 app.config

【Jenkins】使用 Jenkins REST API 配合清华大学镜像站更新 Jenkins 插件的更多相关文章

  1. Google镜像站更新地址

    越来越觉得某度的行为无耻无下限,Google镜像站地址,不方便访问Google的可以参考,后面会尽量保持更新可用的镜像库. (收藏地址即可,免得镜像站被封) https://g.jikewenku.c ...

  2. pip 和 Conda 镜像站配置

    如果你经常使用 Python,那么你对 pip 和 Conda 一定不陌生,它们作为包管理器,可以非常方便的帮助我们下载需要的 Python 包,但是受限于大多 Python 包的服务器在国外,国内下 ...

  3. Jenkins介绍和安装及配合GitLab代码自动部署

    Jenkins是什么? 基于JAVA的开源的自动化系统平台 加速自动化CI,CD任务及流水线,所有类型的任务:构建,测试,部署等 丰富的插件生态系统支持功能扩展,1400+插件和SCM,测试,通知,报 ...

  4. OpenShift应用镜像构建(3) - Jenkins的流水线构建

    Jenkins方式构建的定位是使用专门的CICD平台. 既支持把JenKins作为一个Pod部署到openshift内部,也支持部署在Openshift集群外部,操作上的区别是 openshift自己 ...

  5. Jenkins技巧:如何更新Jenkins到最新版本

    ----------------------------------------------------------------- 原创博文,未经作者允许禁止转载. 博主:疲惫的豆豆 链接:http: ...

  6. docker 运行jenkins及vue项目与springboot项目(二.docker运行jenkins为自动打包运行做准备)

    docker 运行jenkins及vue项目与springboot项目: 一.安装docker 二.docker运行jenkins为自动打包运行做准备 三.jenkins的使用及自动打包vue项目 四 ...

  7. Mac Jenkins+fastlane 简单几步实现iOS自动化打包发布 + jenkins节点设置

    最近在使用jenkins 实现ios自动化打包发布蒲公英过程实践遇到了一些坑,特意记录下来方便有需要的人. 进入正题: 一.安装Jenkins 1.Mac上安装Jenkins 遇到到坑 因为 Jenk ...

  8. 更新Jenkins

    一般情况下,war的安装路径在/usr/share/jenkins目录下. 不过也有部分人不喜欢安装在这里,可以通过系统管理(System management)--> 系统信息(System ...

  9. Linux下的Jenkins+Tomcat+Maven+Gitlab+Shell环境的搭建使用(jenkins自动化部署)

    jenkins自动化部署 目标:jenkins上点构建(也可以自动检查代码变化自动构建)>>>项目部署完成. 一.安装jenkins 1.下载jenkins 这里我选择的是war包安 ...

随机推荐

  1. freecplus框架,Linux平台下C/C++程序员提高开发效率的利器

    目录 一.freecplus框架简介 二.freecplus开源许可协议 三.freecplus框架内容 字符串操作 2.xml解析 3.日期时间 4.目录操作 5.文件操作 6.日志文件 7.参数文 ...

  2. java.lang.reflect.UndeclaredThrowableException: null Caused by: org.apache.zookeeper.KeeperException$UnimplementedException: KeeperErrorCode = Unimplemented for

    java.lang.reflect.UndeclaredThrowableException: null    at org.springframework.util.ReflectionUtils. ...

  3. Hyperledger Fabric ChainCode开发

    预览 Hyperledger Fabric的chaincode开发目前支持Go.Java.Node.js语言,下面以Go语言作为例子,我们先看下面的一个官方提供chaincode模板 ··· pack ...

  4. libfastcommon总结(〇)

    libfastcommon提供众多基础功能,该系列笔记将进行学习介绍. load_local_host_ip_addrs 进行加载主机上所有网卡的IPv4的地址. iniLoadFromFile 从文 ...

  5. Java 内存模型都不会,就敢在简历上写熟悉并发编程吗

    从 PC 内存架构到 Java 内存模型 你知道 Java 内存模型 JMM 吗?那你知道它的三大特性吗? Java 是如何解决指令重排问题的? 既然CPU有缓存一致性协议(MESI),为什么 JMM ...

  6. 当AI遇上K8S:使用Rancher安装机器学习必备工具JupyterHub

    Jupyter Notebook是用于科学数据分析的利器,JupyterHub可以在服务器环境下为多个用户托管Jupyter运行环境.本文将详细介绍如何使用Rancher安装JupyterHub来为数 ...

  7. [Alg] 文本匹配-单模匹配-KMP

    1. 暴力求解 如下图所示.蓝色的小三角表示和sequence比较时的开始字符,绿色小三角表示失败后模式串比对的开始字符,红色框表示当前比较的字符对. 当和模式串发生不匹配时,蓝色小三角后移一位,绿色 ...

  8. VMware 虚拟机正在使用中

    1.出现报错信息: 2.找到安装目录下面的.lck后缀文件夹(如有多个则全部删除) 3.删除此文件夹 4.成功开启虚拟机

  9. CAS无锁模式

    一.java内存模型:JMM 在内存模型当中定义一个主内存,所有声明的实例变量都存在于主内存当中,主内存的数据会共享给所有线程,每一个线程有一个块工作内存,工作内存当中主内存数据的副本当更新数据时,会 ...

  10. JWT校验流程源码

    目录 一. jwt token校验源码简析 1.1 前言 1.2 jwt的authenticate方法 二. jwt的RefreshJSONWebToken 返回目录 一. jwt token校验源码 ...