今天下班即开启五一假期,早上临时定了行程去山东日照,原本计划下班就出发,但下班看了看导航,这一路红得发黑,于是决定还是晚点再走,现在有时间了,写篇简单的技术文章来提升下Blog逐渐降低的技术内容含量吧
之前有一系列的文章来介绍我们的任务系统,随着任务系统在项目间的推广,以及项目使用的深入,任务系统又增加了非常多实用又好用的功能,今天这篇文章就来介绍其中的一个:Jenkins子任务
任务系统通过组合各种不同类型的子任务来完成复杂的任务流程,之前的子任务支持命令和脚本,支持审批和通知,能覆盖绝大部分的发布部署场景,但仍然有一部分项目因为各种各样的原因依然使用了Jenkins来发布部署,想让项目owner抛弃Jenkins而迁移到任务系统动力不足困难不小,于是我将Jenkins作为一个子任务类型给集成进了任务系统,原本Jenkins里的Job完全不用动就可以简单的集成进任务系统
Jenkins集成进任务系统,不仅仅是可以通过任务系统来执行Job而达到项目管理的统一,更重要的是可以借助于任务系统的审批/通知/并行/告警/定时/周期等等强大的功能来实现完整的发布部署任务流,同时由于我们任务系统完全兼容手机端,那对于发布部署任务将可以随时随地掏出手机来执行,运维的假期再也不用到哪都背着电脑了,多了一份逍遥与自在
以一个模拟的Coffee项目更新流程为例,执行Jenkins的Job只是整个完整发布流程中的一步而已,通过任务系统可以将整个发布流程完美闭环,省去了很多沟通和认为操作过程
以上介绍了我们为什么需要将Jenkins集成进任务系统,同时也简单说明了将Jenkins的Job集成进任务系统通过任务系统执行的优势,那么接下来讲讲我们是如何将Jenkins集成进任务系统的,其实也很简单,借助于Jenkins完善的API
Jenkins没有统一的API入口,而是采用了{url}/api
的API样式,其中{url}
代表Jenkins资源的URL,常见的Jenkins资源包括:站点、Job和Build,可以通过不同级别的URL地址查看到当前级别的API信息,例如:
结果支持两种返回格式,分别是JSON和XML,通过加不同的URL后缀来实现,例如:https://jenkins.ops-coffee.cn/computer/api/json
返回json格式的数据,https://jenkins.ops-coffee.cn/computer/api/xml
则返回xml格式的数据
接入Jenkins子任务需要用到如下几个API:
获取Job列表使用GET方法
https://jenkins.ops-coffee.cn/api/json
获取Job详情使用Get方法
https://jenkins.ops-coffee.cn/job/{job-name}/api/json
同时Job详情页面同时也能获取到Job所需要的参数
执行Job通过POST方法,分为带参数和不带参数两个API,其中不带参数使用
https://jenkins.ops-coffee.cn/job/{job-name}/build
带参数使用
https://jenkins.ops-coffee.cn/job/{job-name}/buildWithParameters?namespace=dev&branch=master
执行完Job后,需要获取到Job的BuildID,BuildID可以通过从返回结果header的Location
里获取
获取Build的Console输出使用GET方法,通过Build的Console输出我们可以实时获取Job的执行情况
https://jenkins.ops-coffee.cn/job/{job-name}/{build-id}/logText/progressiveText
获取Build的详情使用GET方法,通过Build详情里的result
能知道Job的执行状态及结果
https://jenkins.ops-coffee.cn/job/{job-name}/{build-id}/api/json
停止Job执行使用POST方法,当Job执行的过程中不及我们预期需要紧急停止Job执行时需要借助此API来完成
https://jenkins.ops-coffee.cn/job/{job-name}/{build-id}/stop
整个Jenkins子任务的集成我们主要用到了这几个API,关于Jenkins的API认证用到了最基本的AuthBase方式,一个完整的获取JobList的例子如下
class JenkinsAPI:
def __init__(self, domain, username, password, verify=True):
self.domain = domain
self.session = requests.Session()
self.session.auth = (username, password)
self.session.verify = verify
def job_list(self):
try:
r = self.session.get(self.domain + '/api/json')
return True, r.status_code, r.json()
except Exception as e:
return False, 500, '获取Job List失败:' + str(e)
有了这些API我们就能轻松的将Jenkins集成进任务系统了,在任务系统中执行Jenkins的Job也是非常的简单和方便,实时日志输出,以及随时可以终止执行,体验与Jenkins无异了
好了,文章就写到这里,看了下导航,拥堵稍稍缓解,但依然严重,洗个澡睡个觉,凌晨起床出发