持续集成,持续交付和持续部署这几个概念已经不是什么新鲜的名词了,它们属于DevOps的一部分,相信无论互联网公司还是传统的IT企业应该都引入了这些技术来保证产品的快读迭代和产品的高质量发布,当然可能有很多小作坊式的软件公司可能不会引入这些技术,因为项目初期会投入很多开发成本和维护成本。下面我将花两篇文章来介绍我的项目中是如何实现持续集成,持续交付。因为我们的产品没法直接部署到生成环境,只能部署到测试环境,因此严格的持续部署应该没在我们的产品中实现。在介绍实现之前,先了解一下它们的概念。
持续集成
1)概念
持续集成是指软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。“持续集成”源自于极限编程(XP),是 XP 最初的 12 种实践之一。持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
2)必备要素
-
全面的自动化测试。这是实践持续集成&持续部署的基础,同时,选择合适的自动化测试工具也极其重要;
-
灵活的基础设施。容器,虚拟机的存在让开发人员和 QA 人员不必再大费周折;
-
版本控制工具。如 Git,CVS,SVN 等;
-
自动化的构建和软件发布流程的工具,如 Bamboo, Jenkins;
-
反馈机制。如构建/测试的失败,可以快速地反馈到相关负责人,以尽快解决达到一个更稳定的版本。
3)持续集成的优点
-
快速失败”,在对产品没有风险的情况下进行测试,并快速响应;
-
最大限度地减少风险,降低修复错误代码的成本;
-
将重复性的手工流程自动化,让工程师更加专注于代码;
-
保持频繁部署,快速生成可部署的软件;
-
提高项目的能见度,方便团队成员了解项目的进度和成熟度;
-
增强开发人员对软件产品的信心,帮助建立更好的工程师文化。
如何实现持续集成
开始持续集成之前,最重要的一步是需要建立合适的持续集成文化比如代码质量管控、测试文化等。这一步非常关键,如果团队成员或者项目管理者不重视持续集成,没有认识持续集成带来的好处就很难有效的在项目中推广持续集成,因为在项目初期需要花大量时间和精力来搭建持续集成系统,而且后期也需要不断的投入来维护持续集成系统。在团队中统一思想后,就可以开始选择合适的持续集成系统,当前持续集成系统分为两种,一种是搭建私有的部署,另一种是托管的持续集成系统。这两种系统的选择关键在于团队运行的基础设施,以及团队对持续集成系统的资源投入力度。
私有部署指的是将软件部署在公司的机房或内网中,需要提供多台服务器来完成 CI 系统的运转,同时需要对不同机器之间进行环境配置。比如Maven 或 Gradle 或 Jenkins ,他们的特点是自由开源,且文档支持广泛。优点在于对构建环境有完全的控制权,能够实现完全定制。但需要搭建环境和配置、维护成本高,需要买专门的机器,花费较多人力物力且更新迁移风险高;Hosted CI 指的是由 SaaS 型的 CI 服务,全程在线进行构建配置,不需要考虑装机器,装软件,环境搭建等成本。常见的有 CircleCI,Codeship 和TravisCI 等,还有国内最新的持续集成服务——flow.ci 。SaaS 型的 CI 的特点在于无需额外机器,几分钟就可以用起来。可以根据你的需要动态调度资源。省时,省心,省力。
我们的项目采用的是私有部署,依赖了公司提供的一些基础工具,比如Git,Bamboo,Artifactory,Sonarqube以及BinaryScan等工具,也使用了一些开源的工具Maven,Gradle,Nexus等来实现持续集成。使用Octopus,Docker,Plink等工具来实现持续交付。
Bamboo介绍
什么是Bamboo
Bamboo是一款持续集成的服务器,可以用来自动化管理软件发布,创建一个持续交付流程。Bamboo中的Bamboo使用了’plan’和’job’还有’tasks’这些概念来配置和组织工作流中的事件。
1)Project:
-
有一个或多个plans
-
提供project中所有plans的报告
-
提供和其他软件之间的链接
2)Plan:
-
默认有一个stage,但是可以用来将jobs分组到多个stages中
-
处理一系列在同一个代码仓库上顺序运行的stages
-
指定默认的仓库
-
指定构建如何被触发,plans之间的触发依赖条件
-
指定构建结果的通知方式
-
指定谁拥有查看和配置plan以及他的jobs的权限
-
提供plan变量的定义
3)Stage:
-
默认有一个job,也可以由多个jobs组成
-
在多个agents上,并行处理他的jobs
-
一个stage中的所有jobs执行成功之后才能执行下一个stage
-
可能生成对接下来的stage有用的制品
4)Job:
-
在一个agent上顺序处理他的一系列task
-
控制task执行的顺序
-
汇集所有task的需求,用来匹配达到相应需求的agent
-
定义了构建可能产生的制品
-
只能使用之前的stage生成的制品
-
指定构建结果和制品的标签
5)Task:
-
是一个小而具体的工作单元,比如获取源代码,执行Maven goal,运行脚本或者解析测试结果
-
在Bamboo工作目录里顺序执行
持续集成流程
1)代码提交
流程的第一步,是开发者向代码仓库提交代码。为每个feature建立一个feature branch,为bug建立bugfix branch,发布后的bug修复建立hotfix branch。如果项目使用Jira进行管理,可以在Jira上为每个feature关联创建branch。
2)代码Merge
当代码通过单元测试,可以发起PULL Request,进行代码Review,如果通过了Code Review,可以进行Code merge到Dev branch上,并触发Bamboo build。
3)Unit Test
在Java中使用JUnit或者TestNG编写单元测试用例,主要对function进行测试,具体可以参考我的另一篇关于TestNG开发测试用例的文章。
4)设置版本号
使用Maven提供的设置版本功能来实现自动生成版本号,我的策略是在Bamboo中设置变量来作为大版本号和小版本号,并以bamboo build号结尾,比如大版本设置1.1,小版本号设为1,buildno为100,则最后生成的版本号为1.1.1.100。具体生成版本号的方法命令如下:
mvn -U versions:set -DnewVersion=${arg_version} -f parent/pom.xml
其中,arg_version可以通过bamboo 的命令参数传入,parent/pom.xml文件中定义了版本号,如果你的包中包括了很多的jar包,可以将其他jar包的版本号都统一引用parent/pom.xml,这样就能实现对所有的jar包统一设置版本号。
5)代码混淆和代码签名
同样可以使用Maven提供的代码混淆和代码签名功能,在Bamboo中自动完成代码混淆和签名,具体如何配置代码签名和代码混淆请参考网上的Maven实例,都是通过在pom.XML中进行配置,然后运行如下命令:
mvn -U install -Pobfuscate,sign
6)静态代码检查
使用Sonarqube实现静态代码扫描,SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误,它的功能如下:
-
支持包括java,C#,C/C++等二十几种编程语言的代码质量管理与检测
-
在代码审计融入到软件项目的持续开发过程中,自动生成高质量的检测报告,无需人工干预,提高了软件开发效率;
-
SonarQube以插件的形式可以集成众多的检测工具。检测工具的更新升级,不会影响到正常的软件开发流程;我们在Java项目中使用了Sonarqube进行了静态代码扫描,步骤如下:
1)设置全局的Sonaarqube server
编辑位于MAVEN_HOME/conf or ~/.m2下的settings.xml文件
<settings>
<pluginGroups>
<pluginGroup>org.sonarsource.scanner.maven</pluginGroup>
</pluginGroups>
<profiles>
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- Optional URL to server. Default value is http://localhost:9000 -->
<sonar.host.url>https://sonarqube.XXX.com</sonar.host.url>
</properties>
</profile>
</profiles>
</settings>
2)在pomx.xml中配置分析参数
在Pom.xml中配置Sonarqube 分析参数,分析参数可以参考SonarQube的参数页。简单的参数配置如下:
<properties>
<sonar.projectKey>myprojectkey</sonar.projectKey>
<sonar.projectName>myprojectname</sonar.projectName>
<sonar.login>ec412b089150086562333a6c9c1dd886204122b8</sonar.login>
<sonar.password></sonar.password>
</properties>
其中projectkey和projectname是在SonarqubeServer创建的项目,把这些信息填入即可,用户名和密码是登陆sonarqube server的登录名和密码。
3)分析Sonar项目
使用Maven的sonar命令来分析Sonar项目
maven command
mvn clean verify sonar:sonar
# In some situation you may want to run sonar:sonar goal as a dedicated step. Be sure to use install as first step for multi-module projects
mvn clean install
mvn sonar:sonar
# Specify the version of sonar-maven-plugin instead of using the latest. See also 'How to Fix Version of Maven Plugin' below.
mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.4.1.1170:sonar
4)查看分析报告
可以访问sonarqube server的网站来查看项目的分析报告,比如https://sonarqube.XXX.com?id=myproject来查看项目的分析报告。
网友评论