Jenkins的一些笔记
公司主要要开发自己的paas平台,集成了Jenkins,真的是遇到了很多很多困难,特别是在api调用的权限这一块,这里,把自己遇到的一些坑的解决方法做一下笔记吧。当然,首先要讲的,就是如何在开启安全的情况下进行API调用。
一、在全局安全配置中
1.1 启用安全
如果勾选不对,那么Jenkins有可能崩溃掉,亲身经历,之前一直没有勾选安全域,然后授权策略为登录用户可以做任何事,之后权限这一块就彻底崩溃了,重装了又重装,才知道,需要勾选安全域。
1.2 跨域
同时开启跨站请求伪造保护,Jenkins的一些API需要用到的。
二、获取TOKEN
2.1 TOKEN
Jenkins的用户token可以在用户的设置下面获得,但是这种方式如果需要重装Jenkins的话,就得重新修改一次配置文件
经过对Jenkins-client的抓包分析,token可以由username+":"+password,然后进行base64加密组成,之后在token前面加上"Basic "即可,代码如下:
三、获取Jenkins-Crumb
在远程API调用的时候,Jenkins对于某些接口的要求不仅限于Authorization,还必须要有Jenkins-Crumb,这个东西之前在进行获取的时候,有时候会变来变去,比如用curl命令和f12查看的时候发现不一致,实在受不了,感觉毫无规律可言,之后才发现上面的Authorization来直接调用接口获取的才是正确的,再然后想想,可能是之前调用api的时候,没有开启启用安全,再或者是有没有勾选上使用碎片算法。
另,附上curl查询Jenkins-Crumb的命令:
curl -s 'http://admin:yourtoken@jenkins-url/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'
替换掉yourtoken和jenkins-url即可。
四、值得注意的事
4.1 API设计
Jenkins的API设计可谓是独领风骚,能把一个提交设计成这样真实佩服测试之后才发现只要提交个表单,key为json,value为值即可,其他的都不需要,这个设计我也不知道怎么来的,感觉超级坑。
4.2 生成构建job
由于我们是将Jenkins集成在我们自己的平台里面,并不暴露Jenkins给用户,所以,创建一个job的时候,必须由我们平台的参数往Jenkins里面提交,这一提交,发现的问题不少。
一是Jenkins的整个job的提交是由两步组成的,先是创建job,再提交配置。即:/createItem?name=xxx接口。
二是提交的配置参数,提交的是整个xml,而不是由一个一个参数组成的。对于java来说,就得使用xstream或者其他来转化,甚是折腾,如图这种转化。
4.3 构建的队列
在点击立即构建的时候,Jenkins是没有返回任何信息,但是在Jenkins的内部,它是通过放到队列里等待的,如果有空闲,就开始构建,否则等待,这个队列是可以获取得到的,我们从里面可以获取上一次构建的信息,是成功还是失败。这种情况下,假设我们多个人同时点击,这下子就有点慌了,如何获取到具体某个人的构建结果,有点虐心。想了半天,最终得出的事:代码相同,意味着每次构建的结果相同,为什么要允许多个人同时点击?就这么解决了:从一个job的构建队列中获取最后一次构建的信息,如果是正在构建,那么不允许构建了,直到构建结果出来。
4.4 构建进度的查看
需要将Jenkins中的构建进度移植到我们自有的平台,Jenkins的构建进度时通过ajax轮询实现的,获取文本的规则主要从response header里面的两个字段获取
(1)X-More-Data:是否有更多的数据
(2)X-Text-Size:从开始到该次调用的文本大小
我们是通过websocket来将文本内容推送到前端,使用的stomp协议,部分代码如下:
while (true) {
...
String string = response.body().string();
String header = response.header("X-More-Data");
if (!Strings.isNullOrEmpty(header) || start == 0) {
template.convertAndSend("/topic/" + uuid, string);
String textSize = response.header("X-Text-Size");
if (!Strings.isNullOrEmpty(textSize)) {
start = Integer.parseInt(textSize);
}
TimeUnit.SECONDS.sleep(5);
} else {
template.convertAndSend("/topic/" + uuid, string);
return;
}
}
参考:
1.通过jenkins API去build一个job
2.Jenkins Remote API
Jenkins的一些笔记的更多相关文章
- Jenkins 使用学习笔记
3.1 Jenkins安装 2 3.1.1 Jenkins下载 2 3.1.2 Jenkins 安装 2 3.1.3 Jenkins 目录结构 3 3. ...
- 之前搭建的jenkins的一些笔记
wget -O /etc/yum.repos.d/jenkins.repo http://jenkins-ci.org/redhat/jenkins.repo rpm --import http:// ...
- jenkins 持续集成笔记2 --- 构建 Java 项目
先说一下流程: jenkins 从 gitlab pull 代码,使用 maven 打包,然后备份原来的jar包,使用rsync同步到服务器上,重启服务. pipeline 资源去看官方中文文档 ht ...
- jenkins 持续集成笔记1 --- 安装配置
jenkins 安装 先安装Tomcat,然后下载jenkins war包,启动Tomcat即可 wget https://mirrors.huaweicloud.com/apache/tomcat/ ...
- jenkins初学部分笔记网站
https://www.cnblogs.com/wfd360/p/11314697.html 自动化部署详细教程 https://blog.csdn.net/weixin_41948075/artic ...
- Jenkins 安装使用笔记
系统要求 最低推荐配置: 256MB可用内存 1GB可用磁盘空间(作为一个容器docker运行jenkins的话推荐10GB) 为小团队推荐的硬件配置: 1GB+可用内存 50 GB+ 可用磁盘空间 ...
- Jenkins 四: 启动关闭以及重启jenkins
启动 1. 在桌面新建一个jenkins.bat文件.内容如下: cd /d %JENKINS_HOME% java -jar %JENKINS_HOME%\jenkins.war --httpPor ...
- jenkins,开源CI工具
目前最热门CI工具的jenkins,学习笔记: 一.jenkins如何实现执行命令 1.执行jenkins同主机上的命令
- Python - 安装 - 在 Alpine Linux 下安装 Python2
概述 在 Alpine Liunx 下安装 python2 感觉又是水了一发... 感觉还是有点丢人, 就像在帮小学生写作业, 写完了后还想找人夸我... 最近看 docker 和 jenkins, ...
随机推荐
- 使用kbmmw 生成REST 服务OpenAPI函数原型
我们以前介绍了很多kbmmw 开发REST 的例子.一直有个问题困惑着大家. 我们提供REST 服务,如何让客户端快速的使用,当然可以写文档,但是一旦 后台改变了,又要再一次给调用者发新文档,非常的麻 ...
- 小白的CTF学习之路6——阶段测评
刚才考了自己一次,下面我把题和答案放到下面 CPU中不含有以下选项中的 C A: 运算器 B: 寄存器 C: 内存 D: 时钟 这是一道送分题,CPU包含以下几种原 ...
- 2019.03.09 bzoj4491: 我也不知道题目名字是什么(线段树)
传送门 题意:给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串. 思路: 注意要求的是子串而不是子序列!!! 然后直接用线段树维护最大子段和的方式合并一 ...
- Java项目下的classpath路径包括哪里
https://my.oschina.net/zjllovecode/blog/916927 classpath指的是.classpath下kind="src" 的路径
- Win7 VS2017 NASM编译FFMPEG(2018.12.22)
今天无意中在gayhub发现个牛逼工程,全VS工程编译FFMPEG库,包括依赖库全是VS生成的,无需Mingw等Linux环境. 简单记录下过程,以防将来重装系统等情况,备忘. https://git ...
- mysql查询前一天的数据
curdate()表示当天日期 统计前一天的日志sql语句: day); 要求: 统计从昨天开始统计前7天的日志包括昨天 day) --------------------- date_sub( ...
- ORACLE 快速刷新物化视图的方法(11g)
1.on demand:用户需要刷新的时候刷新,这里就要求用户自己动手去刷新数据了(也可以使用job定时刷新) refresh [fast|complete|force] 视图刷新的方式: compl ...
- java开发师笔试面试每日12题(1)
1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件.Java被设计 ...
- 用不到 50 行的 Python 代码构建最小的区块链
引用 译者注:随着比特币的不断发展,它的底层技术区块链也逐步走进公众视野,引起大众注意.本文用不到50行的Python代码构建最小的数据区块链,简单介绍了区块链去中心化的结构与其实现原理. 尽管一些人 ...
- email program (客户端)演变过程有感
以下内容全部为个人读后感(参考百度百科的相关资料) 首先我认为电子邮件是一个非常伟大的发明,它不仅成本低,而且传输效率快! 关于它的起源,我从百度百科中看到了两种说法 1.1969年10月世界 ...