ECMAScript+ 面试宝典

软件工程

如何理解 CI/CD?§

https://www.redhat.com/zh/topics/devops/what-is-ci-cd

ruanyifeng.com/blog/2015/09/continuous-integration.html

  • CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。作为一个面向开发和运营团队的解决方案,CI/CD 主要针对在集成新代码时所引发的问题(亦称:“集成地狱”)。

  • 持续集成:频繁地将多个分支的代码集成到主干分支。集成前必须全部通过自动化测试。

    • 特点
      • 构建 > 单元测试。
      • 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
      • 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
    • 现代应用开发的目标是让多位开发人员同时处理同一应用的不同功能。但是,如果企业安排在一天内将所有分支源代码合并在一起(称为“合并日”),最终可能造成工作繁琐、耗时,而且需要手动完成。这是因为当一位独立工作的开发人员对应用进行更改时,有可能会与其他开发人员同时进行的更改发生冲突。如果每个开发人员都自定义自己的本地集成开发环境(IDE),而不是让团队就一个基于云的 IDE 达成一致,那么就会让问题更加雪上加霜。
    • 持续集成(CI)可以帮助开发人员更加频繁地(有时甚至每天)将代码更改合并到共享分支或“主干”中。一旦开发人员对应用所做的更改被合并,系统就会通过自动构建应用并运行不同级别的自动化测试(通常是单元测试和集成测试)来验证这些更改,确保这些更改没有对应用造成破坏。这意味着测试内容涵盖了从类和函数到构成整个应用的不同模块。如果自动化测试发现新代码和现有代码之间存在冲突,CI 可以更加轻松地快速修复这些错误。
  • 持续交付:频繁地将软件的新版本交付给质量团队或者用户,以供评审。

    • 构建 > 单元测试 > 测试环境部署 > 测试(不涉及生产环境的自动化部署,只能手动部署)。
    • 完成 CI 中构建及单元测试和集成测试的自动化流程后,持续交付可自动将已验证的代码发布到存储库。为了实现高效的持续交付流程,务必要确保 CI 已内置于开发管道。持续交付的目标是拥有一个可随时部署到生产环境的代码库。
    • 在持续交付中,每个阶段(从代码更改的合并,到生产就绪型构建版本的交付)都涉及测试自动化和代码发布自动化。在流程结束时,运维团队可以快速、轻松地将应用部署到生产环境中。
  • 持续部署:代码通过评审以后,自动部署到生产环境。

    • 构建 > 单元测试 > 测试环境部署 > 测试 > 生产环境部署 > 生产环境测试(全流程自动化)。
    • 相比持续交付,多一步自动化部署生产环境。
    • 对于一个成熟的 CI/CD 管道来说,最后的阶段是持续部署。作为持续交付——自动将生产就绪型构建版本发布到代码存储库——的延伸,持续部署可以自动将应用发布到生产环境。由于在生产之前的管道阶段没有手动门控,因此持续部署在很大程度上都得依赖精心设计的测试自动化。
    • 实际上,持续部署意味着开发人员对应用的更改在编写后的几分钟内就能生效(假设它通过了自动化测试)。这更加便于持续接收和整合用户反馈。总而言之,所有这些 CI/CD 的关联步骤都有助于降低应用的部署风险,因此更便于以小件的方式(而非一次性)发布对应用的更改。不过,由于还需要编写自动化测试以适应 CI/CD 管道中的各种测试和发布阶段,因此前期投资还是会很大。

如何实现 CI/CD?§

如何理解瀑布流/敏捷开发?§

