自从去年用上了 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 为例:

  1. var httpClient = new HttpClient();
  2. 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# 稍微建个模好了

  1. public class JenkinsPlugin
  2. {
  3. [JsonProperty("hasUpdate")]
  4. public bool HasUpdate { get; set; }
  5.  
  6. [JsonProperty("shortName")]
  7. public string ShortName { get; set; }
  8.  
  9. [JsonProperty("url")]
  10. public string Url { get; set; }
  11.  
  12. [JsonProperty("version")]
  13. public string Version { get; set; }
  14. }

接下来假如某个插件有更新的话,那么就下载这个插件的新版本好了,打开清华大学 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# 撸个下载代码好了:

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

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

以 C# 代码为例就是

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

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

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

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

代码撸一下:

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

重启指令发送成功后会返回 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. PostCSS的插件 -- 关于vue rem适配布局方案

    PostCSS的插件 作用:用于自动将像素单元生成rem单位 记以下三种 postcss-plugin-px2rem postcss-pxtorem postcss-px2rem 任选一种,最近大家推 ...

  2. 负margin在页面布局中的应用

    关于负margin的原理建议大家看看这篇文章:http://www.cnblogs.com/2050/archive/2012/08/13/2636467.html#2457812 一. 左右列固定, ...

  3. 微信SEO怎么做-最新微信SEO干货

    星辉信息科技进行微信SEO已经很多年了,结合多年的微信SEO经验通过浅谈微信SEO.微信SEO的3大优势.微信SEO的6个排名技巧.企业和个人微信SEO的4大优化战略来讲,可以完美解决B端C端微信获客 ...

  4. 2020Ubuntu server1804最新安装后的配置

    一.Putty进行ssh连接. 完成最基本配置之后,就远程连接服务器了.在windows是我习惯putty 在我以前的老电脑里面找一个putty是0.6版本的,连上Ip ,还是原来的配方,还是原来的味 ...

  5. 【春招】 java static 执行顺序

    package static类型.执行顺序; public class Test { Person person = new Person("Test"); static{ Sys ...

  6. C++ 函数模板/类模板

    #include <iostream> #include <vector> using namespace std; template < class T > // ...

  7. nuxt.js如何实现同级目录下建多个动态路由,并将链接设置.html后缀

    nuxt.js中如果在同级目录中建两个_xxxx.vue的动态路由文件,那么页面跳转始终是跳的一个页面,如何解决这个问题呢?下面举个栗子: 第一步:新建两个页面文件 第二步:在nuxt.config. ...

  8. vs2017打包exe安装包

    1,安装扩展程序Install Projects 2,在打开的界面搜索Install,找到Install Projects 3,在要打包的项目解决方案下创建一个生成exe的项目 4,在打包项目的文件系 ...

  9. 最详细的 Spring Boot 多模块开发与排坑指南

    创建项目 创建一个 SpringBoot 项目非常的简单,简单到这里根本不用再提.你可以在使用 IDEA 新建项目时直接选择 Spring Initlalize 创建一个 Spring Boot 项目 ...

  10. IOptions、IOptionsMonitor以及IOptionsSnapshot

    背景 ASP.NET Core引入了Options模式,使用类来表示相关的设置组.简单的来说,就是用强类型的类来表达配置项,这带来了很多好处.初学者会发现这个框架有3个主要的面向消费者的接口:IOpt ...