DevOps - 持续开发

持续开发 (CD) 意味着自动化和改进软件开发的各个阶段,从编写代码到部署代码。这有助于快速顺利地发布更新。

持续开发的目标

持续开发的主要目标是:

  • 频繁的代码更新 − 快速提供新功能、改进和错误修复。
  • 自动化 − 自动化集成、测试和构建,以减少人为错误并加快开发速度。
  • 协作 − 改善开发人员、QA 团队和运营团队的合作,以实现顺利部署。
  • 质量 −即使频繁更新,也能保持较高的代码质量和稳定性。

主要目的是加快上市时间、降低风险,并帮助团队更快地响应用户需求和业务目标。

持续开发如何融入 DevOps 生命周期?

持续开发是 DevOps 生命周期的重要组成部分。它专注于在代码发布到生产之前实现自动化和改进开发。以下是它如何融入 −

  • 持续开发在持续集成 (CI) 之后开始。在 CI 中,代码更改会合并到共享存储库中。CI 确保代码经过测试并自动构建。
  • CD 更进一步,实现了构建和集成过程的自动化。代码集成后,将经历自动构建和准备阶段,为部署做好准备。
  • 开发阶段结束后,即使代码已准备好投入生产,CD 也能确保代码能够顺利进入部署或准备阶段。

简而言之,持续开发可帮助 DevOps 团队保持稳定的流程。它让他们能够快速处理许多代码更改和发布,同时保持流程的顺畅和自动化。

现在,让我们继续了解持续开发中的一些关键概念。

代码集成和协作

在持续开发中,代码集成和协作是加快开发过程、使开发过程更顺畅的关键。它有助于团队成员有效地协同工作。以下是主要要点 −

  • 开发人员经常推送代码。这有助于及时更新共享存储库。
  • GitHub、GitLab 或 Bitbucket 等工具可帮助团队协同工作。它们可以轻松完成代码审查和合并。
  • CI 管道提供自动反馈。这有助于开发人员尽早发现问题并改善团队合作,从而减少集成问题。

主要目标是保持稳定的更新流,减少冲突,并确保所有更改都能顺利融入通用代码库。

版本控制在持续开发中的作用

版本控制在持续开发中非常重要。它可以帮助团队轻松管理和跟踪代码更改。它之所以重要,原因如下:

  • Git 等版本控制系统 (VCS) 会跟踪每次代码更改。开发人员可以查看更改历史记录,并在需要时返回到早期版本。
  • VCS 允许许多开发人员在同一个项目上工作,而不会覆盖彼此的工作。通过分支和合并,团队可以同时处理不同的功能或修复。
  • 版本控制有助于管理不同的代码版本。它使发布新版本和应用补丁变得容易,而不会影响主要生产代码。

通过使用分支策略(如功能分支和修补程序),团队可以确保他们的工作是分开的。他们可以在准备就绪时合并它,在保持主代码稳定的同时允许持续开发。

构建持续开发管道

持续开发管道可自动将代码从提交移动到部署就绪的过程。基本工作流程有几个阶段 −

  • 代码提交 − 开发人员将他们的更改提交到共享版本控制系统(如 Git)。
  • 构建 − 使用 Jenkins 或 GitLab CI 等 CI 工具自动构建代码。这确保更改与现有代码配合良好。
  • 静态代码分析 −自动化工具会检查代码质量,例如 linting 和安全扫描。
  • 工件创建 − 代码被打包成可部署的工件,例如 Docker 镜像或 JAR 文件。
  • 暂存/预生产 − 代码被部署到暂存环境中。它就像最终测试的生产环境一样。
  • 生产批准 − 如果代码通过所有测试,则标记为已准备好进行生产部署。

此管道有助于以更少的人力和更快的速度集成、构建和准备用于生产的代码。

工具和技术:Git、Jenkins、GitLab 等

许多工具对于设置和管理持续开发管道都很重要 −

  • Git − 这是主要的版本控制系统。它帮助我们跟踪更改、分支以及与团队成员协作。
  • Jenkins − Jenkins 是一种流行的自动化服务器。它与许多工具配合使用,可自动执行构建、测试和部署代码等任务。我们可以自定义 Jenkins 以支持复杂的工作流程。
  • GitLab − GitLab 是一个完整的 DevOps 平台。它将 Git 版本控制与内置的 CI/CD 功能相结合。GitLab 将代码管理与 CI 管道顺利连接起来。
  • CircleCI − CircleCI 是一个 CI/CD 平台。它专注于通过可扩展性和易用性实现开发工作流程的自动化。
  • Travis CI − Travis CI 是一种基于云的 CI 工具。它与 GitHub 集成以自动执行构建和部署任务。

这些工具协同工作以自动化整个流程,从提交代码到使其准备好部署。这确保我们拥有顺畅一致的开发流程。

自动化代码编译和构建过程