https://baike.baidu.com/item/敏捷开发

  • 瀑布流
  • 敏捷开发
    • 敏捷开发以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。在敏捷开发中,软件项目在构建初期被切分成多个子项目,各个子项目的成果都经过测试,具备可视、可集成和可运行使用的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。
    • 原则:主张简单、拥抱变化、你的第二个目标是可持续性、递增的变化、令投资最大化、有目的的建模、多种模型、高质量的工作、快速反馈、软件是你的主要目标、轻装前进。
    • 宣言原则:
      • 最重要的是通过尽早和不断交付有价值的软件满足客户需要。
      • 我们欢迎需求的变化,即使在开发后期。敏捷过程能够驾驭变化,保持客户的竞争优势。
      • 经常交付可以工作的软件,从几星期到几个月,时间尺度越短越好。
      • 业务人员和开发者应该在整个项目过程中始终朝夕在一起工作。
      • 围绕斗志高昂的人进行软件开发,给开发者提供适宜的环境,满足他们的需要,并相信他们能够完成任务。
      • 在开发小组中最有效率也最有效果的信息传达方式是面对面的交谈。
      • 可以工作的软件是进度的主要度量标准。
      • 敏捷过程提倡可持续开发。出资人、开发人员和用户应该总是维持不变的节奏。
      • 对卓越技术与良好设计的不断追求将有助于提高敏捷性。
      • 简单——尽可能减少工作量的艺术至关重要。
      • 最好的架构、需求和设计都源自自我组织的团队。
      • 每隔一定时间,团队都要总结如何更有效率,然后相应地调整自己的行为。

如何理解单元测试/集成测试/端对端测试?§

  • 单元测试:针对函数或模块的测试
  • 集成测试:针对整体产品的某个功能的测试,又称功能测试
  • 端对端测试:从用户界面直达数据库的全链路测试

Docker 是什么?§

https://www.runoob.com/docker/docker-tutorial.html

  • Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

  • Docker 的优点:

    • 快速、一致地交付应用程序:
      • 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
      • 容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:
        • 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
        • 他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。
        • 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。
        • 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。
    • 响应式部署和拓展:
      • Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
      • Docker 的可移植性和轻量级的特性,还可以轻松地完成动态管理的工作负担,并根据业务需求指示,实时拓展或拆除应用程序和服务。
    • 在同一硬件上运行更多的负载:
      • Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
  • Docker 通常的组成部分:

    • Docker Client 客户端
    • Docker Daemon 守护进程
    • Docker Image 镜像
    • Docker Container 容器
FROM ubuntu:14.04 
MAINTAINER “niwanglongDevUbuntu”
#apt-get 换源
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update

#安装linux基本软件
RUN apt-get install -y vim bash-completion

#安装前端开发环境
RUN apt-get install -y npm
RUN npm install -g cnpm --registry=https://registry.npm.taobao.org
RUN apt-get install -y curl
RUN npm install -g -y n
RUN n stable
RUN npm install -y --global vue-cli

#开放Vue-Cli端口
EXPOSE 8080

如何理解 DevOps?§

https://www.jianshu.com/p/c5d002cf25b9

  • DevOps 是 Development 和 Operations 的合成词,其目标是要加强开发人员、测试人员、运维人员之间的沟通协调。如何实现这一目标呢?需要我们的项目做到持续集成、持续交付、持续部署。
  • 时下流行的 Jenkins、Bamboo,就是两款优秀的持续集成工具。而 Docker 容器则为 DevOps 提供了强大而有效的统一环境。
  • DevOps 工具链示例:
    • 代码管理(SCM):GitHub、GitLab、BitBucket、SubVersion
    • 构建工具:Ant、Gradle、maven
    • 自动部署:Capistrano、CodeDeploy
    • 持续集成(CI):Bamboo、Hudson、Jenkins
    • 配置管理:Ansible、Chef、Puppet、SaltStack、ScriptRock GuardRail
    • 容器:Docker、LXC、第三方厂商如AWS
    • 编排:Kubernetes、Core、Apache Mesos、DC/OS
    • 服务注册与发现:Zookeeper、etcd、Consul
    • 脚本语言:python、ruby、shell
    • 日志管理:ELK、Logentries
    • 系统监控:Datadog、Graphite、Icinga、Nagios
    • 性能监控:AppDynamics、New Relic、Splunk
    • 压力测试:JMeter、Blaze Meter、loader.io
    • 预警:PagerDuty、pingdom、厂商自带如AWS SNS
    • HTTP加速器:Varnish
    • 消息总线:ActiveMQ、SQS
    • 应用服务器:Tomcat、JBoss
    • Web服务器:Apache、Nginx、IIS
    • 数据库:MySQL、Oracle、PostgreSQL等关系型数据库;cassandra、mongoDB、redis等NoSQL数据库
    • 项目管理(PM):Jira、Asana、Taiga、Trello、Basecamp、Pivotal Tracker