DevOps - 持续集成

持续集成 (CI) 是 DevOps 的关键部分。这意味着开发人员每天多次将他们的代码更改合并到共享存储库中。每次集成都会启动自动构建和测试过程。这有助于在开发过程的早期发现错误。目标是更快地修复错误,提高软件质量,并使产品始终准备好部署。

什么是持续集成 (CI)?

CI 可以轻松地将来自多个贡献者的代码更改合并到一个项目中。Jenkins、GitLab CI/CD 和 GitHub Actions 等工具有助于设置用于构建、测试和检查代码的管道。

例如,在基于 Git 的项目中,开发人员将其代码提交到分支。然后,CI 工具会自动编译代码、运行测试并提供有关更改的反馈。

为什么我们需要 SDLC 中的持续集成?

CI 对于开发人员之间的顺畅团队合作非常重要。它解决了"集成地狱",即合并来自不同开发人员的代码会导致重大冲突或错误。

借助 CI,团队可以执行以下操作 −

  • 尽早发现问题 − 自动化构建和测试可以快速捕获语法错误或测试失败等问题。例如,如果开发人员添加了单元测试失败的代码,则 CI 管道会发现问题并阻止损坏的代码影响其他代码。
  • 避免合并冲突 − 定期集成可减少代码发生冲突的可能性。
  • 加快交付速度 − 自动化减少了手动工作,因此发布速度更快。例如,CI 管道可在不到 10 分钟的时间内编译代码、测试代码并创建部署包。

通过使用 CI,团队可以创建更好的软件并在软件开发生命周期 (SDLC) 中更快地工作。

持续集成的关键概念

持续集成基于一些关键思想。这些思想确保开发过程顺利且自动化。让我们来了解一下。

版本控制系统 (VCS) 和 CI

Git、Subversion 或 Mercurial 等版本控制系统 (VCS) 有助于跟踪代码更改。CI 管道与 VCS 配合使用,以监视代码存储库中的新提交或拉取请求。当发生任何变化时,管道会自动运行。

示例

在 Git 中,类似分支的功能/新登录会合并到主分支中。 CI 工具注意到了这一点并启动管道。

配置 (GitHub Actions YAML) −

on:
  push:
    branches:
      - main

此设置确保在将每个更改添加到主分支之前对其进行检查。

自动构建

自动构建将源代码转换为可执行二进制文件或工件。此步骤检查代码是否有语法错误或未解决的依赖项。

示例

使用 Jenkins 的 Node.js 项目可以自动执行构建过程。

脚本 (Jenkinsfile) −

pipeline {
   stages {
      stage('Build') {
         steps {
            sh 'npm install'
            sh 'npm run build'
         }
      }
   }
}

此脚本安装依赖项并创建可用于生产的版本。

自动测试

CI 包含自动测试,用于检查代码是否符合预定义规则。这些测试可以包括单元测试、集成测试或功能测试。

示例

使用 pytest 运行单元测试的 Python 项目。

GitLab CI/CD YAML −

test:
  stage: test
  script:
    - pip install -r requirements.txt
    - pytest

如果任何测试失败,管道就会停止。这可以防止错误代码进一步发展。

CI 管道及其组件

CI 管道可自动化整个过程。它有几个重要部分 −

  • 触发器 − 提交、合并或拉取请求等事件。示例触发器:在 GitHub Actions 中 on: push。
  • 阶段 − 构建、测试和部署等步骤。
  • 作业 − 每个阶段内的任务,例如运行测试。
  • 工件 − 输出,如日志或构建文件。
  • 通知 −当某项操作成功或失败时向开发人员发送消息。

示例

CI 管道的 Jenkinsfile −

pipeline {
   agent any
   stages {
      stage('Build') {
         steps {
            sh 'mvn package'
         }
      }
      stage('Test') {
         steps {
            sh 'mvn test'
         }
      }
   }
   post {
      always {
         mail to: 'team@example.com',
         subject: "Pipeline ${currentBuild.result}",
         body: "Pipeline completed with status: ${currentBuild.result}"
      }
   }
}

管道的每个部分都确保代码更改经过适当测试并准备部署。

CI 工具示例:Jenkins

Jenkins 是持续集成 (CI) 最流行的工具之一。它是开源的,支持许多用于构建、测试和部署应用程序的插件。我们可以轻松设置它并开始自动化我们的工作流程。

安装和配置 Jenkins

安装 − 在您的系统或服务器上安装 Jenkins。对于 Ubuntu,请按照以下步骤操作 −

