Jenkins 刚开始搭建的时候,我们惊叹,这也太方便了吧?功能还这么强,慢慢的,我们会发现对方的缺点了,嗯,恋爱的味道,不对,似乎扯远了,还是说回来 Jenkins 了。
我们很难想象 Jenkins ,这么庞大的一个应用,居然没有数据库。那配置在哪保存呢?运行日志了?构建数据了?等等这些都是需要保存的啊。
屏幕快照 2019-12-19 下午8.29.10.png 屏幕快照 2019-12-19 下午8.29.10.png
当jenkins job数量达到一定量级,访问量大时候,会非常卡顿,仿佛回到了零几年的时候,网页那么卡。
查原因我们会发现瓶颈在 I/O 。因为jenkins每次访问,都需要读取配置,都需要读写隐塌日志,这些都是以文件方式写入磁盘的,是 所有slave 节点和 一台master 通信。
可是我们是没有办法做负载均衡的
当我们部署后端服务时候,肯定做 LB(负载均衡) , Jenkins master 因为只能单节点,啊,挂了master,所有slave都掉链子了。
配置 存储 master节点磁盘,嗯,还好,比较小
构建日志 存储在master节点磁盘,这个,百万行代码的编译日志几百M大小,每天N个业务构建M次,存储在master,哈哈,每天上班第一件事清磁盘?
构建产物 存储在master节点磁盘,这个,占磁盘,不安全
针对这种情况了,日志用 ELK ,产物放到到 对象存储
调度,一腊亩个好高深的话题,教材上学过 *** 作系统对进程的各种调度算法,什么 先入先出 , 最短耗时 , 最高优先级(PRI,NI) 等等,而类似的集群调度, k8s 可能是最常见的了,但是 Jenkins 对于任务调度这块,实际来讲,确实很弱, 虽然 调度 也是 Jenkins 的核心能力之一
k8s 里面有 node节点 概念, Jenkins 也有
k8s 里面有 pod 概念, Jenkins 没有,类似的, Jenkins 是限制 node 的最大并行个数
k8s 里面有调度器, 进行 Predicates 和 Priorities 两个过程, Jenkins 算法很简单,默认就是调度到 最近一次成功节点 上。
这样会带来一个比较严重的问题,会导致 部分机器处于极度打满,部分机器确空转,资源利用率严重两级分化 。
针对这点,我们其实有两种小的补救。
一种是降低node节点并行数量,比如原来是最大限制是10,下降到2后,第三个任务,比如调度另一个节点了,缺点就是可能造成更多排队情况
一种就是利用插件了,比如插件 throttle-concurrents 会比较均匀分配 https://plugins.jenkins.io/throttle-concurrents
总体而言,调度这块,Jenkins确实有很长路走
微服务 相比 单体应用 似乎高大上了很多,我们把服务抽象出来,只专注于某一部分,然后各个部分串联起来。
Jenkins 里面,一次构建,我们可能会灶局圆写一个长长的脚本,举例子来说,我们需要构建一个移动端产物apk/ipa, 我们需要
clone code -> 更新依赖库 -> 编译 -> 产物保存 -> 分发到商店
传统上,我们可以把这一串代码都写到 job 配置里面,但更好的做法,我们是把每一步抽象出来,每一步都是一个服务(一个job)
怎么串联起来呢? 没有流水线之前,是 Jenkins 上下游任务关联 , 哈哈,当任务量多了,我们发现,调用链很难捋清楚了,当然微服务里面有自己的解决办法 - 链路追踪,网关
流水线 ,可以帮我们把这些串联起来,我们最后需要管理的只是流水线
小思考,不足之处,欢迎交流
环境配置启动Jenkins
磨没岁1、 安装jdk
从略,建议1.6或以上版本,配置好环境变量。
2、 安察派装tomcat
从略,安装完调试下tomcat是否正常。
3、 安装ant
下载zip包,解压后配置好环境变量。
4、 安装jenkins
下载war包,命名为Jenkins,拷贝到tomcat/webapps目录下。
5、 安装Android SDK
下载安装,完成后配置好Android_SDK_HOME环境变量。此步骤主要用于进行android自动化测试,若不进行此项可略过。
安装完成后启动tomcat/bin/startup.bat文件(linux下是startup.sh),在浏览器输入t端口,即可访问jenkins服务器。
配置Jenkins
1、 JDK配置
新增JDK,指定JDK名字和JAVA_HOME
2、 ANT配置
新增ANT,指定ANT名字和ANT_HOME
3、 Maven配置
从略,本文未使用到Maven,具体配置方法参考Google。
4、 Subversion
选择1.6版本SVN,勾选Update default Subversion credentials cache after successful authentication
5、 邮件通知
填写SMTP server、Default user E-mail suffix、System Admin E-mail Address、Jenkins URL、勾选Use SMTP Authentication,填写User Name、Password、Use SSL、SMTP port、Chareset(UTF-8) 、Default Content Type(默认)、Default Recipients(默认收件人),配置完成后可进行测试邮件。
6、 Jenkins URL
配置该URL,用于别人访问。
插件管理
1、 Hudson Subversion Plug-in,jenkins的svn插件。
2、 Android Emulator Plugin,android模拟器插件。
3、 JUnit Attachments Plugin,junit测试报告附件插件。
4、 Email-ext plugin,邮件扩展插件。此处说明下,默认Jenkins只会发送构建失败的邮件,我们需安装此插件才能自定义不同场景。
5、 Deploy to container Plugin远程发布插件。
自动化测试
打包源工程
Android程序
本小节讲诉如何打包一个Android工程,当前使用的是ant进行编译源码。
1、 首先构建一个自由风格的Job。
2、 添加源码路径,选择所使用的版本控制器,输入源码路径。
3、 构建触发器可根据需要选择是否定时构建。
4、 构建环境,此处Jenkins安装了Android Emulator Plugin插件瞎睁,可以启动已有模拟器或添加新的模拟器,本文案例中使用真机调试。
5、 构建,卸载手机中原程序 adb –s uninstall com.XXXXXX
6、 生成bulid.xml文件,-p后面跟工程所在的本地jenkins下路径
android update project -n *** c:\被测工程Job路径\workspace
7、 Ant进行编译程序,并安装到当前手机中
ant debug install -f c:\被测工程Job路径\workspace\build.xml
8、 构建后 *** 作,本案例中构建完成后自动启动构建下一个测试Job
Bulid other projects,选择测试工程的Job.
打包测试工程
Android程序
本小节讲诉如何构建一个Android测试工程,包括邮件发送和测试报告展示。
1、 构建步骤1-7和Android程序章节一样,从略。
2、 本文案例中测试程序是通过命令行启动运行的,所以在此处增加一个批处理运行。P.S. adb shell am instrument -w -e class com.megafon.test.MegafonTest#testDeleteContact com.megafon.test/android.test.InstrumentationTestRunner ,此处是通过批处理来单独运行一个个的测试用例。避免了Junit3的无序执行的问题。
3、 删除Workspace中原来存在的测试报告文件,一般不删除也会覆盖。
如何让测试程序生成xml格式的测试报告,其他文章会重点介绍。
4、 从手机中拷贝测试报告,最终测试是在手机上运行,所以报告也生成在手机中,使用adb pull命令把测试报告全部拷贝到workspace下制定目录。
5、 构建后 *** 作,发布测试报告,如果报告中包含附件,此处使用到JUnit Attachments Plugin插件。
6、 邮件通知,此处使用到Email-ext plugin插件,前面的默认,直接使用我们在系统管理里面设置的默认值。
7、 点击右下角高级按钮,可选择不同场景下发送邮件。
8、 测试结果展示,在本次构建的控制台可以显示当前所有的构建日志。
9、测试报告点击Test Result可以显示所有测试记录。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)