热门标签: Docker Rancher Windows Server容器 存储 容器

【Rancher企业容器云平台】基于Docker的构建流程 (第一部分) - 持续集成及测试(下)


Usman Ismail, Bilal Sheikh (Rancher labs)

译者:雷伟VivianLei(Cloudsoar云舒网络)



通过Docker和Jenkins进行持续集成(CI)


现在我们将为示例应用创建持续集成(CI)流程。首先,我们先花一部分时间讨论如何进行代码分支。


1. 分支模型

在自动化持续集成中,需要重点考虑的是开发模型和团队。开发模型通常取决于团队如何使用版本控制系统。因为我们的应用托管在git仓库中,所以使用git-flow模型,这种方式也很常用。

git-flow模型中维护两种分支:开发(develop)分支和主(master)分支。当加入一个新功能时,从开发分支中创建一个新的分支,当开发完成,将合并回开发分支。所有的功能分支由开发人员单独管理,一旦代码被提交到开发分支,CI(持续集成)服务器将负责编译,通过自动化测试,并提供一个服务器用于QA测试及评审。一旦需要发布版本,将开发分支合并到主分支中,本次合并提交会有一个版本号并打标签(tag),被标签的发布版本可用于Beta版本、模拟环境、或生产环境中。


以下,我们将用gitflow工具管理git分支。安装git-flow,按此说明即可。安装好后,如下所示,运行git flow init来配置git仓库,过程中提示问题选择默认即可。当执行git-flow命令时,它将创建一个开发分支(如果不存在的话),并将此作为当前工作分支。

现在通过命令git flow feature start [feature-name]来创建一个新的功能,通常以ticket/issue id作为功能名。比如,如果你在用Jira,且已有一个ticket,ticket ID(如 MSP-123)可以作为功能名。当通过git-flow创建一个新的功能时,将会自动切换到此功能分支。

此时,你可以开发此新功能,然后运行自动化测试保证功能完成。更新README文件,通过运行 命令git flow feature finish MSP-123,即可完成新功能开发过程。

注:git flow会将此功能合并到开发分支中,并删除此功能分支,将当前工作环境切换到开发分支。

  

   此时你可将开发分支提交到远程仓库中(命令git push origin develop:develop)。当提交时,CI持续集成服务器将启动持续集成流程。

    注:对大型项目而言,步骤会有所不同,一般是先评审代码,将远程代码合入开发分支后,再将开发分支提交到远程仓库。


2. 用Jenkins创建CI流程


本节我们假设你已将Jenkins集群运行起来了。如果没有,可以阅读此文章完成设置。除此之外,还需要安装如下插件和依赖:

    •       Jenkins Plugins

                ◦       Build Pipeline Plugin

                ◦       Copy Artifact Plugin

                ◦       Parameterized Trigger Plugin

                ◦       Git Parameter Plugin

                ◦       Mask Password Plugin

    •       Docker 1.7+

    •       Docker Compose

 

安装好后,我们将进行构建流程的前三个主要任务:编译,打包,集成测试。这也是持续集成,持续部署的首要工作。


任务1:构建 go-auth服务


首先,确保代码是代码控制库上最新的。

为示例工程进行配置过程:选择“New Item”(新建)->”Freestyle project”( 构建一个自由风格的软件项目),选中“This build is parameterized”(参数化构建过程)来添加“Git Parameter”,如下图所示:

名字设为“GO_AUTH_VERSION”,“tag filter”标签过滤设置为“v*”(如 v2.0),“Default value”可设置为开发分支(develop)。

本页面其他设置见以下描述:

源码管理部分:在“Source Code Management” 中添加https://github.com/usmanismail/go-messenger.git 作为仓库链接,配置“Branches to build”为“*/develop”,设置触发器poll间隔,如 5分钟。Jenkins将跟踪开发分支的任务改变,并触发持续集成CI(和持续部署CD) 流程的第一个任务。

构建部分:在“Build(构建)”配置中,选择“Add Build Step”> “Execute Shell”,并拷贝前面所提到的docker run命令。此步骤将从github上获取最新代码,并将代码编译成go-auth可执行文件。

