Jenkins 三十六计
[参考文档] :《DevOps 三十六计》 电子工业出版社
总说
是什么能够驱动持续交付与DevOps 的转型与落地?是什么能真正打破部门墙,实现端到端的服务交付?答案就是:Jenkins!
相信大部分IT 从业人员都听说过或者使用过Jenkins,研发工程师使用Jenkins 执行编译打包,测试工程师使用Jenkins 执行自动化测试,运维工程师使用Jenkins执行批量操作和自动化部署,Jenkins可谓居家必备的神器。
Jenkins的前身Hudson 诞生于2004年,由Sun公司的一名年轻工程师 Kohsuke Kawaguchi(KK) 研发,一开始主要用于满足工程师个人自动化的需求,后来不断有开源爱好者贡献代码。在2010年Oracle 收购Sun之后不久,Hudson和Sun 公司的其他著名开源软件Java、MySql 等一样面临抉择。2011年年初,社区投票决定:基于Hudson 创建新的开源项目–Jenkins。在社区的努力下,Jenkins的发展远超Hudson,逐渐成为最流行的开源工具之一,可以说是开源赋予了Jenkins全新的生命力。
Jenkins目前由Jenkins Governance Committee (Jenkins 管理委员会负责管理),包括Jenkins 版本的选择与发布,重大缺陷的处理,全球Jenkins Area Meetup 以及Jenkins User Conference 等活动授权和组织等相关工作。目前中国有Jenkins User Conference China 大会,以及北京,上海,深圳等多个城市的Jenkins Area Meetup 沙龙活动。
Jenkins 从解决工程师的切身需求出发,跟随社区一起成长,逐步从自动化工具升级为持续集成引擎,持续交付核心工具,DevOps 核心工具。
目前KK 对Jenkins 的定位是:Jenkins is the Hub of CD/DEVOps Ecosystem,即Jenkins 是持续交付/DevOps 生态的核心,如下图所示:
截至2017年8月的Jenkins World 大会前夕,Jenkins 已经拥有1400 多个插件,囊括代码管理,自动化构建,自动化代码扫描,自动化测试,制品管理类,自动化部署等多个软件工程领域,具备与众多开源工具及商业产品(如Git,GitHub,Gerrit,Maven,Junit,Nexus,Docker,Kubernetes和Mesos等)的集成能力。
Jenkins Core 提供了一个平台,借助Jenkins 开源社区的力量,以插件的方式实现一个持续交付与DevOps 的生态系统。尤其是2.0版本以后,Jenkins 提供了对PipeLine 的原生支持,而Pipeline 又是持续交付的核心实践,PipeLine 可以帮助团队打通从代码提交到发布上线的端到端的交付过程,整合多角色(研发,测试,运维,安全等)的职能,实践与工具集合,再配合BlueOcean 的Pipeline 可视化查看和编辑功能,能够让持续交付流水线设计变得更加容易实现。结合Jenkinsfile的使用,将流水线的编排以文件的方式采用版本控制系统管理起来,能够轻松实现Pipeline As Code。
Jenkins 拥有众多的优点,比如开源,平台化,分布式调度,出色的流水线编排,插件种类齐全,入门简单,社区活跃等,但众多优点也难掩其企业级与规模化应用下的不足,比如单体架构,本地化文件存储,界面易用性差,性能瓶颈明显,安全问题较多等。我们希望通过自己多实践持续交付和使用Jenkins 的经验分享,帮助大家少走弯路,早日走上持续交付与DevOps的康庄大道。
三十六计
综合
- Jenkins 用得好,插件不能少。
- 插件虽好,可不要贪多;插件越多,Jenkins UI 越慢。
- Jenkins API 很强大,Python Jenkins 让API 使用起来更简单。
- Jenkins 不仅仅是自动化工具,Jenkins Pipeline 和 Blue Ocean能实现可视化部署流水线,帮你迈向持续交付与DevOps。
插件
- LDAP 集成域用户,轻松搞定统一用户管理,Active Directory Plugin 和LDAP Plugin 都可以实现LDAP 管理
- Role Strategy Plugin 可以实现精细化权限管理。
- Cofig History Plugin 可记录Job和Slave 配置版本,轻松实现回滚。
- Build Monitor Plugin 可以让Build 菜单可视化,方便团队监控 Build。
- SafeRestart Plugin 可以安全重启Jenkins。
- Jenkins Job Builder 可以将Job 创建变得模板化和脚本化,给你不一样的规模化Job管理。
- Promoted Builds Plugin可以标记Build结果,实现Build 结果质量门控制。
- Promoted Builds Plugin可以标记Build 结果,实现Build结果质量门控制。
- Mask Passwords Plugin 可以实现敏感信息控制台加密输出。
- GitLab Plugin 可以集成GitLab,实现代码提交或Merge Request 即构建。
- SonarQube Scanner for Jenkins 可以集成SonarQube,帮忙随时查看代码扫描结果。
- Jira Plugin 可以集成Jira,实现问题状态自动化流转。
- Junit Plugin可以生成测试覆盖率报告,方便洞察代码质量趋势。
使用规范
- 推荐使用LTS 安装报包部署Jenkins,安装升级更简单,War包只适合再应用服务器有特殊配置时使用。
- Jenkins 文件数据备份和恢复验证要常做,备份Archive 要谨慎。
- Job和View 命名要规范,View 配置要想好,正则表达式是法宝。
- 清除旧的构建有必要,按天还是按量,需要看磁盘大小和业务需求。
- Job少用Archive,磁盘IO 不再高。
- 禁止在Jenkins Master 上跑业务Job。
- 及时清理无用的Job,用Shelve Project Plugin 实现转存比直接删除强。
- Jenkins Credentials 管理认证信息,勿在脚本中写账好密码。
- 保持Master和Slave 节点时间一致,灵异问题将不再出现。
- Build邮件不乱发,定位个人很重要。
- Job和Build 数量较多时,避免使用Reload Configuration from Disk。
使用技巧
- 善用Job参数,强大的参数化构建可以实现job动态配置。
- 善用文件Fingerprint 实现Job异步关联。
- Pipeline as Code ,以Jenkins 的方式编写和存储流水线脚本,实现统一管理与版本控制。
- Pipeline 支持并行(parallel) 执行,多环境并行执行不再是梦。
- 善用PipeLine Syntax 提示功能,快速编写PipeLine脚本。
- 使用Slave 执行Job ,充分利用分布式构建优势,性能与隔离两不误。
- 标准化Slave 配置,资源池化Slave,Job执行更加灵活。
- Slave标签可以分类构建资源,实现简易构建集群。
- 使用Swarm 或 Kubernetes 搞定构建集群。
- 单独监控Build时长,日志大小,队列等待,及时发现问题。
- Build 日志是财富,能帮我们统计构建成功率,时长和用户信息。
- 按需在构建前或构建后清理WorkSpace,安全又省空间。
- 环境变量生效顺序:Job injected 环境变量——>Job 参数——>slave 配置环境变量——>全局环境变量,系统变量一般不会被Override。
- 有问题查文档,官方Jenkins User Handbook 来帮忙。
案例:企业级Jenkins 之构建环境标准化,集群化,弹性化
Jenkins 基于Master-Slave 的架构提供分布式调度的能力,Jenkins Master 会将任务分发到Slave 上执行,我们可以通过横向扩展Slave 数量或提高配置来提升Jenkins 任务执行的效率,基于容器技术,可以轻松实现Slave 的标准化,集群化,弹性化,从而保障构建环境的一致性,构建效率以及资源的有效利用率。
Jenkins 支持创建传统的Slave ,比如通过SSH 方式添加一个机器作为Slave,配置一个或多个executor,此Slave 一般保持长连接状态,等候构建任务的分配和运行,构建任务的并发规模受限于Slave 及其executor 数量。这种类型的Slave 往往直接挂载物理机或者虚拟机,通过Jenkins UI 可以查看Salve 的状态,并对Slave进行管理等。
除此之外,Jenkins 对容器化Slave 的支持也很好,通过使用Docker 镜像固化构建环境,使用诸如Docker 插件,Kubernetes 插件,Mesos 插件等根据需求动态提供容器作为Jenkins Slave,运行构建任务后及时销毁容器Slave。这种方式在Slave 的自动扩缩容上弹性比较好,也能大幅提高资源利用率。