一篇文章了解CI/CD管道全流程
从CI/CD过程开始,包含所有阶段并负责创建自动化和无缝的软件交付的一系列步骤称为CI/CD管道工作流。
使用CI/CD管道,软件发布工件可以从代码提交阶段到测试、构建、部署和生产阶段在管道中移动和前进。
这个概念非常强大,因为一旦指定了一个管道,它的一部分或全部就可以实现自动化,从而加快流程并减少错误。
换句话说,CI/CD管道使企业更容易一天自动多次交付软件。
DevOps工程师经常会因为CI/CD中各个阶段的自动化而与CI/CD管道混淆。
虽然不同的工具可以使CI/CD中的各个复杂阶段实现自动化,但由于人工干预,CI/CD的整个软件供应链仍然可能被打破。
那么,就首先了解CI/CD过程中的各个阶段,以及CI/CD管道为什么对于组织快速、大规模地交付代码至关重要。
企业应用程序开发团队通常由开发人员、测试人员/QA工程师、运营工程师和SRE(站点可靠性工程师)或IT运营团队组成。
他们紧密合作,将高质量的软件交付给客户。
CI/CD是两个独立过程的组合:持续集成和持续部署。
下面列出了其中的主要步骤。
CI持续集成CI持续集成(CI)是构建软件并完成初始测试的过程。
持续部署(CD)是将代码与基础设施结合起来的过程,确保完成所有测试并遵循策略,然后将代码部署到预期的环境中。
当然,许多公司都有自己的流程,但主要步骤如下。
CI:代码提交人员:开发人员和工程师、数据库管理员(DBA)、基础架构团队技术:GitHub、Gitlab、BitBucket过程:代码提交阶段也称为版本控制。
提交是将开发人员编写的最新更改发送到存储库的操作。
开发人员编写的代码的每个版本都被无限期地存储。
在与合作者讨论和审查变更之后,开发人员将编写代码,并在软件需求、功能增强、bug修复或变更请求完成后提交。
管理编辑和提交变更的存储库被称为源代码管理(SCM工具)。
在开发人员提交代码(代码推送请求)后,代码更改被合并到存储在中央存储库(如GitHub)中的基本代码分支中。
CI:静态代码分析人员:开发人员和工程师、数据库管理员(DBA)、基础设施团队、测试人员技术:GitHub、Gitlab、BitBucket过程:一旦开发人员编写了代码并将其推送到存储库,系统就会自动触发,开始下一个代码分析过程。
想象一下这样一个步骤:提交的代码直接进行构建,但在构建或部署过程中失败了。
就资源利用率而言,无论是机器还是人力,这都是一个缓慢而昂贵的过程。
必须检查代码的静态策略。
SAST(Static Application Security Test):SAST是一种白盒测试方法,使用SonarQube、Veracode、Appscan等SAST工具从内部检查代码,以发现软件缺陷、漏洞和弱点(如SQL注入等)。
这是一个快速检查过程,检查代码是否有语法错误。
虽然此阶段缺少检查运行时错误的功能,但这将在稍后的阶段执行。
将附加的策略检查放到自动化管道中可以显著减少稍后在该过程中发现的错误数。
CI:build人员:开发人员和工程师技术:Jenkins、Bamboo CI、Circle CI、Travis CI、Maven、Azure DevOps过程:持续集成流程的目标是接受常规的代码提交,并持续构建二进制工件。
持续集成过程通过检查添加的新模块是否与现有模块配合良好,有助于更快地发现bug。
这有助于减少验证新代码更改的时间。
构建工具有助于编译和创建可执行文件或包(、,等)取决于用于编写源代码的编程语言。
在构建过程中,还会生成SQL脚本,然后与基础设施配置文件一起测试。
简而言之,构建阶段是编译应用程序的阶段。
构建过程的其他子活动包括工件存储、构建验证和单元测试。
CI:测试阶段人员:测试人员和QA工程师技术:Selenium、Appium、Jmeter、SOAP UI、Tarantula过程:发布一个构建过程一系列自动化测试来验证代码的准确性。
这一阶段有助于防止错误到达产品。
根据构建的大小,此检查可以持续数秒到数小时。
对于由多个团队提交和构建代码的大型组织,这些检查将在并行环境中运行,以节省宝贵的时间并尽早将Bug通知给开发人员。
这些自动化测试是由测试人员(或者称为QA工程师)建立的,他们已经根据用户故事建立了测试用例和场景。
他们进行回归分析,压力测试,以检查与预期产出的偏差。
测试中涉及的活动有健全性测试、集成测试和压力测试。
这是一个非常先进的测试水平。
在这里会发现开发代码的开发人员可能不知道的问题。
集成测试:集成测试是使用Cucumber、Selenium等工具来执行的,其中各个应用程序模块作为一个组进行组合和测试,同时评估是否符合指定的功能需求。
在集成测试之后,需要有人批准将该组中的更新集移动到下一阶段,这通常是性能测试。
这个验证过程可能很麻烦,但它是整个过程的重要组成部分。
核查过程中出现了一些新的解决办法。
负载和压力测试:负载平衡和压力测试也使用自动化测试工具(如Selenium、JMeter等)来执行,以检查应用程序在高流量环境下是否稳定和性能良好。
此测试通常不会在每个更新上运行,因为完整的压力测试是长期运行的。
在发布主要的新功能时,将对多个更新进行分组,并完成完整的性能测试。
在单个更新被转移到下一个阶段的情况下,管道可能包括金丝雀测试作为替代方案。
持续部署:bake和部署人员:基础设施工程师、现场可靠性工程师(SRE)、运维工程师技术:Spinnaker、Argo CD、Tekton CD过程:测试阶段完成后,清除了标准的代码就可以部署到服务器中,在那里它们将与主应用程序集成。
在部署到生产环境之前,它们将被部署到产品团队内部使用的测试/暂存或beta环境中。
在将构建移动到这些环境之前,构建必须经过两个子阶段Bake和Deploy。
这两个阶段都是Spinnaker固有的。
CD:BakeBake是指从源代码中创建一个不可变的映像实例,该实例在生产环境中具有当前配置。
这些配置可能是数据库更改和其他基础设施更新之类的内容。
Spinnaker可以触发Jenkins来执行这个任务,有些组织更喜欢使用Packer。
CD:部署Spinnaker将自动将烘焙的映像传递到部署阶段。
这是将服务器组设置为部署到集群的位置。
与上述测试过程类似,在部署阶段执行功能相同的过程。
部署首先转移到测试、阶段,最后转移到生产环境,然后进行批准和检查。
整个过程由Spinnaker之类的工具处理。
CD:验证这也是团队优化整个CI/CD流程的关键所在。
因为现在已经进行了很多测试,所以失败应该很少。
但此时的任何故障都需要尽快解决,以便将对最终客户的影响降到最低。
团队也应该考虑自动化这部分流程。
部署到生产环境是使用部署策略(如蓝绿部署、金丝雀分析、滚动更新等)执行的。
在部署阶段,将监视正在运行的应用程序,以验证当前部署是否正确或是否需要回滚。
CD:监控人员:SRE,运维团队技术:Zabbix、Nagios、Prometheus、Elastic Search、Splunk、Appdynamics、Tivoli过程:要使一个软件发行版具有故障安全性和健壮性,在生产环境中跟踪发行版的运行状况是至关重要的。
应用程序监控工具将跟踪CPU利用率和发布延迟等性能指标。
日志分析器将扫描底层中间件和操作系统产生的日志流,以识别行为并跟踪问题的来源。
在生产过程中出现任何问题时,都会通知相关人员,以确保生产环境的安全性和可靠性。
此外,监视阶段帮助企业收集有关新软件更改如何为收入做出贡献的信息,并帮助基础架构团队跟踪系统行为趋势和进行容量规划。
持续部署:反馈和协作工具人员:SRE、Ops和维护团队技术:禅道、ServiceNow、Slack、Email、HipchatDevOps团队的目标是更迅速、持续地发布,然后不断减少错误和性能问题。
这是通过slack或电子邮件频繁地向开发人员和项目经理反馈新版本的质量和性能,并在ITSM工具中及时提高票价来实现的。
通常,反馈系统是整个软件交付过程的一部分;因此交付过程中的任何更改都会频繁地记录到系统中,以便交付团队可以对其采取行动。
企业必须评估一个整体的持续交付解决方案,它可以自动化或促进上述阶段的自动化。
持续集成/持续发布(Continuous Integration and Continuous Delivery)
持续集成/持续发布(CI/CD)是敏捷软件开发的核心过程,旨在实现快速的计划、编码、测试和发布循环。
CI/CD的关键是自动化测试和发布,每次代码提交、合并后都会进行自动化测试,从而生成新的发布版本。
基于效率的考量,可以在提交合并和版本发布时进行不同级别的测试。
为了实现快速发布,CI/CD成为复杂软件产品的维护焦点,要求专业团队编写大量代码以实现任务调度,并集成多个工具链以提高效率。
对于汽车制造商,实现敏捷软件开发转型面临挑战。
持续部署(CD)的目标是自动提供持续交付管道中的发布版本给最终用户。
部署方式包括云环境自动部署、app升级、网站更新或只更新可用版本列表。
关键在于,并非管道中的每组可交付成果都会始终部署,而是确保每套成果“可部署”。
通过人工决策或试用发布等方法控制管道构建的发布成果是否部署。
在CI/CD流程中,workspace定义了共享容器空间和目录,各个阶段通过共享volume和工作路径避免复制。
base属性定义了基础容器空间,确保代码、依赖和编译二进制文件在各步骤间持久化和共享。
path属性指定了构建的工作目录,代码克隆到此目录,成为各构建步骤的默认工作目录。
Pipelines定义了包含代码构建、测试和部署等步骤的工作流,步骤顺序执行。
Build构建在Docker容器中执行命令,使用工作区作为工作路径。
Deployments触发Drone部署项目,事件类型或目标环境变量限制执行的步数。
通过配置,可以设置工作流仅在特定目标环境中部署项目,如生产环境。
DevOps 工程师初级指南
DevOps,作为当前热门的软件开发与运维融合概念,旨在通过整合开发与运维团队,加快交付流程,弥补敏捷开发的局限性。
其核心在于促进跨职能团队协作,通过工具和流程的使用实现更好的沟通与同步。
本文旨在为初学者提供DevOps工程师所需技能、职责、职业路径与面试问题解答,帮助你快速上手DevOps。
一、什么是DevOps?
DevOps源于2009年Patrick Debois提出的概念,其思想在于将开发与运维团队紧密合作,加速软件交付过程,克服敏捷开发中运维难以跟上的问题。
DevOps通过促进团队间沟通、使用工具和流程优化协作,提高基础架构灵活性,简化管理与保护应用程序。
二、DevOps工程师的职责
DevOps工程师作为跨职能团队的核心成员,负责规划、开发、测试、维护和文档编写。
具体职责包括参与计划制定、管理基础设施、构建解决方案、执行测试、维护应用程序、编写文档和跟踪更改。
三、所需技能
要成为DevOps工程师,需掌握基础设施管理、云服务、持续集成、部署自动化、维护与故障排除、安全、编排与容器技术。
主要使用工具包括IaC、云服务提供商(AWS、Azure、GCP等)、持续集成工具(Jenkins、GitLab等)、部署工具(Jenkins、Octopus Deploy等)、监控工具(Grafana、Splunk等)。
四、职业路径
随着DevOps需求的增长,职业机会不断涌现,成为高薪软件行业热门职位。
DevOps工程师根据经验不同,可以发展为发布经理、DevOps架构师等角色。
经过培训与经验积累,可以逐渐承担更多职责,实现职业发展。
五、面试问题与答案
1. 对DevOps的理解:DevOps结合开发与运维团队,通过工具和流程提升交付效率,确保团队间沟通与协作。
2. DevOps与敏捷的区别:DevOps关注团队间协作与工具集成,而敏捷侧重快速迭代与客户反馈驱动的开发过程。
3. 掌握的DevOps工具:列举常用的DevOps工具,如IaC、云服务管理、持续集成、部署自动化工具等。
4. DevOps模型阶段:规划、代码、构建、测试、部署、操作、监控。
5. 主要DevOps实践:强调持续集成、持续交付、自动化测试、版本控制、DevSecOps等最佳实践。
6. 云在DevOps中的作用:云提供可扩展基础架构、自动化部署与协作工具,促进跨团队管理与添加新功能。
7. 管道在DevOps中的作用:管道自动化构建与部署流程,支持团队协作与快速迭代。
8. 左移原则:将测试提前至开发早期阶段,促进问题尽早发现与解决。
9. 版本控制在DevOps中的实现:通过工具如GitHub、GitLab实现版本管理与代码分支。
10. DevOps中的安全:强调安全性在软件开发中的重要性,DevSecOps融合安全理念于DevOps实践。