持续开发中的自动化有助于消除手动步骤。这节省了时间并减少了错误。代码编译和构建过程是自动化的最重要部分之一。这些步骤通常包括 −

  • 代码编译 − 源代码会自动编译为可执行代码或库。
  • 构建自动化 −我们使用 Maven(用于 Java)、Gradle 或 npm(用于 JavaScript)等工具将代码打包成可部署的工件。
  • 工件管理 − 诸如 Nexus 或 Artifactory 之类的工具存储和管理这些构建工件。这样,当我们需要部署时,就可以轻松访问它们。

通过自动执行这些步骤,我们确保每个代码更改都自动构建和测试。这可以保持一切一致,并消除人为错误的可能性。

使用 Jenkins 设置自动构建

Jenkins 是一种用于管理持续开发管道的著名自动化工具。以下是我们在 Jenkins 中设置自动构建的方法:

安装 Jenkins − 从 jenkins.io 下载 Jenkins。将其安装在服务器上或作为容器运行。

创建新作业:在 Jenkins 中,单击"新项目",为作业命名,然后选择"自由式项目"。单击确定以创建作业。

连接到 Git 存储库:在源代码管理部分下,选择Git。如果需要,请输入存储库 URL 和身份验证详细信息。例如,

Repository URL: https://github.com/yourrepo/yourproject.git
Credentials: your-credentials-id

定义构建步骤 − 在"构建"部分,添加构建步骤以使用构建工具编译代码。例如,对于 Maven 项目,它将像这样 −

mvn clean install

构建后操作 − 我们可以定义构建后操作,例如存档构建工件或运行部署脚本。例如,

Archive Artifacts: target/*.jar

安排或触发构建 − 我们可以设置触发器来运行构建。这可以是代码推送(使用 Git webhook)或计划。

示例 − 根据代码更改进行构建

Build Triggers: GitHub hook trigger for GITScm polling

设置完成后,Jenkins 将在每次发生更改时自动构建代码。这确保了构建过程保持一致和可靠,而无需我们手动执行。

简化持续开发:最佳实践、工具和策略

下表重点介绍了简化持续开发所应用的最佳实践、工具和策略−

主题 详细信息 示例
管理频繁的代码更改和更新 我们通过清晰的工作流程、自动化集成和减少冲突来处理频繁的更改。 我们可以使用功能分支来开发新功能。合并请求可帮助我们集成更改而不会影响主代码库。
使用功能分支和合并请求进行持续开发 开发人员在单独的分支中工作,并使用合并请求来审查和合并代码。 Git 示例 − git checkout -b feature/new-feature 创建一个新分支。稍后,我们可以创建合并请求来整合更改。
优化协作和沟通 我们使沟通更快、更高效,以便快速获得质量反馈。 工具 − Slack 用于聊天,Jira 用于跟踪任务,GitHub 用于拉取请求,确保反馈顺畅,并更新任务。
整合开发人员和运营团队以获得更快的反馈 开发和运营团队轻松协作,以快速获得反馈并更快地发布。 我们可以使用 Slack 频道让两个团队保持最新状态,并共同实时解决问题。
持续开发的版本控制最佳实践 我们遵循清晰的工作流程来管理代码更改并避免冲突。 Git 示例 − 开发人员应定期将代码提交并推送到共享存储库。这有助于避免"集成地狱"。
分支策略 − GitFlow 与基于主干的开发 GitFlow 使用分支来发布功能、发布和修复。基于主干的开发侧重于定期更新主分支。 GitFlow 示例 − 分支,如 feature/xyz、release/1.2 和 hotfix/urgent-fix。基于主干的示例:定期直接提交到主分支。
使用 Git 并行管理多个功能 我们可以通过使用不同的分支同时开发功能而不会造成破坏。 开发人员为每个功能创建单独的分支:针对功能 XYZ 使用 git checkout -b feature/xyz,确保任何人的工作都不会干扰他人。
使用高效的开发管道处理大型代码库 我们通过优化构建和集成管道来处理大型项目。 我们可以使用并行构建来加快构建过程。增量构建仅编译更改的文件,而不是整个代码库。
并行构建以缩短开发周期 我们通过同时运行测试和构建等任务来加快开发速度。 在 Jenkins 中,我们使用并行块一次运行多个测试作业,从而加快构建过程。

结论

在本章中,我们探讨了使持续开发更容易的关键思想和最佳实践。我们专注于管理频繁的代码更改、改善协作以及以良好的方式使用版本控制。我们讨论了 Git、Jenkins 和 Slack 等工具如何帮助我们获得更快的反馈、更顺畅的集成和更高效的工作流程。

通过使用功能分支、合并请求和分支模型(如 GitFlow 或基于主干的开发)等策略,我们可以使开发周期更快、更具可扩展性。这些做法有助于我们保持高质量、持续的交付。它们还可以减少摩擦并改善开发和运营团队之间的协作。