本文作者:HelloDeveloper
原理
开发和发布软件可能是一个复杂的过程,尤其是当应用程序,团队和部署基础架构本身变得复杂时。通常,随着项目的发展,挑战变得更加明显。为了以快速一致的方式开发,测试和发布软件,开发人员和组织需要创建了三种相关但不同的策略来管理和自动化这些过程。
持续集成的重点是每天多次将各开发人员的工作集成到主存储库中,及早捕获集成错误并加速协作开发。持续交付要减少部署或发布过程中的摩擦,自动执行部署构建所需的步骤,以便可以随时安全地发布代码。每次进行代码更改时,通过自动部署,持续部署将更进一步。
持续集成
持续集成是一种鼓励开发人员尽早并经常将其代码集成到共享代码库主干的实践。在一天的开发周期结束时,代码与每个开发人员多次集成到共享代码库中,而不是孤立地构建功能并在开发周期结束时集成它们。
这个方法试图通过尽早集成来降低成本。开发人员可以尽早发现新代码和现有代码之间的冲突,而冲突越早越相对容易协调。一旦冲突得到解决,工作可以继续保证新代码符合现有代码库的要求。
然而,经常集成代码本身并不能保证新代码或功能的质量。在许多组织中,集成是昂贵的,因为通过人工来确保代码符合标准,不会引入错误,并且不会破坏现有功能。当自动化水平与现有的质量保证措施数量不匹配时,频繁的集成会产生摩擦。
为了解决集成过程中的这种摩擦,在实操中,持续集成依赖于强大的测试套件和运行这些测试的自动化系统。当开发人员将代码合并到主存储库中时,自动化流程将启动新代码的构建。然后,针对新构建运行测试套件以检查是否引入了任何集成问题。如果构建阶段或测试阶段失败,团队将收到警报,以便修复。
持续集成的最终目标是使集成成为简单,可重复的过程,这是日常开发工作流程的一部分,以便尽早降低集成成本并对缺陷做出响应。努力确保系统健壮,自动化和快速,同时培养鼓励频繁迭代和响应构建问题的团队文化,这是战略成功的基础。
持续交付
持续交付是持续集成的延伸。它侧重于自动化软件交付流程,以便团队可以随时轻松,自信地将代码部署到生产环境中。通过确保代码库始终处于可部署状态,软件发布不再需要复杂的仪式,成了小事一桩,。团队可以确信他们可以在没有复杂协调或后期测试的情况下随时发布。与持续集成一样,持续交付是一种需要技术和组织改进相结合的实践。
在技术方面,持续交付严重依赖部署流水线来让测试和部署过程自动化。部署流水线是一种自动化系统,能够将一次构件分解成一系列的顺序阶段,并且在这些阶段中运行越来越严苛的测试套件。持续交付取决于持续集成的情况,因此可靠的持续集成设置是实现持续交付的先决条件。
在每个阶段,构建要么未通过测试,要么向团队发出警报,要么通过测试,从而导致自动进阶到下一阶段。随着构建在流水线中移动,后续阶段会将构建制品部署到与生产环境尽可能相似的镜像环境中。这样,可以同时测试构建,部署过程和环境。流水线结束时会产生一个构建制品,这样的话,当希望部署到生产环境中时便可以一步到位。
持续交付的组织方面鼓励将“可部署性”作为主要关注点的优先级。这会对构建功能的方式产生影响,并将其连接到代码库的其余部分。必须考虑到代码的设计,以便功能可以随时安全地部署到生产中,即使在不完整时也是如此。在这方面,行业已经出现了许多成熟的技术实践,比如蓝绿部署、抽象分支、制品库、金丝雀发布、暗启动、部署流水线、特型开关等。
持续交付很有吸引力,因为他可以自动化地执行从代码入库到决定是否将构建上生产环境这段过程。帮助评估代码质量和正确性的步骤是自动化的,但最终决定发布什么掌握在组织的手里,从而保留了最大的灵活性。
持续部署
持续部署是持续交付的扩展,能够自动地通过完整测试周期来部署每个构建制品。连续部署系统不会等待人来决定部署什么、何时部署,而是任何成功通过部署流水线的所有东西都会被自动部署。不过,虽然新代码被自动部署到了生产环境,但仍然有一些技术方法能够让你这之后决定是否激活新功能或者是否只对小范围用户激活新功能。自动部署会将功能和修复代码迅速推给客户,这样做不仅能够鼓励团队在有限范围内进行较小的更改,还能够有助于避免对当前部署到生产环境的内容产生混乱。
持续部署还允许组织受益于一致的早期反馈。功能可以立即提供给用户,而缺陷或无用的实现可以让团队在没有效益的方向上投入大量精力之前被感知到。尽早发现某个功能没用,团队便能尽快转移焦点,而不再将更多的能量投入到影响最小的地方。
实验部分:
今天的实验的部署任务涉及到百度云BCC服务器的采购,对于想尝试把服务发布到线上并查看效果的同学,可以自行购买BCC服务器;百度智能云首页上有各种优惠活动可以参加:
https://cloud.baidu.com/campaign/PromotionActivity/index.html
对于暂时没有尝试购买BCC服务器的同学,可完成本场景的前三个Chapter,实现持续交付的环节;
Chapter1: 准备持续交付制品库
- 从项目的组件卡片进入iRepo制品库
- 点击新建制品库按钮
- 制品库名称输入“JavaDemoRepo”
- 制品库标识输入“javademorepo”
- 制品库描述输入“repo for java demo code”
- 点击创建按钮完成制品库创建
Chapter2: 配置一条持续发布流水线:
Step 1:创建一条新的流水线
从iPipe的入口新建一条流水线,起名叫做”持续部署流水线”
Step2: 配置流水线的消息监听方式
- 流水线名称输入“持续部署流水线”,我们希望完成评审的变更被合并到master分支时能够自动触发交付和部署任务,因此
- 触发方式为自动触发
- 监听分支选择精确匹配
- 分支名称为master
- 监听的消息类型为Merge,即代码合入时触发
- 点击添加按钮
Step3: 编排持续交付阶段的任务
- 阶段名称输入“持续交付”,我们希望在这个阶段在流水线被触发时顺序执行如下工作:
- 构建并执行单元测试
- 打包并上传到制品库
- 触发方式为自动
- 失败策略为快速失败
- 点击添加新任务按钮
- 选择Maven构建任务
- 点击添加按钮,我们希望在这个任务重进行自动化测试和打包,并且如果测试和打包成功,自动将打包产出上传到之前建立的制品库中。
- 命令输入:
mvn clean install package
set -x
mkdir output
mv ./target/spring-jsp-static-resource-0.0.1-SNAPSHOT.war ./output/
- 勾选”制品打包上传”复选框
- 产出包路径输入target
- 制品库选择此前创建的JavaDemoRepo
- 制品名称为: spring-jsp-static-resource-0.0.1-SNAPSHOT.war
- 再添加一个串行的任务,选择”发布”这个插件的功能是给相应代码库打一个tag,标记为一个可以作为发布的版本:
- 添加完成后,点击确认,完成流水线的配置工作
小结:
到目前为止,配合上一个实验中配置的change流水线,我们实现了这样一个场景:
- 在代码push到主干的时候,效率云在云端执行构建,单元测试,静态代码检查工作
- 流水线执行成功后由人工进行代码review,review通过后代码正式合入代码库
- 此时触发第二条流水线,执行构建,并将构建结果保存到制品库中供下游使用
到此为止,我们实现了最简单的持续交付场景,但还不能算真正的持续部署,为了实现这个目标,我们需要采购线上服务器:
Chapter3:准备持续部署云服务器
Step 1:购买BCC云服务器
- 访问BCC首页https://console.bce.baidu.com/bcc/#/bcc/instance/list
- 点击“创建实例”按钮进入BCC服务器创建界面
- 实例最低配置如下:
注意:此处列出了本次训练营推荐的实例配置,如果您选择了其他配置,可能会导致额外费用的产生
- 完成支付后即可开通服务
- 随后请返回BCC首页https://console.bce.baidu.com/bcc/#/bcc/instance/list,查看实例创建情况和公网IP地址
Step 2:安装BCCDeploy客户端
- 通过ssh客户端登录BCC服务器,用户名为root,密码为创建实例时所输入的密码。
- 执行如下命令完成BCCDeploy安装:
useradd work && cd /home/work && wget
http://sugarheap.bid.local.baidubce.com:15505/download?fileName=salt-64.tar.gz -O salt.tar.gz && tar -xzvf ./salt.tar.gz && sh ./bin/control start
- 查看服务运行状态,执行命令sh ./bin/control status
Running说明客户端已经处于运行状态。
警告:任何导致BCC服务器sshkey发生变化的操作都将导致BCCDeploy无法重新安装启动。禁止进行如下已知的风险操作:重装BCC操作系统、使用keygen生成新key。
Step 3:安装java环境
- 运行命令yum -y install java-1.8.0-openjdk*进行Java安装
- 运行命令java -version验证Java安装情况:
Step 3:准备部署启停脚本
- 创建工作目录,执行如下命令
mkdir -p /javademo && cd /javademo
- 创建服务自动启动脚本,执行如下命令
cat>start.sh<<EOF
#!/bin/sh
set -e
cd /javademo/target
nohup java -jar gs-spring-boot-0.1.0.jar </dev/null &>/dev/null & sleep 20
EOF
- 创建服务自动停止脚本,执行如下命令
cat>stop.sh<<EOF
#!/bin/sh
set -e
echo $(echo $\(pkill java\))
exit 0
EOF
- 创建自动部署目标目录,执行如下命令
mkdir -p target
- 检查创建的内容,执行如下命令
ls && cat start.sh && cat stop.sh
执行结果如下:
注意:启动脚本中的xxx </dev/null &>/dev/null & sleep 20为BCC服务器部署的特殊要求,不得省略。sleep 20用于设定服务启动的超时时长为20秒,该时长可根据实际需要调整。
Step 4:增加一个持续部署阶段
在这个阶段,我们希望上一个阶段的打包产出上传部署到BCC服务器,并且自动启动服务。现在回到Chapter3里我们配置的”持续部署流水线”上,点击ipipe,在框图所示的下拉菜单中找到刚才配置好的持续部署流水线
- 点击添加阶段按钮
- 阶段名称为“自动部署”
- 触发方式选择自动触发
- 失败策略选择快速失败
- 点击添加新任务按钮
- 选择并双击“Bid部署”
- 执行账户为root
- 部署路径设为/javademo/
- 停止命令设为sh /javademo/stop.sh
- 启动命令设为sh /javademo/start.sh
- 部署验证选择“自动检查验证”
- 检查URL设为http://<你的EIP地址>:8080/
- 点击添加服务器按钮
- 勾选之前购买的BCC服务器
- 点击确定按钮
- 点击保存按钮保存流水线
Chapter4: 完成第一次交付和部署
Step1:提交一次代码,完成代码评审
在这里有一个快捷方法,即在提交规则里关闭”禁止发起人自己+2”选项,在这一章节,我们重点关注的是服务的发布过程;在正式的开发场景中,我们不推荐这样做
Step2: 观察持续部署流水线的执行
- 等待change流水线执行完毕,代码合入;之后观察持续部署流水线的执行
- 稍等片刻,即可看到流水线已经执行完毕
- 点击交付流部署水线查看详情
- 自动交付阶段显示为绿色,表示执行成功,用时3分半左右,点击可展开
- 自动部署阶段也显示为绿色,表示成功,点击可展开
- 展开自动部署阶段
- 点击查看部署详情按钮,进入到百度云部署任务详情页面
- 执行情况显示计划部署1台BCC服务器,实际成功完成了1台部署,点击查看实力详情链接
- 选择我们刚刚部署的那台服务器,点击进入执行详情,查看执行日志
从日志中,你可以看到执行了“下载-停止服务-部署和备份-启动服务”的部署全程。
到这里,很荣幸的告诉你,你已经成功第一次成功利用百度效率云完成了从本地代码到线上服务整个过程,迈出了内建质量、自动化测试、持续集成、持续交付、持续部署的实战的第一步
原文链接地址:https://developer.baidu.com/topic/show/290560
来源:oschina
链接:https://my.oschina.net/u/4299156/blog/3218834