Atlassian套件玩转持续交付
Atlassian公司,成立于2002年,是澳大利亚一家面向企业提供协作、开发和问题跟踪软件的SaaS公司。旗下产品包括企业知识管理与协同软件Confluence,团队问题跟踪和敏捷项目管理软件Jira,直观地针对任何项目进行协作的在线看板工具Trello,Git代码管理软件Bitbucket,Git和Mercurial代码管理客户端Sourcetree,持续集成和发布管理软件Bamboo,以及协同IT服务管理软件Jira Service Desk等。
下图为使用Atlassian套件做持续交付的业务流程图,其中的持续集成与持续交付部分展示了开篇视频的大致操作流程。在这篇文章中,我跟大家分享了在产品需求管理过程中Jira与Confluence工具如何双剑合璧、发挥集成带来的益处,覆盖了产品规划、需求文档与过程管理、迭代计划与跟踪管理和报表管理等。接下来,我们一起进入软件研发世界,瞧瞧Atlassian套件如何实现“从代码到客户,持续交付”的目标。

01
—
CI/CD与持续部署介绍
持续集成(
持续交付(
持续部署(

02
—
持续交付工具链配置
Atlassian通过应用程序链接(
1.Jira配置
为了实现在研发过程中自动更新相应的Jira状态,比如:在创建新代码分支时将Jira用户故事的状态从
Branch created:当代码仓库中有新分支被创建时自动转换工作流;
Commit created:当有新的代码提交到代码仓库时自动转换工作流;
Pull request created:当有新的拉取请求创建时自动转换工作流;
Pull request declined:当拉取请求被拒绝时自动转换工作流;
Pull Request reopened:当拉取请求被重新打开时自动转换工作流;
Pull request merged:当拉取请求被合并到主干时自动转换工作流;

2.Bitbucket配置
软件开发人员主要通过代码进行沟通和协作,一款优秀的源代码版本控制系统至关重要。Bitbucket采用Git和Mercrurial作为分布式版本控制系统,团队借助Bitbucket可以集中规划项目、开展代码协作以及进行测试和部署。其特点有:
提供无限个私有代码库(5人以下小型团队免费);
与Jira和Trello无缝集成,可以直接从Jira问题或Trello卡片创建Bitbucket分支;
通过代码评审构建高质量软件,通过拉取请求更高效地批准代码评审,通过内嵌的评论直接在源代码中讨论;
通过内置的持续交付功能实现频繁部署,
Bitbucket Pipelines with Deployments 使用集成式CI/CD构建、测试和部署,获得配置即代码和快速反馈回路带来的优势;保护工作流,通过IP白名单和双重验证确保云上代码的安全性;
当第一次使用Bitbucket时,我们先创建Bitbucket项目,在项目下创建所需数量的代码仓库。在仓库设置(

3.Bamboo配置
Bamboo Server是一款持续集成和交付工具,在简单的工作流程中整合了自动化构建、测试和发布,可以完美配合Jira Software和Bitbucket的工作,提供完全可跟踪的部署流水线。Bamboo适用于任何语言,以及AWS CodeDeploy、Docker和Amazon S3等其他热门技术。借助Bamboo的专用代理功能可以立即运行修补程序和关键构建。另外,Bamboo最多支持100个远端构建代理,能够并行地运行批量测试,从而使队列保持流动,并快速为开发人员提供反馈。
Bamboo模型将构建项目与部署项目独立开,但是可以通过触发器在构建项目执行成功后自动触发部署过程。我们先创建构建项目,然后在项目下创建所需数量的计划(Plans):
每个Plan定义了整个构建过程的所有配置信息,比如:关联的Bitbucket代码仓库、计划分支(Plan Branch)创建规则、通知配置和构建任务编排等;
每个Plan下可以配置多个串行执行的Stages,用来控制工作流的执行,每个Stage表示构建流程的一个步骤,比如:为编译创建一个Stage,紧跟着测试、部署Stages;
每个Stage中可以配置多个并行执行的Jobs,每个Job代表构建代理服务器上运行的任务集合,需配置构建的输入物、所需的可执行程序、运行构建的代理服务器和构建过程的输出物等;
每个Job中可以配置多个串行执行的Tasks,每个Task是进行自动化构建的基本块,比如:Maven、Ant和自定义脚本等;

在构建计划中,Bamboo提供了多种触发器触发构建过程,比如:由Bitbucket服务器代码仓库触发(有变更被提交时触发)、远程触发器、代码仓库轮询(如:每小时轮询一次,检查到代码变更时触发)、按计划运行(如:工作日工作时间段内每小时触发一次)、每日构建(如:每天凌晨4:00触发)。在我们的Demo中,配置成“由Bitbucket服务器代码仓库触发”。计划分支(Plan Branch)让我们可以使用同样的计划配置在不同的分支上运行构建,可以设置在什么情况下创建和删除计划分支,比如:手动创建、在新建拉取请求时自动创建、在创建分支时自动创建、在创建分支且匹配指定正则表达式时自动创建。在我们的Demo中,配置成“在创建分支时自动创建”。
Bamboo还提供了自动合并和通知偏好等功能,带计划分支的特性分支模型为开发人员提供了灵活且精确的冲突规避工具,通过频繁且规律的代码合并,减少了“代码漂移”(

在
Source Code Checkout:将源代码从仓库中检出到Bamboo工作目录中,需配置代码仓库;
Maven 3.x:Apache Maven是构建和管理Java项目的工具,需配置可执行的Maven程序及相关参数、JDK和工作目录等;
Sonar Maven 3:做Sonar静态代码扫描与分析,需配置Maven程序、JDK、SonarQube服务器、分支与拉取请求选项等;
JUnit Parser:解析构建后的测试结果,需配置JUnit测试报告目录,比如:
**/surefire-reports/*.xml

我们Demo的目标是将构建的制品(Artifacts)自动部署到阿里云服务器上,并发布给终端用户使用。接下来,我们需要创建部署项目,关联以上配置好的构建计划,可以选择使用主干计划分支(基于master)或自定义计划分支(Plan Branch)。一般针对不同阶段配置不同的部署环境(如:测试环境、预生产环境和生产环境),部署通常运行在代理服务器上,也可以配置到Docker容器中。每个环境需定义将发布部署到该环境所涉及的步骤及部署的触发器等。为了简化流程,这个Demo仅配置了一个生产环境,持续部署的触发条件是:在主干计划分支构建成功后。部署到生产环境的Tasks配置如下:
Artifact download task:用于在不同的构建计划之间共享制品,或者在部署环境中共享构建计划的制品,而不需要每次重新构建。需将制品名称配置成构建计划中Job产出的制品;
SCP Task:用于将Bamboo中的文件直接上传到远程服务器,可以拷贝多个文件,并保留拷贝文件的完整目录结构。需配置远程服务器地址、身份认证、制品名称和远程目录等;
SSH Task:用于执行远程服务器上的SSH命令,比如:调用数据库迁移脚本、启停服务等。需配置远程服务器地址、身份认证、SSH命令等;

3.与SonarQube集成
SonarQube是一个代码质量管理平台,可以将各种代码质量和覆盖率检测工具的结果(如:CheckStyle和Jacoco)直接展示给用户,还可以通过不同的插件算法对结果进行再加工,并最终以量化的方式来衡量代码质量,从而方便地对不同规模和种类的工程进行相应的代码质量管理,以便进行有针对性的代码修复或重构。同时,SonarQube还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用。
下图是将SonarQube集成到Atlassian持续集成中的解决方案,需要在Bitbucket和Bamboo中分别安装

在安装好

在代码仓库设置中,需启用Sonar,配置SonarQube服务器、

在Bamboo后台管理-->管理插件-->
在分支策略与拉取请求选项中,必须配置
sonar
true
jdbc:h2:tcp://localhost:9000/sonar
sonar
sonar
http://localhost:9000
admin
admin
Java项目采用SpringBoot框架搭建,使用IntelliJ IDEA开发,项目目标是:根据身高和体重计算BMI值,并给出计算结论。针对核心业务代码逻辑,我编写了部分单测用例,旨在模拟自动化测试在持续集成中的作用。

03
—
持续集成与部署Demo
在Jira看板中,选择Jira用户故事卡片,右侧将展示详情信息。在开发Panel中点击“创建分支”,在弹窗中确认代码仓库、分支类型、代码分支来源、分支名称。分支类型前缀在Bitbucket的项目或仓库的分支模型中设置,比如:feature的默认分支类型前缀为/feature,Release为/release。确认无误后,点击

此时,返回Jira看板将显示Jira用户故事自动被更新到了“处理中”,这是因为我们在Jira工作流的转换动作的触发器中设置了:当代码仓库中有新分支被创建时自动转换工作流。在开发Panel中将显示“1 branch”,点击可以查看具体的代码仓库和分支名称。在Bamboo持续集成系统中,计划分支(Plan Branch)被自动创建并成功完成第一次构建,这是因为我们在Bamboo构建计划中设置了:当代码仓库有新分支被创建时自动触发计划分支的创建。

打开Sourcetree,从Bitbucket服务器获取全部更新,并将BUDDHA-22分支代码检出到本地。打开IntelliJ IDEA开发代码,开发完成后,在Sourcetree中将修改的文件暂存所选,然后输入备注(注意:必须包含Jira编号),勾选“立即推送变更到xxx”,点击“提交”将本地代码变更推送到远程feature分支。

打开Bitbucket,确认最新代码变更已成功提交到远程分支,且自动触发了基于feature分支的计划构建。点击构建图标会弹出构建详情,点击链接后跳转到Bamboo构建页面。

在构建页面,我们可以实时看到构建进度和结果。构建结果包含了自动化测试用例执行结果(6个用例全部通过)、Sonar分析结果(质量门禁通过)、关联的Jira问题及代码提交信息、构建的输出物(共享制品)、制品部署信息、构建日志等。如果构建失败,比如:某个单元测试用例未通过,那么在测试(Tests)中将显示详细的失败用例代码。这时需要尽快修复阻碍构建成功的所有问题,否则无法将拉取请求合并到master分支。

在feature分支构建成功(通过了Sonar代码质量扫码和自动化测试)后,我们需要在Bitbucket中发起拉取请求(
使用评审人账号登录Bitbucket,将看到所有待评审的PR记录(包括评审人、Sonar检查结果和构建结果),选择BUDDHA-22拉取请求,通过Diff查看具体的代码改动,可以对每行改动添加评语,也可以针对整个PR添加评语,评审通过后点击右上角“Approve”。而代码的合并可以由PR的发起人或评审人操作,具体由团队规则决定。返回Jira看板将显示Jira用户故事自动被更新到了“完成”,这是因为我们在Jira工作流的转换动作的触发器中设置了:当拉取请求被合并到主干时自动转换工作流。

此时,切换到PR发起人账号登录Bitbucket,查看到PR状态依然是Open,点击PR右上角的Merge按钮执行代码合并,PR状态变成Merged。合并代码到master会自动触发master分支构建,如果构建成功,则会自动触发持续部署,从构建计划的产物共享制品(

构建过程产出的制品可以在其他构建项目或部署项目中共享。Bamboo自身管理制品(Artifacts),所以在构建和部署阶段所需的任何制品,Bamboo会自动传输到所需远程服务器上。一个发布版本(Release)创建自单次构建结果,发布版本是用来准确跟踪部署到某个环境中的软件包,本质上是在部署过程使用的制品和相关元数据(如:Jira问题、代码提交和测试数据)的一个快照(Snapshot),元数据可以用在发布说明和质量控制中,也可以通过元数据比较两个发布版本之间的差异。

在发布版本的部署阶段,主要做的事情是:使用

而在持续交付实践中,部署到生产环境是通过手动触发的。在Bamboo部署项目中,我们手动创建新的发布版本,需要选择计划分支及其构建结果、定义发布版本(版本号+构建ID)、自上个发布版本的所有变更(Jira问题和代码提交信息),然后将这个发布版本手动部署到生产环境中。部署成功后,各环境部署状态列表中的触发器为

04
—
写在最后
Atlassian套件从提出功能请求一直到完成部署,提供了完整的可追溯性。无论是Confluence记录每次团队对需求达成共识后的版本变更记录,还是Jira对需求过程每个细节的全面跟踪,亦或在研发过程中分支创建、代码提交、拉取请求、持续集成、发布版本(Release)创建和部署,无一不是以Jira问题(用户故事)为主线,体现了需求作为唯一受信源的原则。
在研发过程中,以代码仓库为唯一受信源,保存所有源代码的变更历史(如:产品源代码、测试代码、自动化脚本等),无论是拉取请求评审,还是持续构建亦或发布版本部署,都是围绕着提交(Commits)。 制品库也作为唯一受信源,在构建计划的Job中产生制品(Artifacts),Bamboo提供的共享制品用于在不同的构建计划之间共享,或者在不同阶段的环境中共享构建计划的制品,满足后续环节的快速取用,而无需每次重新构建,比如:从构建计划的制品创建发布版本后,如果测试环境测试通过(无法任何代码改动),那么将该发布版本直接提送(Promote)到预生产环境中测试,测试通过后,直接提送到生产环境中。所有团队都以唯一受信的需求/缺陷、源代码和构建制品仓库中内容为基准,相互沟通与协作。