Github Action 经验分享

726 阅读5分钟

Github Action介绍

Github Action是github提供的一个CICD平台,可以为托管在其上的项目提供持续集成和持续交付的能力,可用于自动构建、测试和部署。

Github Action对于公有仓库是免费的,对于私有仓库用户提供了一定的免费额度:

  • 对于运行在Linux上的作业,github提供了2000分钟的免费额度;
  • Github提供了10G免费的缓存,并且会对7天内未被访问的key进行删除;
  • 以上的使用限额,会在每个月进行重置;

关于Github更多的计费策略,可以点击跳转进行了解。

对于存储和运行时间不敏感的项目,Github Action的免费额度其实是能够覆盖到的,即使是超额,Github的超额计费也是比较便宜的。1000分钟的运行时间只需要8美元,对于托管在Github私有仓库的中小公司来说可以说是相当合算的选择。Github 提供的2核7G的机器对于一般的项目来说也够用了。

为什么要用Github Action

项目背景

项目使用Java语言开发,用maven管理项目依赖。

原先使用的方式是将代码托管于coding,自建的Jenkins服务将从coding拉取代码进行打包,再将制品放到k8s运行。Jenkins从coding拉取代码的速度是很慢的,往往需要将近10分钟才能将代码拉下来,再加上打包和上传镜像的时间,整个流程需要跑将近30分钟。而且如果打包失败,还需要重来,所以往往会出现整整一天才能把包打出来部署到测试环境的情况。

项目存在开源版本,其中部分模块托管于Github开源仓库,部分模块是闭源。为了避免维护两份代码,将整个项目拆为3个仓库,分别是开源部分、闭源后端仓库和前端闭源仓库。如果仍然沿用Jenkins必然增加了不少的复杂度和运行时间。

成本

现在我们线上的Jenkins服务经常会有莫名其妙的问题,如果沿用目前的方式,要得到一个稳定的服务,需要一个专业的运维人员维护整个的打包环境。目前github action提供的环境比较稳定,这么一段时间测试下来,基本上报错就是流程或者代码有问题,不会出现莫名其妙的Jenkins问题。

速度

目前来讲,使用Github Action进行打包的时间是比较稳定的,基本稳定在14分钟左右。Github Action提供了缓存依赖的功能,能够自动的缓存node、java、python等各种依赖。在使用Jenkins之前前端原本需要2分钟的依赖安装,使用了缓存依赖仅需要7秒钟左右就能加载所有的依赖。

对于代码拉取方面,由于目前闭源代码和开源的代码均托管在github,所以基本上三个代码仓库的拉取时间在7秒钟左右。相对于之前10分钟的拉取速度来讲,是一个极大的优化。

对于加快构建,我们做了不少的努力,比如说将需要安装的比较大的依赖打包成docker镜像,以私有的方式放到Github Package,当构建镜像时自动拉取镜像,8秒钟左右容器就能跑起来用于构建。

开源社区提供了丰富的插件,很多需要的功能不需要自己造轮子,在社区就能找到相应的插件。可以减少不少维护成本和调试速度。如果担心安全性问题,可以使用Github官方认证过的插件,某种程度上可以避免使用到”留后门“的插件。

对于在构建期间没有依赖的模块,可以进行并发构建,可以提高不少时间。不过如果组件之间存在相互依赖关系还是不要并发构建了,强行并发会增加系统的复杂度。

对于部署,Github上对于不同的云商,比如国内的阿里云腾讯云,国外的亚马逊谷歌云提供了不少轮子和模板,可以很方便的使用。

另外,对于运行器有要求的作业,Github还提供了多平台支持,支持使用Linux、Windows和Macos运行器,不需要自己维护多套环境。

权限管理

担心仓库被有心之人开源?这个其实不需要担心,只有owner有对仓库设置的权限,开发者对于仓库,对于制品(Github Package)是没有权限进行设置的。只要老板不手滑...

对于账单计费方面,Github也提供了一个结算账号的角色,组织内的开发者是没有权限查看账单和使用额度的,仅有owner和结算账号能够查看账单和使用额度。

踩坑以及解决建议

多仓库依赖

如果打包过程需要依赖多个仓库,进行构建的仓库并不能很好的感知到被依赖仓库的变化。这种情况有两种解决方式:

远程调试

在进行用Github配置cicd的过程中,还是踩了不少的坑。对于每次修改yml文件,就需要上传一次构建进行远程调试,这样的过程比较麻烦而且占用计费时间。这种情况下act是一个非常好用的工具,跳转到act仓库链接

调试过程太麻烦

我们在进行构建的过程中,由于一个依赖没有处理好,github action并不能很好的进行调试,我们一次次提交修改一次次看报错信息,导致团队搞了好几个小时都没发现问题所在。这个问题,这里推荐tmate插件,可以在运行器起一个tmate服务,在本地通过ssh连接上运行器查看相关信息,再进行调试会方便很多,这里依然提供快速跳转

相信有了上述两个工具,能够极大提升你的调试体验。如果你有更好的工具,请告诉我,不要藏私。