我在编码过程使用 Jenkins 自动化的姿势
如果你是程序员新手,更推荐和建议看一下,某个角度上来说,会让你走上老手的道路。
概述
对于一般来使用自动化的团队来说,Jenkins 是少不了的这个工具,使用的姿势有很多种,之前也尝试使用过多种其它的自动化工具,比如 github-action/gitlab-action/Travis CI,感觉能与之匹敌的应该就 github-action,其它的都可以比较专门和针对化。
使用场景
自动化能力平时用得比较多,比如最常见的 IT 方式,比如开发,构建,测试,运维等,基本上感觉这东西几乎无所不能的感觉。包括自己一些生活的锁事,比如电脑自动清理,某个文档的定时发布,然后做一些文档材料的定时备份,还有定时同步更新网盘,平时自己学习任务的提醒等,这东西都能成为一套东西。
总的给我的感觉是,包括自己生活也自动化起来。这里阐述从几个角度进行说明,结合自己的平常使用:
生活和学习中为什么要选择一款自动化工具
使用 Jenkins 提升自动化的操作过程
通过过程一切自动化能力,你会发现,开发人员一个人可以做项目管理中的很多事情,比如测试、运维、管理、运维、提醒等各种各样的能力。
过程阐述
目前来说,我们需要考虑时间成本和学习成本,还有管理成本,对于开发人员来说,这些是很容易做到的。
生活和学习中为什么要选择一款自动化工具
为什么要选择一款自动化工具,对于来说,节约成本,不是对公司的成本,而是对自己的成本,让自己提升更高一阶层的思考。
什么叫高一阶层的思考,比如不会再对于一些重复性的工作来来回回倒腾,不会再对以前的一些工具来来回回的倒腾,不会再对以前自己的手稿或者代码来来回回的倒腾。那其它的时间做什么的呢,主要是做架构设计的思考,新的技术点的思考,优化点的思路,这些过程从传统软件模式来说,都是成本。那我们用自动化工具做哪些事情,自己常常使用的作用是这样的:
【编码】做一些练习项目工程的打包和发布,版本的发布管理;
【运维】做一些常见的运维管理,还有学习示例运行,包括调用一些第三方云平台接口;
【数据】做一些常见的数据抽取,汇总,统计结果管理,如每周时间段汇总;
【运维】做一些自己在跑的服务检查和巡检管理,然后出现异常之后,给我报警;
【测试】做一些测试用例和测试运行效果管理,类似于自动化测试之类的;
【运维】做一些邮件定时清理,应用数据定时备份的管理之类的;
…..
编程工作中很多都需要很多,这些过程都可以变成自动化,然后自动执行,想到哪些就调用哪些,比如服务器密码修改,开始并不频繁,这个后来变成自动化,每月定时修改一次,然后自动重启服务,然后自动把新密钥发送邮箱里面,然后钉钉会告诉我这个完成了。
这些节省了我很多时间上的成本,而自己也不想在这个上面浪费太多的时间,整个过程下来你会发现,学习和生活过程中方便了很多。
当然,开始的时候可能会觉得这个怎么可能要去做那么多的东西,开始也这么思考,类似于学习 Vim 工具,这个开始也很难用,但是发现克服之后,你会发现工具使用效率非常高,类似于使用 Markdown 写文档,速度会比 Word 快很多,目前最多的是结合 Vim+MarkDown 一起使用,你会发现编写文字会是另一种享受,所以工具的使用,只是前期稍稍有一些困难,但是走下一个 Demo 示例之后,整个流程会顺利了很多。
对于新的开发人员来说,学习使用自动化工具,会让你方便很多,同时心理上会有一些莫名其妙的安慰感,比如你会发现很多开发人员还是手工的形式,心里面可以这么考虑,“都 2023 年了,怎么还是这么手工操作,效率低下。”,心里默念即可。不过对于新手来说,这的的确确增进了你很多的效率。
使用 Jenkins 提升自动化的操作过程
注意,以下的环境搭建是基于内网环境,注意不要暴露在公网上,我这里是在淘了一台主机回来单独放置的。
先看个简单的数据,几年沉淀下来自动化数据,目前是稍微统计的:
Git 自动化脚本仓库有 4 个,自动化脚本数最多的库中有近百个脚本;
积累使用的镜像容器有 150 个左右,包括基础镜像和学习镜像;
学习安装和调试使用过的软件,在库有 90+个;
在过程中及当前在运行中的自动化任务有 300+个;
以上自动化任务也只是管理我的学习环境,方便我自己生活中的一些自动化能力,远超我自己的想像范围。
在选择性上,老实说,自动化工具目前市面上免费的(肯定首选免费)比较强悍稳定的还比较少,我们过程需要比较高度的制定化高一些,同时会兼容很多第三方的工具和插件,这个自己相对来比较喜欢的是 GithubAction,但是发现本地化和定制化能力比较强的,还是 Jenkins,本地化方便放我们的隐私,而且没有约束。
那这些过程怎么做的呢,怎么实现我们自己生活和学习中的自动化呢?
准备一下脚本仓库,这里的脚本使用 Git 做的管理,这里选择性比较多,然后每个脚本都定时更新到 Git 上面,分配好目录即可,或者分配好每个 Git 基线的权限和职责,这个应该是比较容易做到,开始乱一些也没什么问题,后面再规范也可以。
过程方便的时候或者有灵感的时候都可以随时提交你的记录,方便后期的管理,这个基线库就会形成你后面的通用脚本库。我开始也觉得不会有多少,但是几年沉淀下来,有上百个脚本,这些都是前期学习和过程中坑点的积累,通过这些脚本库,就类似于我有一套较为完善的软件开发自动化的能力,应付一般的项目和管理完全是没啥大的问题。
比如自动化软件的安装,然后我把它放在网盘做个软件库(网盘是备份,下载使用的是七牛),沉淀几年下来的,有几十款软件,而且都是学习验证过的:
另外一个例子,在容器打包上面,平时生活中打的容器也有多个(这些只是过程中的验证,而且这些都积累成脚本),这些都是在使用过程中的坑点,一点点积累的优化完善,而且有完整的修复和优化记录,完全可以查询痕迹的,下面这些只是目录,目录下面还有多版本,包括服务器环境等。
如果你平时把自己积累的一些学习脚本还有练习脚本积累下来,两三年左右,基本上就成套了,这些规模远可能超过你原来的想像的。
所以这些自动化的脚本基本上都我都打成一套脚本放在 Git 管理,同时不断的优化完善,然后通过 Jenkins 的自动执行操作,而整个下来的 Jenkins 任务下来,到目前为止,也有 300 多个自动化任务,这些只是我一个人在过程中的自动化操作任务。
在集成脚本管理之后,各类型的定时化管理,比如一些可能需要调用的第三接口,如果比如集中的,这里采用 Python 脚本或者 Java 脚本进行编写,一些简单的脚本编写并不难,只是简单的调用,然后集成自动化发布和版本更新管理,这样在任务里面就可以调用这些脚本。
这类似的场景并不是特别多,也考虑过做成 Jenkins 插件,但是感觉没啥必要,维护这个插件成本也不低,另外兼容性等成问题。
有了脚本库还有定时化解决之后,任务的排版目前使用是 Jenkinsfile,即 Pipeline 进行任务编排,这个方式效果会好很多,至少在打包上,几乎可以做到一种无所不能的感觉(当前,你也可以理解成它就是一个执行器),但是整合起来效果就非常强大。
不过就是工作流的执行上,当前比较差强人意,目前 Jenkins 的编排还是硬编码的形式,还不能有可视化拖拉,多个任务形成原子性,不过基本上也可以达到效果,就是简单的流程还行,多个复杂的流程就有点难,整体下来结合使用的效果还是不错的。
这些任务常年累月下来,形成的自动化能力基本上已经覆盖了平时编码和学习的场景,节省了我很多的时间和场景。同时自己也在不断的优化找更好的方案提升本身学习环境的效能,目前使用的方式都是有现成的脚本案例参考还有调优模式,然后不断的优化查找更好的方案,尝试使用过其它的自动化工具,但是还是缺少很多的能力和稳定性。
这些对于开发人员特别是新人来说,相对来说,会节约很多的时间成本和学习沉淀,不管是在后期工作中还是管理中,自动化的能力都是很普遍的,比如对于中小型公司来说,这基本上整体的效能会提升很多,对于个人来说,积累下来的东西是在某个程度上,也是经验的积累,在一些工作上是远远超过资历年限的积累的,修改一下就可以使用,会解决很多问题。
总结
自动化能力在 IT 领域是普遍的能力,工具的使用和场景的覆盖面,还有效能的提升相对来说对个人是一个非常大的帮助,也见过很多在使用自动化能力的,在很多场景下是可以优化的,同时提高效率的。
以上是自己使用 Jenkins 自动化操作的一些场景和经验积累,提供做下参考。
版权声明: 本文为 InfoQ 作者【软件工程师-罗小东】的原创文章。
原文链接:【http://xie.infoq.cn/article/bb3b476822330a8eff48d599d】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论