训练营往期回顾:
Day Zero – 开通效率云服务 <<
Day One 之理念篇: DevOps与敏捷,用户故事地图,价值流图
Day One 之实操篇--产品规划,定制看板,生成迭代计划
Day Two -- Part1: 托管你的代码
Day Two -- Part2: 设计提交规范,代码评审规范,设计提交流水线
注: 今天的实操课程涉及到购买百度云BCC资源, 请大家提前联系讲师申请代金券
原理: 从持续集成到持续部署
开发和发布软件可能是一个复杂的过程,尤其是当应用程序,团队和部署基础架构本身变得复杂时。通常,随着项目的发展,挑战变得更加明显。为了以快速一致的方式开发,测试和发布软件,开发人员和组织需要创建了三种相关但不同的策略来管理和自动化这些过程。
持续集成的重点是每天多次将各开发人员的工作集成到主存储库中,及早捕获集成错误并加速协作开发。持续交付要减少部署或发布过程中的摩擦,自动执行部署构建所需的步骤,以便可以随时安全地发布代码。每次进行代码更改时,通过自动部署,持续部署将更进一步。
持续集成
持续集成是一种鼓励开发人员尽早并经常将其代码集成到共享代码库主干的实践。在一天的开发周期结束时,代码与每个开发人员多次集成到共享代码库中,而不是孤立地构建功能并在开发周期结束时集成它们。
这个方法试图通过尽早集成来降低成本。开发人员可以尽早发现新代码和现有代码之间的冲突,而冲突越早越相对容易协调。一旦冲突得到解决,工作可以继续保证新代码符合现有代码库的要求。
然而,经常集成代码本身并不能保证新代码或功能的质量。在许多组织中,集成是昂贵的,因为通过人工来确保代码符合标准,不会引入错误,并且不会破坏现有功能。当自动化水平与现有的质量保证措施数量不匹配时,频繁的集成会产生摩擦。
为了解决集成过程中的这种摩擦,在实操中,持续集成依赖于强大的测试套件和运行这些测试的自动化系统。当开发人员将代码合并到主存储库中时,自动化流程将启动新代码的构建。然后,针对新构建运行测试套件以检查是否引入了任何集成问题。如果构建阶段或测试阶段失败,团队将收到警报,以便修复。
持续集成的最终目标是使集成成为简单,可重复的过程,这是日常开发工作流程的一部分,以便尽早降低集成成本并对缺陷做出响应。努力确保系统健壮,自动化和快速,同时培养鼓励频繁迭代和响应构建问题的团队文化,这是战略成功的基础。
持续交付
持续交付是持续集成的延伸。它侧重于自动化软件交付流程,以便团队可以随时轻松,自信地将代码部署到生产环境中。通过确保代码库始终处于可部署状态,软件发布不再需要复杂的仪式,成了小事一桩,。团队可以确信他们可以在没有复杂协调或后期测试的情况下随时发布。与持续集成一样,持续交付是一种需要技术和组织改进相结合的实践。
在技术方面,持续交付严重依赖部署流水线来让测试和部署过程自动化。部署流水线是一种自动化系统,能够将一次构件分解成一系列的顺序阶段,并且在这些阶段中运行越来越严苛的测试套件。持续交付取决于持续集成的情况,因此可靠的持续集成设置是实现持续交付的先决条件。
在每个阶段,构建要么未通过测试,要么向团队发出警报,要么通过测试,从而导致自动进阶到下一阶段。随着构建在流水线中移动,后续阶段会将构建制品部署到与生产环境尽可能相似的镜像环境中。这样,可以同时测试构建,部署过程和环境。流水线结束时会产生一个构建制品,这样的话,当希望部署到生产环境中时便可以一步到位。
持续交付的组织方面鼓励将“可部署性”作为主要关注点的优先级。这会对构建功能的方式产生影响,并将其连接到代码库的其余部分。必须考虑到代码的设计,以便功能可以随时安全地部署到生产中,即使在不完整时也是如此。在这方面,行业已经出现了许多成熟的技术实践,比如蓝绿部署、抽象分支、制品库、金丝雀发布、暗启动、部署流水线、特型开关等。
持续交付很有吸引力,因为他可以自动化地执行从代码入库到决定是否将构建上生产环境这段过程。帮助评估代码质量和正确性的步骤是自动化的,但最终决定发布什么掌握在组织的手里,从而保留了最大的灵活性。
持续部署
持续部署是持续交付的扩展,能够自动地通过完整测试周期来部署每个构建制品。连续部署系统不会等待人来决定部署什么、何时部署,而是任何成功通过部署流水线的所有东西都会被自动部署。不过,虽然新代码被自动部署到了生产环境,但仍然有一些技术方法能够让你这之后决定是否激活新功能或者是否只对小范围用户激活新功能。自动部署会将功能和修复代码迅速推给客户,这样做不仅能够鼓励团队在有限范围内进行较小的更改,还能够有助于避免对当前部署到生产环境的内容产生混乱。
持续部署还允许组织受益于一致的早期反馈。功能可以立即提供给用户,而缺陷或无用的实现可以让团队在没有效益的方向上投入大量精力之前被感知到。尽早发现某个功能没用,团队便能尽快转移焦点,而不再将更多的能量投入到影响最小的地方。
实操: 准备持续交付制品库
1.从效率云首页进入iRepo制品库
2 点击新建制品库按钮
3 制品库名称输入“JavaDemoRepo”
4 制品库标识输入“JavaDemoRepo”
5 制品库描述输入“JavaDemoRepo”
6 点击创建按钮完成制品库创建
准备持续部署云服务器
Step 1:购买BCC云服务器
1 访问BCC首页https://console.bce.baidu.com/bcc/#/bcc/instance/list
2 点击“创建实例”按钮进入BCC服务器创建界面
3 实例最低配置如下:
*注: 请使用CENTOS系统,发布插件目前暂不支持Ubuntu系统
4 点击“下一步”按钮,进入订单确认与支付界面
特别注意:接下来的环节请特别要注意在支付之前要激活代金券,并且选择使用代金券支付。
5 点击“激活代金券”
6 输入代金券编号
7 点击“确认”按钮来激活该代金券
8 在产品类型:BCC中选择刚刚激活的代金券
9 在产品类型:CDS中选择刚刚激活的代金券
10 在产品类型:EIP中选择刚刚激活的代金券
11 点击“去支付”按钮,完成实例的购买和开通
12 随后请返回BCC首页https://console.bce.baidu.com/bcc/#/bcc/instance/list,查看实例创建情况和公网IP地址
Step 2:安装BCCDeploy客户端
1 通过ssh客户端登录BCC服务器,用户名为root,密码为创建实例时所输入的密码。Windows用户可以下载Putty等SSH软件实现远程登录
2 执行如下命令完成BCCDeploy安装:
useradd work && cd /home/work && wgethttp://sugarheap.bid.local.baidubce.com:15505/download?fileName=salt-64.tar.gz-O salt.tar.gz && tar -xzvf ./salt.tar.gz && sh ./bin/controlstart
3 查看服务运行状态,执行命令sh./bin/control status
Running说明客户端已经处于运行状态。
警告:任何导致BCC服务器sshkey发生变化的操作都将导致BCCDeploy无法重新安装启动。禁止进行如下已知的风险操作:重装BCC操作系统、使用keygen生成新key。
Step 3:安装java环境
1 运行命令yum -y install java-1.8.0-openjdk*进行Java安装
2 运行命令java -version验证Java安装情况:
Step 4:准备部署启停脚本
1 ]创建工作目录,执行如下命令:mkdir -p /javademo && cd /javademo
2 创建服务自动启动脚本,执行如下命令
cat>start.sh<
#!/bin/sh
set -e
cd /javademo/target
nohup java -jar gs-spring-boot-0.1.0.jar /dev/null & sleep 20
EOF
3 创建服务自动停止脚本,执行如下命令
cat>stop.sh<
#!/bin/sh
set -e
echo $(echo $\(pkill java\))
exit 0
EOF
4 创建自动部署目标目录,执行如下命令
mkdir -p target
5 检查创建的内容,执行如下命令: ls && cat start.sh && cat stop.sh
执行结果如下:
注意:启动脚本中的" /dev/null &sleep 20" 为BCC服务器部署的特殊要求,不得省略。sleep 20用于设定服务启动的超时时长为20秒,该时长可根据实际需要调整。
搭建持续交付、部署流水线
Step 1:创建流水线,进入iPipe首页
1 从JavaDemo代码库左侧的导航点击“持续集成”进入iPipe界面
2 点击右上角--新建流水线
Step 2:配置触发方式和监听分支
1 流水线名称输入“交付部署流水线”
2 触发方式为自动触发
3 监听分支选择精确匹配
4 分支名称为master
5 监听的消息类型为Merge,即代码合入时触发
6 点击添加按钮
Step 3:编排持续交付阶段
1 点击添加阶段按钮
2 阶段名称输入“自动交付”,我们希望在这个阶段在流水线被触发时顺序执行如下工作:
- 自动单元测试和集成测试
- 打包并上传到制品库
3 触发方式为自动
4 失败策略为快速失败
5 点击添加新任务按钮
6 选择Maven构建任务
7 点击添加按钮,我们希望在这个任务重进行自动化测试和打包,并且如果测试和打包成功,自动将打包产出上传到之前建立的制品库中。
8 命令输入:
cd complete/
mvn verify install
9 勾选上传复选框
10 产出包路径输入target
11 制品库选择此前创建的JavaDemoRepo
12 制品名称为JavaDemo
Step 4:编排持续部署阶段
在这个阶段,我们希望上一个阶段的打包产出上传部署到BCC服务器,并且自动启动服务。
1 点击添加阶段按钮
2 阶段名称为“自动部署”
3 触发方式选择自动触发
4 失败策略选择快速失败
5 点击添加新任务按钮
6 选择并双击“Bid部署”
7 执行账户为root
8 部署路径设为/javademo/
9 停止命令设为sh /javademo/stop.sh
10 启动命令设为sh /javademo/start.sh
11 部署验证选择“自动检查验证”
12 检查URL设为http://<你的BCC公网IP>:8080/
注意事项:检查URL要求返回值为{"errno":0,"info":"Ok"},这也是之前将服务代码返回值修改为这个字符串的原因。
13 点击添加服务器按钮
14 勾选之前购买的BCC服务器
15 点击确定按钮
16 点击保存按钮保存流水线
完成第一次交付和部署
Step 1:修改集成测试用例
1 打开集成测试源码文件complete/src/test/java/hello/HelloControllerIT.java,定位到第39行
2 将期望值修改为"{\"errno\":0,\"info\":\"Ok\"}",并保存
3 执行命令git diff查看变更情况
4 执行命令git commit -am "Correct obsolete integration testing return value"
5 执行命令git push origin HEAD:refs/for/master
Step 2:完成评审并合入代码,如果您实践过第二天part two的内容,里面有关于代码评审的操作记录。
Step 3:查看交付和部署执行情况
1 从代码库导航中点击持续集成链接进入流水线界面
2 稍等片刻,即可看到流水线已经执行完毕
3 点击交付流部署水线查看详情
4 自动交付阶段显示为绿色,表示执行成功,用时3分半左右,点击可展开
5 自动部署阶段也显示为绿色,表示成功,点击可展开
6 展开自动部署阶段
7 点击查看部署详情按钮,进入到百度云部署任务详情页面
8 执行情况显示计划部署1台BCC服务器,实际成功完成了1台部署,点击查看实例详情链接
9 选择我们刚刚部署的那台服务器,点击进入执行详情,查看执行日志
从日志中,你可以看到执行了“下载-停止服务-部署和备份-启动服务”的部署全程。如果您在之前购买了弹性公网地址,您可以通过输入公网地址:8080查看服务部署的最终效果:
到这里,很荣幸的告诉你,你已经成功第一次成功利用百度效率云完成了从本地代码到线上服务整个过程,迈出了内建质量、自动化测试、持续集成、持续交付、持续部署的实战的第一步!
打卡截图1: 部署流水线
打卡截图2: BCC部署成功截图