微服务因为船小好调头, 可以很方便快速地更新升级, 所以它才会大行其道
理论篇
从持续集成到持续交付, 工程师一直在下面这个循环里周而复始, 目的无非一个 -- 尽可能快速地交付有价值的产品给用户.
反模式
- 不到最后一刻, 没人知道软件产品最终长成什么样, 功能是否满足要求, 性能是否理想
- 软件开发过程中是不能交付的, 正在开发的的功能存在于代码库的一个单独的分支中, 直到经过很多测试才能合并到主分支中, 并发布产品包, 由运维人员最终部署到产品线上
正模式
- 每次提交都在主分支上, 都会触发系统构建并运行一系列全自动化测试, 一旦通过即部署到 alpha/beta 站点上, 由产品负责人负责验收, 决定是否部署到产品环境中
- 由 Feature toggle 来控制是否正式开放给全部或部分客户使用, 在正式发布产品之前, 会开放给一部分内部用户体验, 根据用户反馈, 功能和性能测试结果决定是否开放给外部客户
从持续集成到持续交付
持续集成(CI)是一种开发实践,是指开发人员每天多次将代码整合到共享的代码库中, 然后通过自动化构建验证每次提交,使团队能够及早发现问题。
My CI FlowMartin Fowler 总结了持续集成的几条最佳实践
- 维护单一代码库
- 自动化构建
- 使构建能够自我测试
- 每个人都可每天多次提交到主线
- 每一个提交都应该在集成机器上构建主分支
- 立即修复破碎的构建
- 保持构建速度
- 在生产环境相同的产品环境中测试
- 任何人都要以轻松获得最新的可执行文件
- 每个人都可以看到发生了什么
- 自动部署
而持续续交付(CD)是指通过自动化在比较短的一个个迭代中快速发布软件的做法,允许团队更频繁地交付可以工作的软件产品。 其重点--持续整合,内置测试,持续监控和分析反馈都指向软件行业的整体趋势:提高应变能力。持续交付是持续集成的扩展和目标
如果你的测试持续在运行,并且你充分信任您的测试可以提供足够的质量保证,这样你就可以在任何时候发布软件产品。 持续交付并不总是意味着交付,它代表了一种哲学和承诺,确保您的代码始终处于发布就绪状态。
我在两年前做的一个项目中画的持续交付的流程图:
CD来自微软的序列图
CD from Microsoft
每次构建,分析,测试和部署都必须有详细的记录和报告,有利于追溯,分析和改进持续交付的流程
工具篇
Jenkins
现在的持续集成工具中, jenkins 是事实上的标准, 尤其它的 pipeline 插件已经定义了这些标准过程
https://hub.docker.com/_/jenkins/
让我们利用 Docker 先来构建一个 Jenkins
- Dockerfile
FROM jenkins:2.46.3
MAINTAINER Walter Fan
USER root
RUN mkdir /var/log/jenkins
RUN mkdir /var/cache/jenkins
RUN chown -R jenkins:jenkins /var/log/jenkins
RUN chown -R jenkins:jenkins /var/cache/jenkins
USER jenkins
ENV JAVA_OPTS="-Xmx1596m"
- 构建 jenkins docker image
docker build -t jenkins-image .
- 启动 jenkins 容器
docker run --restart always -v /workspace/jenkins:/var/jenkins_home -p 8080:8080 -p 50000:50000 --name=jenkins-container -d jenkins-image
Jenkins 非常强大, 使用方法也很庞杂,这里不做赘述, 另外再做详述. 重点谈谈它的 Pipeline 插件.
我们说的部署流水线, 主要就是通过它来完成的, 步骤如下
- 配置代码仓库
Branch Sources 无非就是 git 或 svn 的代码仓库地址, 用户名和密码, 分支名
- 定义配置文件
Build Configuration : Jenkinsfile
image.pngJenkinsfile是重点, 它包含了大多数流水线的设置. 其他的没有什么之处
流水线提供一系列可扩展的工具, 以 流水线领域专用语言(Pipeline DSL) 代码描述了从简单到复杂的交付流程
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'make'
}
}
stage('Test'){
steps {
sh 'make check'
junit 'reports/**/*.xml'
}
}
stage('Deploy') {
steps {
sh 'make publish'
}
}
}
其他利器
docker
应用程序发布 docker image ,直接部署 docker image,可以省去大量环境配置
sonar
代码静态检查之利器,还有非java语言的 cppcheck,lint, pylint 等等
EKL
Elastic Search, Kibana, Logstash 服务器Log 收集和分析三件宝
参考资料
- 微软的持续集成与集成交付: https://docs.microsoft.com/en-us/aspnet/aspnet/overview/developing-apps-with-windows-azure/building-real-world-cloud-apps-with-windows-azure/continuous-integration-and-continuous-delivery
- 如何持续集成: https://www.atlassian.com/continuous-delivery/how-to-get-to-continuous-integration
- https://wiki.jenkins-ci.org/display/JENKINS/Distributed+builds#Distributedbuilds-Havemasterlaunchslaveagentviassh
- https://jenkins.io/doc/book/pipeline/
网友评论