sudo apt update
sudo apt install openjdk-11-jre
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt update
sudo apt install jenkins

Open Jenkins in your browser at http://<your-server-ip>:8080.

Initial Configuration: Get the admin password −

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

登录 Jenkins,安装建议的插件,并创建管理员用户。

集成 Git − 转到 管理 Jenkins > 插件管理器。安装 Git 插件。在 管理 Jenkins > 全局工具配置 下配置您的 Git 存储库。

设置基本 Jenkins 管道

创建新的管道作业。单击 New Item > Pipeline > OK。

将管道脚本添加到作业配置中。在 Pipeline 部分中使用此脚本:

pipeline {
   agent any
   stages {
      stage('Clone Repository') {
         steps {
           git 'https://github.com/your-repo/sample-app.git'
         }
      }
   }
}

每次管道运行时,这将克隆您的存储库。

添加阶段:构建、测试和部署

我们可以通过添加构建、测试和部署应用程序的阶段来改进管道。

Jenkinsfile 示例

pipeline {
   agent any
   stages {
      stage('Clone Repository') {
         steps {
            git 'https://github.com/your-repo/sample-app.git'
         }
      }
      stage('Build') {
         steps {
            sh './build.sh' // or your build command
         }
      }
      stage('Test') {
         steps {
            sh './run-tests.sh' // Run unit tests
         }
      }
      stage('Deploy') {
         steps {
            sh './deploy.sh' // Deploy to staging
         }
      }
   }
   post {
      success {
         echo 'Pipeline completed successfully.'
      }
      failure {
         echo 'Pipeline failed.'
      }
   }
}

重要配置:

  • 使用项目特定命令更新 ./build.sh、./run-tests.sh 和 ./deploy.sh。
  • 使用电子邮件扩展等插件向团队发送通知。

此 Jenkins 管道可自动执行代码集成。它通过测试确保质量并帮助高效部署应用程序。它完美遵循 CI 原则并使开发过程更加顺畅。

持续集成的最佳实践

下表总结了持续集成的一些最佳实践 −

实践 描述 示例 / 配置
尽早并经常提交 我们应该定期向主分支提交小的更改。这样可以避免大的冲突并使集成更容易。 在 GitHub 中使用分支保护。强制频繁的拉取请求和审查。
保持快速构建 确保 CI 管道快速运行。这可以快速向开发人员提供反馈并使工作流程保持顺畅。 在 Jenkins 或 GitLab 中缓存依赖项。使用 Docker 层或构建缓存进行优化。
处理构建失败 构建失败必须立即停止管道。快速修复问题以保持代码库稳定。 将 Jenkins 设置为在测试错误时失败构建:pipeline { post { Failure { sh 'notify.sh' } }
持续反馈循环 我们应该将管道状态通知所有团队成员,如开发人员和 QA。自动警报有助于让每个人都了解最新情况。 使用 Jenkins 电子邮件或 Slack 插件在每次运行后发送有关管道结果的通知。

持续集成中的挑战

下表重点介绍了开发人员在实施持续集成时必须面对的挑战以及克服这些挑战的解决方案 −

挑战 描述 解决方案
管理合并冲突 多个开发人员经常提交可能会产生冲突。这在处理同一代码库的大型团队中很常见。 定期进行代码审查。在合并更改之前,使用 rebasing 来减少冲突。
为大型团队扩展 CI 大型团队意味着同时运行更多构建和测试。如果 CI 系统尚未准备好,这可能会使其过载。 在 Jenkins 中使用分布式构建代理。具有自动缩放功能的 GitLab 运行器也能很好地处理这个问题。
平衡速度和可靠性 快速反馈很重要。但是,如果我们跳过测试或损害构建质量,则可能会导致生产中出现问题。 使用并行管道。这可以使测试更加彻底,而不会减慢执行速度。

结论

在本章中,我们研究了持续集成 (CI) 的主要思想。我们讨论了 CI 在软件开发生命周期 (SDLC) 中的重要性。我们还介绍了经常提交代码、使用自动构建和测试等关键实践。然后,我们讨论了 CI 管道的结构。

我们还探索了 Jenkins 作为实用的 CI 工具。我们研究了有助于改进 CI 流程的最佳实践。最后,我们讨论了常见的问题,例如合并冲突和大型团队的 CI 扩展。

通过使用这些方法,团队可以加快交付速度、提高代码质量并更好地协同工作。这将有助于创建强大而高效的软件开发流程。