构建后操作:还需要添加两个“post-build”步骤,选择“Archive the Artifacts”归档go-auth二进制,“Trigger parameterized builds” 启动此流程的下一步工作,如下所示。当添加“Trigger parameterized builds”时,确保从“Add Parameters”中选中了“Current build parameters”,此设置将使本阶段的所有设置(如GO_AUTH_VERSION)同样应用于下一阶段。

构建任务的日志输出如下所示。我们用了一个docker化的容器在运行本次构建:先用go fmt格式标准化代码,后运行单元测试,如有编译错误或者测试错误,Jenkins将检测到此错误。此外,你还可以配置email或集成即时通讯工具(如hipchat, slack)来通知团队人员,以便及时修复问题。


任务2:  打包Go Auth


当编译好代码后,需要将其打包到docker容器中。选择“New Item > Freestyle Project ”, 此任务命名与上一任务匹配。如上所述,本任务也将选中“The build is parameterized”,并设置参数“GO_AUTH_VERSION ”,如下所示。

如之前在源码部分配置Github工程一样,本任务中添加一个构建步骤来执行shell。

因为需要上一步骤编译的二进制来构建docker容器,我们添加了一个构建步骤,用于从上一步构建中拷贝数据。注意:我们用“GO_AUTH_VERSION”参数来标签(tag)此镜像。开发分支的任何改变,默认将会构建 usman/go-auth:develop,并更新已有镜像。

 


任务3: 运行集成测试


本节我们用上面的docker compose模版来生成多容器的测试环境,并进行集成测试。最后,我们用shell脚本运行HTTP查询,如下:更改目录到go-auth,再运行integration-test.sh。

integration-test.sh脚本内容在此。此工作的日志输出类似于如下打印,过程如下:启动数据库容器,并将其连接到goauth容器中;如连接正常,将会看到“Pass:…”之类的输出;测试运行完成,将清理环境并删除数据库及goauth容器。

以上三个任务,在Jenkins视图页面中,选择标签“+”,你将会新建一个构建流程视图,在弹出的配置页面中,选择编译/构建任务作为启示任务,并选择确定。将会很直观的看到每个提交经过构建/部署的完整工作流程。

当你在开发分支上有所更改时,Jenkins将会被自动触发。

回顾以上步骤:

1.    用git-flow添加新功能,并合并到开发分支中;

2.    跟踪开发分支的变化,并在集中管理环境中构建系统;

3.    将上一步骤所生成的应用打包成一个docker容器;

4.    用docker compose 部署临时测试环境;

5.    进行集成测试,并清理环境;

 

以上CI流程,每当一个新功能(或是bug修复)合入开发分支时,以上过程便会自动执行,并生成“usman/go-auth:develop” 的docker镜像。下一步我们会有一系列文章描述集成部署。

总结

本文中我们讲述了如何将Docker应用到CI中,以达到集中管理、可测试、可重复性、隔离性(不同组件的环境依赖)等要求。基于Docker进行构建和部署流程的后续部分,下周我们将展示如何用rancher来部署一个完整的服务环境,对大规模项目而言,我们也将提供如何配置长期测试环境的最佳实践。

如需了解Rancher,请注册Rancher beta版,同时,你也能下载本文的电子书

(网址:http://www.cloudsoar.com/down/ddoc/v1.1/


温馨提示:

云舒网络携手Rancher Labs推出【Rancher | 实战群】,在线为您分享Docker技术干货,更有往期回顾精选期刊等你拿!

本群汇集了Rancher中国最强技术精英团队及业内技术派高人,宗旨是为了大家拥有更专业的平台交流Rancher实战技术,实时与Rancher创始团队面对面!同时欢迎各位分享自己的经验、疑难问题,我们将定期邀请分享嘉宾做各类话题分享及回顾,共同实践研究Docker容器生态圈。
对Rancher和Docker技术感兴趣、或对本文中细节需继续探讨的朋友,欢迎加入本群参与讨论!

加群方法:1.关注【云舒网络】公众号2.留言”我要加群“


    

云舒网络官方微信二维码