自从去年用上了 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. 必备技能四、ajax及token

    转https://segmentfault.com/a/1190000008470355?utm_source=tuicool&utm_medium=referral 转 https://ww ...

  2. 修改js文件,引发的404问题

    记录一个bug,本地测不出来,客户后台却404,web测试可参考.(不知道是不是通用的) 先介绍下背景 我们是web产品,存在发布机.管理机.js文件,页面会引用到这些js文件.出于安全考虑,规定js ...

  3. Upload-labs 测试笔记

    Upload-labs 测试笔记 By:Mirror王宇阳 2019年11月~ 文件上传解析学习 环境要求 若要自己亲自搭建环境,请按照以下配置环境,方可正常运行每个Pass. 配置 项 配置 描述 ...

  4. 大数据存储利器 - Hbase 基础图解

    由于疫情原因在家办公,导致很长一段时间没有更新内容,这次终于带来一篇干货,是一篇关于 Hbase架构原理 的分享. Hbase 作为实时存储框架在大数据业务下承担着举足轻重的地位,可以说目前绝大多数大 ...

  5. Vue 学习记录(一)

    Vue 研究了一段时间,要学的东西挺多的. 一.基本指令 1.v-text:2.v-html:3.v-pre;4.v-cloak:5.v-once:6.v-if:7.v-else:8.v-else-i ...

  6. Spring框架——AOP

    Spring AOP 面向切面编程,OOP面向对象编程,将程序中所有参与模块都抽象成对象,然后通过对象之间的相互调用完成需求. AOP是OOP的一种补充,是在另外一个维度上抽象出对象,具体是指程序运行 ...

  7. 洛谷 P3808 【模板】AC自动机(简单版) 题解

    原题链接 前置知识: 字典树.(会 \(\texttt{KMP}\) 就更好) 显然呢,本题用 字典树 和 \(\texttt{KMP}\) 无法解决问题. 所以我们发明了一个东西: \(\textt ...

  8. BIT-逆序数

    2019-12-17 09:42:44 问题描述: 问题求解: 逆序数问题非常经典,使用树状数组可以高效的解决这个问题. public List<Integer> countSmaller ...

  9. Range Module

    2019-09-21 18:54:16 715. Range Module 问题描述: 问题求解: 用线段树解决了. class RangeModule { Node root; class Node ...

  10. 聊聊用Selenium做自动化碰到了哪些坑?都是怎么解决的?

    本周我们的讨论话题是关于Selenium自动化: 话题:聊聊用Selenium做自动化碰到了哪些坑?都是怎么解决的? 话题描述:Selenium是大家做UI自动化用到的主流框架,在平时写脚本的过程中, ...