我们知道,Jenkins的slave节点可以通过手动方式添加固定地址的机器,节点可以
有一些标签(label)信息用于运行特定的任务。这种方式下,如果维护的slave
节点数量很多的话,节点的维护工作量可能就会非常大。另一方面,在任务非常少
的时间段,slave节点的利用率又会非常低,资源白白消耗了。
对于持续集成来说,将任务尽可能的自动化,带来的便利不言而喻。解放双手,拥抱
Dev Ops吧!
我最近在维护Jenkins的slave节点时,不断被重复性的工作折磨。再想到以前玩OpenStack社区
的时候,他们的持续集成系统的庞大、复杂,但是自动化真的做的很好很好。OpenStack最开始
用的也是Jenkins,然后是社区自己开发的zuul系统。能够做到配置更新时,CI自动更新,自动
配置测试环境等。可惜,我一直未彻底搞懂其中的原理。有机会应该要玩一玩zuul,体验一把。
遇到痛点了,我就查了查,原来Jenkins早就支持对接OpenStack云了。于是快速的部署了一套
Pike版本的OpenStack环境,开始对接。
Jenkins安装OpenStack Cloud Plugin,之后在“系统管理” - “系统设置”里“新增一个云”。
云基础环境的配置项有endpoint、credential、region,分别配置为keystone的端点、OpenStack管理员
账号密码、region名称,还要设置这个云在Jenkins里的别名。
Jenkins创建OpenStack虚拟机的配置也要设置。需要设置虚拟机启动源、flavor、网络ID、浮动IP池、可用域,
以及虚拟机创建超时的时间。Jenkins连接虚拟机所需的凭证(比如用户名密码、SSH密钥)也要正确设置。
Jenkins还支持同一个OpenStack云创建出不同模板的虚拟机,也就是通过Templates进行设置的。Templates必须要
设置名称和标签。该标签就是Jenkins slave的标签,用于运行指定的任务。Templates中也可以设置虚拟机的规格
信息,如果不设置,则继承OpenStack云的全局设置。
如果你比较熟悉OpenStack的基本概念和操作,这部分的设置应该很轻松。贴一下我的配置吧。
这两张是OpenStack环境的信息和虚拟机规格信息。
这两张是Templates的配置参数。
上面的配置完成后,接下来设置Jenkins Job。
Job的“General”里设置“Restrict where this project can be run”为Templates里的标签名称,在“构建环境”里
有“OpenStack Instance Creation”和“OpenStack Single-Use Slave”,也做相应设置即可。
当勾选上“OpenStack Single-Use Slave”时,该Job完成后,虚拟机会立刻置于“pending delete”状态,大约10分钟后,
该节点会从Jenkins里删除,与此同时,Jenkins在OpenStack里创建的虚拟机也会被删除。
我尝试配置Jenkins Job完成后立即删除节点及虚拟机,但未发现有相关的配置。在此过程中,又查到Jenkins的JClouds
插件,支持对接各种cloud provider,也包括OpenStack。于是,我又把相同的OpenStack环境在JClouds插件里进行配置,
在配置endpoint的时候始终不成功,一直说ResourceNotFound。看了一下,Jenkins尝试连接keystone服务进行认证出错,
其访问的keystone地址是http://172.16.6.88:35357/v3/tokens
。嗯???keystone认证token的URL不应该是http://172.16.6.88:35357/v3/auth/tokens
吗?莫名其妙。然后又把endpoint设置成http://172.16.6.88:35357/v3/auth/
,
依旧错误,400 Bad Request; “‘identity’ is a required property”。这次是认证的数据格式错误。于是作罢。。。
参考文档: