开篇
总的来说,在我认知中的CI/CD流程,可以分为以下几大步:
maven打包流程
镜像打包流程
镜像推送流程
镜像拉取流程
镜像启动流程
这几个步骤里可以进行更细一步的划分,当然,我在这篇文章里不会一 一去列举,对应的,我会直接点名流程中存在的,可以优化的点。
Maven打包流程
1、使用本地代码仓库
如果你的代码仓库托管在第三方平台,比如Gitee、Github这些,Jenkins在执行流水线的过程中拉取代码时,是要走外网带宽的,考虑到我们的网络环境,如果是Gitee这类国内的托管平台还好,如果是Github这种,100%会遇到超时的情况。当然,你可以配置代理、DNS之类的去优化这个问题,但是时间、成本花在那里完全不值当。最理想的环境是代码仓库和Jenkins在一个局域网内,拉取代码时直接走内网带宽。
2、配置正确的Maven仓库源
关于这点,其实和上述情况差不多,Maven的默认仓库源是在外网的,这个仓库源虽然不像Github那样墙的那么死,但是它的访问速度确实差点意思。我们最通用的做法都是配上阿里的仓库,基本上就够用了。
3、复用本地缓存
Maven默认是有.m2缓存的,所以这里主要说的是在Jenkins流水线的环境下要配置缓存的复用。详细的配置其实我也没做了解,这里我在工作中使用了比较直接的方法在Jenkins的机器中手动安装Maven,手动进Jenkins控制台里配置Maven信息。
4、选择性的跳过不需要的Maven生命周期
根据不同的部署环境去选择执行不同的生命周期。这块我提供不了比较有价值的参考,我这儿直接Install、package一把梭了。
5、排除不需要的依赖项
借助IDE把没有用到的第三方包排除掉,达到减小包体积的效果。
6、使用多线程提高Install速度
可以通过-T参数开启多线程的编译打包,提高速度。
镜像打包、推送、拉取流程
1、选择轻量级的基础镜像
这块我基本上都是自己去拉个Alphine镜像,然后写个DockerFile往里边加自己需要的东西,比如jdk、中文包之类的。有朋友可能会疑问,直接整个jre不是更合适吗?这是因为我们在后续排查各种问题的时候,还需要用到jdk提供的各种命令行工具,我们并不是集成了JDK就什么不做,我们可以在JDK的基础上进一步的去删减一下不必要的内容,这里可以去搜索引擎搜一下相关的镜像制作内容。
2、配置合理的镜像源
在写下这篇文章的今天,我现在认为这是一个很曹丹的优化点。以往我们可以配阿里云的镜像源起到加速的效果,但是现在国内的镜像源基本都被鲨完了,现在要么配代理,要么直接用海外服务器搭个代理镜像仓库。
3、编写合理的DockerFile
这里略。
4、使用本地镜像仓库
搭个本地的Harbor,手动把各种需要的镜像从DockerHub拉下来推到本地仓库。
5、注意网络环境,尽量不走外网带宽
简而言之就是和上述说的情况差不多。
镜像启动流程
1、!必须配置健康检测
健康检测是很重要的,如果你不配置监控坚持,容器在你执行run命令的时候,就会直接进入就绪状态,如果这时候请求路由到容器,会产生大量错误警告的!
2、这块更多是代码层面的,比如对一些资源进行懒加载
总结
总得来说,可以归纳为考虑网络带宽、包体积、缓存复用。这是结合个人在实践中总结出来的一些优化经验,仅供参考,希望对你有帮助。