基于 GitLab 实现 DevOps
在过去4年里,我们团队的整个软件开发流程(代码版本控制、开发任务管理、缺陷管理和自动化部署)都在私有部署的社区版 GitLab 上面进行,它是我们的核心协作平台。配合上 docker 和 cnpm 仓库,我们基本上实现了 JavaScript/NodeJS 全栈的自动化 DevOps。
GitLab 有个扩展程序叫 GitLab runner,它与 GitLab 对接之后,GitLab 会将触发的 Pipeline 任务推送到 runner 上执行。
Runner 上支持多种类型的 executor,我们选择的是 docker executor ,因为我们希望使用 docker 来部署程序,并且也希望服务器的环境相对干净且易于管理。
docker executor 在工作时会根据 CI 配置文件中的镜像配置启动一个容器,并执行 CI 配置文件中的脚本。在任务完成后容器会自动销毁,非常干净。
当然你也可以通过缓存路径配置来重复利用某些文件,比如 node_modules 文件。我们利用这个特性和 pipeline variables 实现了项目分包按需编译。
由于我们的项目一般都使用了前后端分离设计,前端有时候会分好几个工程,并且后端拆了微服务,因此在发布一个程序时,我们需要进行编译和组装。
这个时候会有两个问题:
Pipeline 接力很容易实现,在一个工程的 Pipeline 结束后通过 GitLab 的 Pipeline api 或者 trigger api 触发另外一个工程师的 Pipeline 即可。
我们在发布一个多组件程序的时候,很多时候只需要更新它的一个组件。我们通过两个方式实了按需分步编译:
这样如果我们只需要更新组件A,那就只需要编译和归档组件A的新版本到 cnpm 中,在部署时,新版本的组件A会和其他未更新的组件被组装在一起。