作者:曹睿
一、概述
在互联网高速发展的背景下,产品的先发优势被互联网加倍放大,业务需求变化频繁,创新步伐越来越快,导致研发效能被越来越多企业放到极其重要的位置,为了适应日益激烈的业务竞争,必须快速响应需求,缩短软件产品的研发周期。
近些年,软件工程领域提出了敏捷开发等思想和方法,尝试将传统瀑布式的长周期开发方式向短周期、灵活的方式进化,满足产品交付速度加快的需要。这些理论中重要的实践CI/CD成为解决软件产品快速交付问题的有效方法之一。
另一方面,伴随着云计算技术的发展,我行正通过引入当前流行的PaaS先进理念,寻求解决当前研发运维中各环节存在的一些突出问题的新方法和新思路。PaaS以应用系统为中心,实现了对应用系统开发、测试、运维一体化全流程的支持。基于PaaS可以快速提供容器化的CI/CD服务,用以支撑应用快速迭代部署上线,帮助快速交付应用。
本文基于PaaS总结并提出了基于TFS+Jenkins的CI/CD解决方案,使开发过程能够快速集成,并最终实现持续交付的能力。
二、CI/CD方案
CI/CD是一种类似工厂生产流水线式的软件工程实践。通常情况下,至少应包含代码管理、自动构建、自动部署、构建验证测试等环节。
2.1 代码管理
代码管理环节要求实施持续集成时保证源码保存位置的统一。项目的所有源文件都应存放在代码管理工具中,通过源代码管理工具可以方便地追溯代码历史版本,使开发者能轻松获取代码,通过设定项目人员角色更好地控制代码安全性。
业界有集中式源代码管理工具和分布式源代码管理工具。常用的集中式源代码管理工具有FireFly、SVN等,分布式源代码管理工具有Git等。
2.2 自动构建
自动化构建环节指代码能够随时检出,通过自动化构建工具转化为部署包的过程。应用开发过程中需选择一个优秀的构建工具,当源代码发生更改或每天定时触发自动构建,另外还可以通过手动的方式进行自动构建。这些工作通常情况下釆用成熟的构建工具完成,如在Java开发环境中的Maven、Ant工具等。
2.3 构建验证测试
构建验证测试分为两大类:单元测试和功能测试。单元测试由幵发人员编写,通常测试对象为一组类。功能测试由测试人员依赖产品需求说明编写,通过测试用例脚本完成对系统的测试。上述两种测试均应尽量提高测试自动化的水平。
常用的自动化单元测试工具有JUnit,功能测试工具有ATP等。利用JUnit可以快速进行单元测试、运行单元测试套件。ATP是我行自主研发的,用于支持自动化测试的软件平台。
三、PaaS平台CI/CD实践
我行使用TFS作为主要工具,串联了代码合规检查、安全检查、Jenkins、自动化测试工具等来实现CI/CD。本文PaaS平台基于红帽OpenShift搭建,Jenkins容器化部署于PaaS。在TFS中进行Jenkins连接信息、代码合规检查、安全检查、自动化测试等配置,通过TFS触发Jenkins实现应用在PaaS的CI/CD:
1.TFS配置合规检查、安全检查、Jenkins连接信息(Jenkins URL、用户名、密码等连接信息)、Jenkins触发方式(以手工触发或者定时触发等方式触发Jenkins进行CI/CD)等;
2.开发人员编写好代码后,提交代码到源代码仓库中,本文使用TFS作为源码仓库。TFS采用Git方式建立相关项目代码库;
3.TFS调起代码合规检查、安全检查,以及Jenkins进行CI/CD;
4.Jenkins从源代码仓库将源码下载下来,下载到代码后进行单元测试,并将生成的单元测试结果发送到TFS服务器的相关目录供TFS获取并展示;
5.Jenkins对应用进行构建,生成应用安装包文件(jar或war);
6.结合应用基础镜像和应用安装包文件(jar或war),构建出应用镜像;
7.应用镜像构建成功后,将应用镜像推送至应用镜像仓库中进行集中管理;
8.将应用部署镜像至集成测试环境PaaS。PaaS根据应用部署YAML文件,从镜像仓库中拉取相应的应用镜像,将应用部署OpenShift;
9.展示CI/CD执行日志。在TFS中,能实时查看到Jenkins作业运行状态报告相关的日志信息。
10.应用部署完成后,TFS调起自动化测试平台进行相关自动化测试。
3.1 Jenkins部署
Jenkins是使用最多的一个持续集成工具之一,是基于Java开发的开源项目,配置简单,跨操作系统兼容能力较好,可以实施的全程监控中的过程,提供详细的日志文件和邮件提醒,持续集成结果可以以图表的方式展现,支持插件化,可用的开源插件较多资源丰富,功能较为强大。
Jenkins是主从式结构,主要由两部分构成:
- 一部分是Master,提供web界面让用户管理Slave、实时监控和报告构建的状态且生成最终的结果;
- 另一部分是独立运行的Slave,用来负责构建。一个Master可以关联多个Slave。
本文Jenkins部署架构如下图所示,Jenkins master和slave部署在PaaS开发测试云环境中,运行在容器中:
通过OpenShift的Template进行Jenkins部署,Jenkins Slave在进行CI/CD时动态创建,完成CI/CD任务后将自动销毁。
3.2 TFS配置
本文通过TFS联动Jenkins上已配置好的Pipeline,完成了应用在PaaS上的自动构建和自动部署。
3.2.1 创建生成定义
通过浏览器访问TFS里的项目主页,在“版本和发布”中,选择生成定义模板界面,创建“空”的生成定义,然后填写作业名称:
3.2.2 Jenkins作业配置
在获取源中,存储库的下拉列表中选择要进行CI/CD的项目,在Branch下拉列表中选择要构建的分支。点击页面左边的添加任务,选择”Jenkins on openshift queue job”队列作业。
在页面左边的排队Queue Jenkins job作业,输入显示名称,然后点击Generic service connection服务终结点后的管理按钮进行Jenkins相关信息配置,包括Jenkins连接名称、服务器URL、用户名、密码(密码为PaaS中用户token)等信息:
回到排列 Queue Jenkins job: test配置页面,在页面右边的Generic service connection服务终结点下拉列表中选择上一步配置的JENKINS_PAAS。并在作业名称中输入Jenkins中已经配置好的任务:
3.3 Jenkins配置
3.3.1 配置Jenkins Agent
使用管理员用户登录Jenkins,在系统管理-〉系统设置中修改使用的Jenkins agent镜像:
3.3.2 创建视图
使用管理员用户登录jenkins,点击页面上方的+:
然后输入视图名字,选择List View,即可创建视图。
3.3.3 创建任务
使用管理员用户登录jenkins,选择上一节中创建的视图再点击新建,输入任务名称,选择Pipeline,勾选添加到当前视图前的复选框,然后点击OK:
3.3.4 配置项目管理员权限
使用组织级配置管理员用户登录jenkins,选择系统管理->全局安全配置->项目矩阵授权策略,点击“用户名-view”最后的x,删除该用户:
使用组织级管理员用户登录jenkins,选择上面创建的Pipeline的用户权限:
3.4 Pipeline配置
3.4.1 配置Credential
Credential用于配置TFS代码库的用户名、密码信息。使用应用管理员用户登录jenkins,选择“系统管理”-->“Configure Credentials”,选择“Add Credentials”,创建Credentials:
3.4.2 配置项目Pipeline
使用应用用户登录jenkins,点击上面创建的pipeline,点击“配置”,在pipeline>
<code>def
app_name = '应用名称''
def
service_name = "${app_name}"
def
dev_project_name = '应用在ocp中所在的project'
def
base_image = '基础镜像名称'
def
tfs_credentialsId = 'CredentialID'
def
tfs_url = '代码库URL'
def
tfs_branch = "TFS Git代码库分支名"
def
tfs_tag = "TFS Git代码库标签"
def
version, mvnCmd = 'mvn '
pipeline
{
agent
{
label
'maven'
}
stages
{
Package') {
steps
{
......
//下载应用代码
}
}
Test') {
steps
{
......
//进行单元测试
}
}
Package') {
steps
{
//构建应用部署包
}
}
Image Builder') {
steps
{
//配置构建镜像信息
}
}
Image') {
steps
{
//构建应用镜像
}
}
DEV') {
steps
{
//部署应用镜像
}
}
}
/<code>
3.4.3 执行Pipeline
使用应用用户登录jenkins,选择上面创建的Pipeline,点击立即构建:
- 使用应用用户登录jenkins;
- 选择上面创建的Pipeline;
- 选择左下角构建历史中一个版本信息;
- 选择“Console Output”,即可查看构建详细日志。
四、总结
CI/CD被视为敏捷软件开发的奠基石,体现出了如下优点:
- 自动化流水线操作带来了高效;
- 通过持续交付实现了持续集成生成的程序包随时可部署;
- 极大程度避免手工操作带来的错误;
- 可以快速迭代版本,一定程度上缩减了开发周期。
基于PaaS平台的CI/CD方案通过镜像能快速创建持续集成环境,简化持续集成的环境搭建过程,快速地实现代码构建、构建验证测试、自动部署,以及生成执行结果的报告等,使得产品能够快速迭代的同时,尽可能保持较高质量。