面试题-持续集成
前言
在11月的前两周我总结了每天5分钟玩转容器技术的基础部分,对容器有了一些基础的认识和实践经验,但是容器技术不能只学不用,需要结合实际项目的部署来进一步学习并加深理解,所以我购买了慕课网的 基于SpringCloud+Kubernetes微服务的容器化持续交付实战 这门实战课,既可以了解微服务,又能够学习DevOps并加深对容器的理解。这系列的笔记就是针对这个实战课程编写的,目前只更新到了第6章,笔记同样也采用了问题-解答 的形式,方便大家准备面试,希望对大家有所帮助。
持续集成
-
敏捷开发,持续集成,持续交付,持续部署,DevOps的区别?
- 敏捷开发:关注任务的分配和实际开发和本地环境的构建
- 持续集成:敏捷开发+自动化测试
- 持续交付:持续集成+包发布到内部的库中
- 持续部署:持续交付+部署环节
- DevOps:持续部署+运维(包含了软件生命周期的所有环节)
-
需要进行持续集成的原因?
- 单体应用的部署相对简单,部署服务停服务都只需要控制一个jar包即可
- 微服务模式下应用部署的复杂度高,部署服务可能需要部署微服务相关的很多支持服务
-
如何设计持续交付流水线?(学习完再完成)
-
需要持续部署的原因?
- 手动部署出错率高
- 需要熬夜加班部署
-
持续部署的要素
- 自动化部署:Ansible
- VaultServer:存储敏感信息服务器
- 应用与配置分离,一次构建,多次运行-Spring cloud Config
- 提供应用健康检测接口-Spring cloud Actuator
- 自动化部署:Ansible
-
新版本发布时的方式
- 蓝绿发布:同时保持两个环境,一个老版本,一个新版本,通过一个调度程序把所有客户端流量负载到新版本环境下,一旦出现问题,无缝切换到老版本
- 金丝雀发布:和蓝绿发布类似,也同时有两套环境,区别在于客户端流量是逐步切换到新版本的,按照10%~100%逐步切换
- 功能开关:适用于前后端开发进度不匹配的时候,如果后端先开发完毕,可以通过设置一个全局的开关,先关闭部分新功能,等到前端都开发完毕后,再把功能开关打开
-
简单说说一个敏捷项目的管理架构
- Release:发布,单位为月,比如:6月需要发布一个促销的功能
- Sprint:迭代(包含本次迭代需要实现的需求点),单位为周
- Story:根据需求产生的一个个用户故事(产品经理做)
- Task:根据用户故事拆分出来的开发任务(程序员做)
- Sprint:迭代(包含本次迭代需要实现的需求点),单位为周
- Release:发布,单位为月,比如:6月需要发布一个促销的功能
-
Story point的作用是什么?
Story Point的作用是给每个用户故事进行打分,保证每个开发者按照能力来分配分数,打分的评测维度有如下:
- 工作量
- 复杂度
- 风险和不确定性
-
每日站会的目的是什么?
每日站会最主要的目的是及时的消除项目的风险。每个人通过说明以下的事项,项目经理能够很有效的把控项目的进度。
- 昨日工作
- 今日工作
- 是否有阻塞的issuse
-
简单说说 GitFlow和TrunkBase开发模式的区别,开发团队如何选择开发模型?
- GitFlow和TrunkBase模型的核心区别在于,提交的新功能是否可以立即发布到主干分支或者Release分支,立即合并并且分支较少的优点和缺点如下:
- 优点:可以快速迭代
- 缺点:如果团队开发水平不高,很可能出现线上bug
- 总结:如果对版本稳定性要求高,建议使用GitFlow;如果需要快速迭代,建议使用TrunkBase
- GitFlow和TrunkBase模型的核心区别在于,提交的新功能是否可以立即发布到主干分支或者Release分支,立即合并并且分支较少的优点和缺点如下:
-
微服务网关的作用
- 服务路由:作为统一路径的路由入口
- 服务认证:提供session等校验工作
- 服务负载均衡调度:可以配置负载均衡策略
- 安全管理:支持配置某些路径的白名单
-
Zuul网关的两种用法
-
service通过ribbon向eureka注册,zuul通过serviceId来通过eureka找到服务
zuul: routes: guestbook: path: /** serviceId: guestbook-service
-
Zuul通过uri进行http跳转:适用于不用eureka作为注册中心的情况
zuul: routes: guestbook: path: /** uri: http://service:8080/guestbook/
-
-
maven私服的作用
- 公司的依赖统一管理,提供缓存,减少网络传输
- 制品仓库(自己编写的jar,可以由其他人访问到)
-
如何搭建maven私服?(使用artifactory)
-
使用docker直接搭建最简单,命令如下:
sudo docker run --name artifactory-oss-6.18.1 -p 8083:8081 docker.bintray.io/jfrog/artifactory-oss:6.18.1
-
然后访问localhost:8083 admin/password进入artifactory的UI界面
- 建立远程仓库
- 建立本地仓库
- 建立聚合远程仓库本地仓库的虚拟仓库
-
使用Artifactory自动生成maven的setting.xml文件,替换本地 ~/.m2的setting.xml文件即可
-
-
Snapshot版本和Release版本的区别?(使用artifactory)
- Snapshot在maven中可以存在同一个版本号的多个不同时间戳的版本,相当于开发阶段
- Release版本(version不带snapshot),同一个版本号在私服中只能存在一份,使用别人的jar包时尽量使用release版本的
-
(使用artifactory)的仓库结构图
-
如何把本地的jar包发布到maven的私服?(使用artifactory)
- 点击虚拟仓库的Set me up,里面提供了pom文件中的发布部分
- 在本地pom文件中加入这部分即可
- mvn depoly就可以发布到私服了
-
为什么使用Jenkins?
- 软件项目的统一自动化构建(统一意味着一切环境的一致性;自动意味着可重复)
- 通过许多插件,可以方便的集成 代码扫描 自动化测试 和 自动化部署的任务
-
Jenkins的核心概念?
- Project:项目,定义一个构建菜谱
- Build:构建,利用Project来执行一次构建
- Workspace:工作空间,构建是基于哪个工作目录,存储代码和一些中间临时文件
- Credentials:凭据,一些敏感信息可以存储在Jenkins,通过定义变量来获取
-
Jenkins持续集成使用pipeline流水线模式有什么好处?
- pipeline as code:代码(配置信息)可以存储在git仓库,如果jenkins服务器不可用,配置项就丢失了
- 和第三方集成更容易(可以不依赖插件,直接使用接口调用)
-
你知道有哪些pipeline流水线模式的语法?
- Scripted脚本式:可以使用Groovy脚本,比较灵活
- Declarative声明式:通过预定义的标签进行结构化的编写,功能受限但更加标准化
-
Jenkins如何集成Artifactory?
- 下载Jenkins Artifactory插件
- 在Configure System中配置插件和相关Credential信息
- 在流水线使用Atrifactory进行依赖下载和制品上传
-
Jenkins集成Jira的原理?
Jenkins之所以需要集成Jira是因为,提交的构建在测试和Release经理的角度,都需要知道本次构建的修改对应的是Jira的哪个需求。
Jenkins集成Jira的原理是:
- 开发者在commit消息里增加jira的任务id
- Jenkins可以在构建中自动创建Jira的链接
- 测试可以在构建中方便的获取需求相关信息
-
Sonarqube是什么?
- 功能:源代码扫描工具,可以识别代码的质量漏洞重复率等等,提升代码质量
- 原理:需要建立扫描规则库,如果扫描过程中命中规则,则会生成一个issue,提示开发者进行修复。
-
Jenkins和Sonarqube集成的原理图,如何集成?
- docker 运行一个Sonarqube的server
- 创建项目,生成一个token
- Jenkins脚本中需要传递token