面试题-持续集成

前言

在11月的前两周我总结了每天5分钟玩转容器技术的基础部分,对容器有了一些基础的认识和实践经验,但是容器技术不能只学不用,需要结合实际项目的部署来进一步学习并加深理解,所以我购买了慕课网的 基于SpringCloud+Kubernetes微服务的容器化持续交付实战 这门实战课,既可以了解微服务,又能够学习DevOps并加深对容器的理解。这系列的笔记就是针对这个实战课程编写的,目前只更新到了第6章,笔记同样也采用了问题-解答 的形式,方便大家准备面试,希望对大家有所帮助。

持续集成

  1. 敏捷开发,持续集成,持续交付,持续部署,DevOps的区别?

    • 敏捷开发:关注任务的分配和实际开发和本地环境的构建
    • 持续集成:敏捷开发+自动化测试
    • 持续交付:持续集成+包发布到内部的库中
    • 持续部署:持续交付+部署环节
    • DevOps:持续部署+运维(包含了软件生命周期的所有环节)
  2. 需要进行持续集成的原因?

    • 单体应用的部署相对简单,部署服务停服务都只需要控制一个jar包即可
    • 微服务模式下应用部署的复杂度高,部署服务可能需要部署微服务相关的很多支持服务
  3. 如何设计持续交付流水线?(学习完再完成)

  4. 需要持续部署的原因?

    • 手动部署出错率高
    • 需要熬夜加班部署
  5. 持续部署的要素

    • 自动化部署:Ansible
      • VaultServer:存储敏感信息服务器
    • 应用与配置分离,一次构建,多次运行-Spring cloud Config
    • 提供应用健康检测接口-Spring cloud Actuator
  6. 新版本发布时的方式

    • 蓝绿发布:同时保持两个环境,一个老版本,一个新版本,通过一个调度程序把所有客户端流量负载到新版本环境下,一旦出现问题,无缝切换到老版本
    • 金丝雀发布:和蓝绿发布类似,也同时有两套环境,区别在于客户端流量是逐步切换到新版本的,按照10%~100%逐步切换
    • 功能开关:适用于前后端开发进度不匹配的时候,如果后端先开发完毕,可以通过设置一个全局的开关,先关闭部分新功能,等到前端都开发完毕后,再把功能开关打开
  7. 简单说说一个敏捷项目的管理架构

    • Release:发布,单位为月,比如:6月需要发布一个促销的功能
      • Sprint:迭代(包含本次迭代需要实现的需求点),单位为周
        • Story:根据需求产生的一个个用户故事(产品经理做)
        • Task:根据用户故事拆分出来的开发任务(程序员做)
  8. Story point的作用是什么?

    Story Point的作用是给每个用户故事进行打分,保证每个开发者按照能力来分配分数,打分的评测维度有如下:

    • 工作量
    • 复杂度
    • 风险和不确定性
  9. 每日站会的目的是什么?

    每日站会最主要的目的是及时的消除项目的风险。每个人通过说明以下的事项,项目经理能够很有效的把控项目的进度。

    • 昨日工作
    • 今日工作
    • 是否有阻塞的issuse
  10. 简单说说 GitFlow和TrunkBase开发模式的区别,开发团队如何选择开发模型?

    • GitFlow和TrunkBase模型的核心区别在于,提交的新功能是否可以立即发布到主干分支或者Release分支,立即合并并且分支较少的优点和缺点如下:
      • 优点:可以快速迭代
      • 缺点:如果团队开发水平不高,很可能出现线上bug
    • 总结:如果对版本稳定性要求高,建议使用GitFlow;如果需要快速迭代,建议使用TrunkBase
  11. 微服务网关的作用

    • 服务路由:作为统一路径的路由入口
    • 服务认证:提供session等校验工作
    • 服务负载均衡调度:可以配置负载均衡策略
    • 安全管理:支持配置某些路径的白名单
  12. 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/
      
  13. maven私服的作用

    • 公司的依赖统一管理,提供缓存,减少网络传输
    • 制品仓库(自己编写的jar,可以由其他人访问到)
  14. 如何搭建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文件即可

  15. Snapshot版本和Release版本的区别?(使用artifactory)

    • Snapshot在maven中可以存在同一个版本号的多个不同时间戳的版本,相当于开发阶段
    • Release版本(version不带snapshot),同一个版本号在私服中只能存在一份,使用别人的jar包时尽量使用release版本的
  16. (使用artifactory)的仓库结构图

  17. 如何把本地的jar包发布到maven的私服?(使用artifactory)

    • 点击虚拟仓库的Set me up,里面提供了pom文件中的发布部分
    • 在本地pom文件中加入这部分即可
    • mvn depoly就可以发布到私服了
  18. 为什么使用Jenkins?

    • 软件项目的统一自动化构建(统一意味着一切环境的一致性自动意味着可重复
    • 通过许多插件,可以方便的集成 代码扫描 自动化测试 和 自动化部署的任务
  19. Jenkins的核心概念?

    • Project:项目,定义一个构建菜谱
    • Build:构建,利用Project来执行一次构建
    • Workspace:工作空间,构建是基于哪个工作目录,存储代码和一些中间临时文件
    • Credentials:凭据,一些敏感信息可以存储在Jenkins,通过定义变量来获取
  20. Jenkins持续集成使用pipeline流水线模式有什么好处?

    • pipeline as code:代码(配置信息)可以存储在git仓库,如果jenkins服务器不可用,配置项就丢失了
    • 和第三方集成更容易(可以不依赖插件,直接使用接口调用)
  21. 你知道有哪些pipeline流水线模式的语法?

    • Scripted脚本式:可以使用Groovy脚本,比较灵活
    • Declarative声明式:通过预定义的标签进行结构化的编写,功能受限但更加标准化
  22. Jenkins如何集成Artifactory?

    • 下载Jenkins Artifactory插件
    • 在Configure System中配置插件和相关Credential信息
    • 在流水线使用Atrifactory进行依赖下载和制品上传
  23. Jenkins集成Jira的原理?

    Jenkins之所以需要集成Jira是因为,提交的构建在测试和Release经理的角度,都需要知道本次构建的修改对应的是Jira的哪个需求。

    Jenkins集成Jira的原理是:

    • 开发者在commit消息里增加jira的任务id
    • Jenkins可以在构建中自动创建Jira的链接
    • 测试可以在构建中方便的获取需求相关信息
  24. Sonarqube是什么?

    • 功能:源代码扫描工具,可以识别代码的质量漏洞重复率等等,提升代码质量
    • 原理:需要建立扫描规则库,如果扫描过程中命中规则,则会生成一个issue,提示开发者进行修复。
  25. Jenkins和Sonarqube集成的原理图,如何集成?

    • docker 运行一个Sonarqube的server
    • 创建项目,生成一个token
    • Jenkins脚本中需要传递token
原文地址:https://www.cnblogs.com/ging/p/13984874.html