自从去年用上了 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. Webpack和Gulp,Webpack和Gulp的基本区别:

    Gulp和Webpack的基本区别: gulp可以进行js,html,css,img的压缩打包,是自动化构建工具,可以将多个js文件或是css压缩成一个文件,并且可以压缩为一行,以此来减少文件体积,加 ...

  2. nginx显示静态html爆502 bad gateway的错误提示

    在centos的服务器上,没有启动php-fcgi. 本来是想设置显示一个静态文件目录的,用不着php,于是就关闭了php-fcgi. 结果打开爆了一个大大的nginx502 bad gateway的 ...

  3. JVM笔记-垃圾收集算法与垃圾收集器

    1. 一些概念 1.1 垃圾&垃圾收集 垃圾:在 JVM 语境下,"垃圾"指的是死亡的对象所占据的堆空间. 垃圾收集:所谓"垃圾收集",就是将已分配出去 ...

  4. Django 中自定义用户模型及集成认证授权功能总结

    1. 概述 Django 中的 django.contrib.auth 应用提供了完整的用户及认证授权功能. Django 官方推荐基于内置 User 数据模型创建新的自定义用户模型,方便添加 bir ...

  5. 一起了解 .Net Foundation 项目 No.20

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. System.Drawin ...

  6. 关于Addressable的疑问

    1)关于Addressable的疑问2)Addressable如何进行热更新3)如何设置SceneView相机的Shader变量4)Activity默认为SingleTask的原因5)关于Resour ...

  7. JVM 参数(转)

    Herry灬凌夜  转自:https://www.cnblogs.com/wuyx/p/9627542.html 常用的JVM配置参数 一.Trace 跟踪参数 在Eclipse中,如何打开GC的监控 ...

  8. C# Bitmap 转 Bytes数组

    首先是Bitmap 转 MemoryStream MemoryStream ms = new MemoryStream(); bitmap.save(ms, ImageFormat.Jpeg); ms ...

  9. oracle中pl/sql 练习题----输入部门编号,在控制台打印这个部门的名称,总人数,平均工资(基本工资+奖金)

    一. 思路:声明record类型的变量,根据 多表联合查询查出想要的数据,最后输出. 二.注意:record类型不一定只是一个表中的数据,也可以声明不同表中的数据类型. 三.语句如下: declare ...

  10. Tomcat 启动过滤器异常

    严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.filterStart 启动过滤器异常 ja ...