3

任务系统之Jenkins子任务 - ops-coffee

 1 year ago
source link: https://www.cnblogs.com/37Y37/p/17373542.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

任务系统之Jenkins子任务

今天下班即开启五一假期,早上临时定了行程去山东日照,原本计划下班就出发,但下班看了看导航,这一路红得发黑,于是决定还是晚点再走,现在有时间了,写篇简单的技术文章来提升下Blog逐渐降低的技术内容含量吧

之前有一系列的文章来介绍我们的任务系统,随着任务系统在项目间的推广,以及项目使用的深入,任务系统又增加了非常多实用又好用的功能,今天这篇文章就来介绍其中的一个:Jenkins子任务

任务系统通过组合各种不同类型的子任务来完成复杂的任务流程,之前的子任务支持命令和脚本,支持审批和通知,能覆盖绝大部分的发布部署场景,但仍然有一部分项目因为各种各样的原因依然使用了Jenkins来发布部署,想让项目owner抛弃Jenkins而迁移到任务系统动力不足困难不小,于是我将Jenkins作为一个子任务类型给集成进了任务系统,原本Jenkins里的Job完全不用动就可以简单的集成进任务系统

20230428.01.png

Jenkins集成进任务系统,不仅仅是可以通过任务系统来执行Job而达到项目管理的统一,更重要的是可以借助于任务系统的审批/通知/并行/告警/定时/周期等等强大的功能来实现完整的发布部署任务流,同时由于我们任务系统完全兼容手机端,那对于发布部署任务将可以随时随地掏出手机来执行,运维的假期再也不用到哪都背着电脑了,多了一份逍遥与自在

以一个模拟的Coffee项目更新流程为例,执行Jenkins的Job只是整个完整发布流程中的一步而已,通过任务系统可以将整个发布流程完美闭环,省去了很多沟通和认为操作过程

20230428.02.png

以上介绍了我们为什么需要将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:

  1. 获取Job列表

获取Job列表使用GET方法

https://jenkins.ops-coffee.cn/api/json
  1. 获取Job详情

获取Job详情使用Get方法

https://jenkins.ops-coffee.cn/job/{job-name}/api/json

同时Job详情页面同时也能获取到Job所需要的参数

  1. 执行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可以通过从返回结果headerLocation里获取

  1. 获取Build输出

获取Build的Console输出使用GET方法,通过Build的Console输出我们可以实时获取Job的执行情况

https://jenkins.ops-coffee.cn/job/{job-name}/{build-id}/logText/progressiveText
  1. 获取Build详情

获取Build的详情使用GET方法,通过Build详情里的result能知道Job的执行状态及结果

https://jenkins.ops-coffee.cn/job/{job-name}/{build-id}/api/json
  1. 停止Job执行

停止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无异了

20230428.03.png

好了,文章就写到这里,看了下导航,拥堵稍稍缓解,但依然严重,洗个澡睡个觉,凌晨起床出发


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK