一、背景
jenkins作为一款实用且广泛实用的CI/CD工具,为大多数中小公司拿来即用。可当我们的业务和工程逐渐增多,它在构建和自动化任务方面的压力也越来越大。
jenkins主要是用来基于源码的打包,公司用到的语言包括java/php/android/h5等,同时各组能够看到的项目也应该隔离开来。
开发人员需要让它与git源码的提交、合并结合起来,必要地和sonarqube、unit test和allure报告等集成。重点是unit test还会和mysql/mongodb/redis/es等中间件依赖,需要做到各任务之间的隔离。
测试人员在构建并运行后,除了要做回归测试,期间也需要做自动化测试。(测试平台我们选用的是meterspere开源平台)
所以摆在我们面前的问题是:
- jenkins单节点的压力大
- jenkins缺乏自动扩缩容,需要容器化部署
- 需要支持多环境的发布场景,把开发环境和测试环境集成在一个jenkins集群
- 管理Job不够灵活
二、目标
1、jenkins集群化,满足高可用的要求
2、通过Pipeline方式管理Job,通过pipeline模板做到自动化
3、每次新建项目时,审批通过后,一键自动创建jenkins/gitlab等工程。
4、能够支持开发的单元测试和测试的自动化测试
5、将整个公司各语言的项目构建归集在一起,做到友好的权限控制。
三、主要思路
1、Master-Slave架构
master-slave.png向nginx这么优秀的框架学习,master用来管理job和权限等,真正执行任务的交由slave节点。
如上图,salve的横向扩展能力,足以支撑公司的所有语言的所有项目的构建。
2、K8S容器化
k8s.png不仅做到master-slave,结合docker容器化,完美地做到了pod资源的动态伸缩,Job资源隔离,同时保证了Jenkins的高可用。
整个部署完 K8s 的集群以后,我们⾸先需要部署的就是 Jenkins 的 Master 节点。 Master 节点相关的配置是通过 K8s 来创建⼏个重要的对象:
- ⼀个是 namespace,这是 K8s 给 Jenkins 的⼀个独⽴的命名空间。
- 第⼆个就是 PVC 对象,我们会在图中看到⼀组外挂的存储节点,创建 PVC 对 象。
接下来就是要创建 deployment 对象,如果你了解 K8s ⼀定会清楚,deployment 是⼀个⾮常重要的 K8s control 的对象,它直接控制着 Pod 资源的镜像、Pod 的资源使⽤,还有它的服务探针等相关内容,这个都是在 deployment ⾥⾯进⾏创建的。
最后是创建 service 对象,service 对象创建以后,Pod 就可以正式的对集群内部提供服务。 以上,就是在 Master Jenkins 节点在 K8s ⾥⾯创建的过程。
具体的创建步骤,建议参考csdn文章:https://blog.csdn.net/aixiaoyang168/article/details/79767649
3、pipeline
管理job灵活,结合Blue Ocean UI让流水线的展示更加流畅。
pipeline.png
三、主要架构
架构设计.png1、基础层
在CICD框架中依赖的基础组件,需要持久化和共享,提供构建的效率。
- 发布系统(OA后台调用jenkins的接口管理job)
- git源码(增量拉取代码,需要存放在PVC)
- sonar(静态代码扫描)
- nexus(maven仓库,需要存放在PVC)(settings.xml需要共享)
- harbor(镜像仓库)
- k8s
- 报告(Allure和其他自测试平台的报告)
2、jenkins master
- Job的管理,依赖pipeline插件
- 权限管理,包括Role-Based Authorization Strategy和LDAP
- Manage Credentials,管理和第三方系统的密钥
- SSH
- FTP
3、jenkins slave
工作节点,包括拉取代码、构建jar包、sonar静态代码扫码、单元测试、ftp上传构建物以及ssh远程执行命令等等,它承担了原先单个jenkins节点的所有工作。
- git
- maven/gradle
- docker
- k8s
- sonar
- allure
四、总结
本系列文章主要是描述我们在搭建Jenkins集群的过程中遇到的坑,在此过程中,除了查阅jenkins和k8s官方的一些文档外,也得益于不少博客的帮助,让我们快速定位出问题。因此我们也希望经过本系列的文章,能让后来实践者少走点弯路。
五、后续的计划
DevOps.png此次的部署算是为DevOps打基础,暂时没用到harbor镜像,还是通过ftp传递jar包。而我们应用的部署,也还不是Docker/k8s这样的容器。我们的容器化,是为了jenkins高可用以及单元测试等分散负载。
六、参考资料:
https://github.com/jenkinsci/ssh-steps-plugin
https://www.jianshu.com/p/aaa16f1566d7
https://www.jenkins.io/zh/doc/pipeline/steps/
网友评论