Bamboo 开发工程师

《中国企业协同解决方案》节选《 Bamboo 开发工程师》

代码为王

就如同 DevOps 工程师喜欢 Jenkins 一样,近些年,我几乎很少听到有开发工程师会热衷于除了 GitHub Actions 或者 GitLab CI 以外的自动化工具。

一方面,像代码一样管理 CI/CD 对于开发工程师来说更舒适,另一方面,使用代码仓库平台本身的 CI/CD 会使开发工程师的工作体验更优雅,界面也毫无割裂感。在他们心中,代码才是王道,毕竟 "Talk is cheap. Show me the code" 是刻在基因里的。

虽然 Jenkins 的 Jenkinsfile 也支持像代码一样管理流水线,但始终不能入开发工程师的法眼。Bamboo 也会面临一样的境遇,因此,Bamboo 上的构建流水线大概率是由 DevOps 工程师来运作,这主要看团队文化。

CI/CD 工具除非界面操作足够简洁,通过下拉菜单勾选就能够完成配置,否则很难说服开发工程师使用,更何况 Bamboo 对权限还进行了管控,虽然这对企业是一件意义非凡的事,但对于开发工程师来说就是噩梦。

不管现实中由谁来负责配置开发任务的流水线,在本文中,我们把它整理到开发工程师的段落中来。

构建任务的设计

代码克隆

代码克隆是原生自带的任务类型,一般在新建 Bamboo 计划的时候,就可以对其进行配置了。项目中若已经事先关联好代码仓库,那么只需要通过下拉菜单选择仓库名就可以了。

不过,要注意,我接触的很多 CI/CD 平台,默认都是不开启 git 的 submodule 功能的,所以使用 submodule 的团队,需要告诉你的 Bamboo 管理员。

单元测试

克隆之后,一般都会从单元测试开始。由于我们期望每个任务环境足够独立,所以不同的阶段(Stage) 都是在各自容器中执行,而每个阶段里面只包含一个任务好让它独占容器环境。

需要了解的是,Bamboo 本身并不一定具备这些单元测试框架,虽然你能够在任务类型中看到很多熟悉的名称。

一部分单元测试类型的截图

但实际上,这都需要系统管理员提前准备好代理,或者像我们使用的方案一样,将其置于对应的开发语言容器环境中。这样,即使不同任务需要使用不同版本的依赖也不用担心冲突,更不用担心环境中多余的软件包和配置,任务环境足够纯粹。

编译

如果代码需要编译,那这一步是必不可少的。当然,如果最终我们需要构建成容器镜像,也可以直接使用多阶段构建一步到位。这取决于中间我们是否要做一些更细致的测试,比如静态代码扫描。

虽然理论上来说,代码相同的情况下,两次编译的结果应该相同,但一来没有必要编译两次,二来虽然看起来一样,但实际你永远无法踏进同一条河流。

所以,为编译工作单独设计一个任务,并且保留编译制品,是比较明智的做法。

对于编译任务,Bamboo 提供了一些内置的任务模板,使用起来不算优雅,但还算方便。

一部分构建类型的截图

代码扫描

代码扫描的工具也不少,静态代码扫描工具 SonarQube 还是值得接入的。我接触过不少开发工程师利用了它,实实在在地提升了自己的代码质量。

镜像构建

如果我们最终以容器镜像的形式作为交付物,Bamboo 内置的 Docker 任务模板会让体验更友好一些。

原本 Docker 任务大可不必另启一个容器环境,但我们的设计是所有任务均在各自的容器环境中执行,这使得任务的工作目录需要通过挂载卷的方式传递到不同的容器中,以保证不同阶段任务的连续性。

这其实与 Bamboo 对阶段的设计不太吻合,Bamboo 期望不同的阶段完全解偶,所以如果以默认方式配置一个阶段,你会发现每个阶段都会要求做一次代码克隆。这在多人协作的场景下,容易发生一些不必要的冲突。

比如,流水线正在执行的时候,代码有新的提交,这条流水线如果在不同阶段使用不同的代码,其最终结果,可能会造成工程师们的误判。

但 Docker 任务存在其特殊性,工具人学堂的顾问都是自己定制的任务容器镜像来执行该系列任务。

而我们依旧利用 Bamboo 自带的 Docker 任务类型来完成其余的工作,效果更好。

触发规则

代码提交

代码提交时触发构建任务自动执行,是最基础的场景之一,几乎每个团队都需要这样的场景。

在 Atlassian 生态中,BitBucket 和 Bamboo 是天然集成的,所以这个场景的触发策略会默认开启。其他的代码仓库平台就需要手动配置网勾,或者轮询。

请求代码合并

在标准的代码分支管理中,有个很重要的行为就是"请求代码合并" (Pull Request / Merge Request)。

这象征着代码经过了开发工程师的自测,有了一定质量把握,从而请求合并到公共分支。

基于这一信号,触发构建自动化任务,对于一些公用的构建流水线任务,将更为合理。

不过,Bamboo 并没有这种触发规则,虽然我们可以在流水线中设置判断条件来达到这种效果,但它不如触发规则上的体验优雅。当然,不管是哪种方式,都需要软件研发团队科学的做好代码分支管理,让重要的分支只允许请求代码合并,从而更好的利用流水线的执行结果。

测试报告

单元测试

Bamboo 对于单元测试也做了一些定制化设计,只要流水线结果中包含单元测试的结果,就会显示在独立的测试标签页中。

我们且不论仅这样列表展示是否科学,但它至少提供了一个查看测试报告的入口。

代码扫描

如果执行了代码扫描任务,通常情况下是不会有报告的。

比如 SonarQube 就是需要访问 SonarQube 服务器查看扫描报告的,所以你必须对这些任务加以定制,让团队以方便的方式查看详情。



我是工具人学堂的威尔(石巍|Will),Atlassian Solution Partner 高级顾问

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章