单元测试 CI/CD

本文详细解析了GitHub Actions和Jenkins在CI/CD中的优缺点,展示了如何利用Jenkins进行单元测试持续集成,包括GitHub token生成、插件配置和构建流程。着重讲解了两者在选择上的关键因素及实际应用场景中的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

 1 CI/CD

1.1 什么是 CI

1.2 什么是 CD

1.3 CI/CD 流程

2 CI 平台选择

2.1 Github Actions

2.2 Jenkins

2.3 Github Actions Vs Jenkins

2.3.1 Github Actions 的优势

2.3.2 Github Action 的缺点

2.3.3 Jenkins 的优势

2.3.4 Jenkins 的缺点

2.3.5 相似之处

2.3.6 主要差异

2.4 小结

3 Unit Test CI(单元测试持续集成)

3.1 Github 生成 token

3.2 Jenkins 安装/配置 GitHub Pull Request Builder 插件

​编辑

3.3 Jenkins 配置任务

3.3.1 新建任务

3.3.2 源码管理

3.3.3 构建触发器

3.3.4 构建步骤

3.4 Github 新建webhook

3.5 后续改进

3.6 改进

4 鸣谢


前言

目前做到的效果是:在Github提Pull requests时,自动触发Jenkins执行单元测试,并将执行结果反馈给Github Pull requests页。

Unit Test CI 配置流程:


 1 CI/CD

1.1 什么是 CI

        持续集成(CI):是持续在源代码变更后自动检测、拉取、构建和单元测试的过程。

        持续集成的目标:是快速确保开发人员新提交的代码变更是正确的、可以被集成的,并且适合在代码库中进一步使用。

注:持续集成伴生的行为是持续测试。

1.2 什么是 CD

        持续交付(CD):可自动将已验证的代码发布到存储库。

        持续交付的目标:是拥有一个可随时部署到生产环境的代码库。

        持续部署(CD):可自动将应用发布到生产环境。

注:持续交付和持续部署,是持续通过自动化Pipeline的方式,发布制品到使用环境中的行为。这两个有时会交叉使用,没必要纠结于这些语义。

1.3 CI/CD 流程

        CI/CD流程:又称为CI/CD流水线,持续交付流水线。

        持续交付涵盖了从需求、设计、开发、构建、测试、上线整个过程的流程、工具、方法、平台化的输入以输出。

2 CI 平台选择

        从2018年10月 Github Actions 出现后,很多文章讨论CI的平台选择,是Github Actions,还是Jenkins。

2.1 Github Actions

        Github Actions是一个事件驱动(Push,Pull requests等)的持续集成和持续交付工具,可让您自动化构建、测试和部署应用程序到各种环境的过程。

        换句话说,GitHub 把CI/CD的很多操作,比如抓取代码、运行测试等,叫做Actions。开发者可以自己写action,也可使用其他开发者提供的action,那么整个CI/CD过程,就变成了多个 actions 的组合,这就是Github Actions。

2.2 Jenkins

        Jenkins 是一个用 Java 编写的开源自动化服务器,用于自动化持续构建、测试和部署软件项目的工作流。

        Jenkins主要通过丰富的插件来实现CI/CD,下图代表一个简单的 Jenkins 工作流,它从 Github 中提取代码,从代码中构建一个 docker 镜像,然后对其进行测试并进一步推送到远程存储库 DockerHub。

2.3 Github Actions Vs Jenkins

        Jenkins 和 GitHub Actions 都可创建能自动构建、测试、发布、发行和部署代码的工作流程。一般对多数的公司来说,不需要自己研发一个 CI 平台,而且工具之间并没有绝对的差异优势,这里只是客观阐述这两者的关联与异同。

2.3.1 Github Actions 的优势

  • 易于使用: Github Actions 对初学者非常友好。您只需一个 YAML 文件即可开始使用。对于初创公司/小型公司,您的开发人员可能已经对 YAML 有所了解,因此 Github Actions 作为 CI/CD 平台是一个合乎逻辑的选择。

  • 设置和维护:使用 Jenkins,您将在自定义服务器上运行它。这意味着您必须持续维护 Jenkins 服务器。但是,Github Actions 为您提供了可用于执行 CI/CD 操作的免费运行器。这些运行器由 Github 拥有和维护,但您也可以添加自托管运行器。

2.3.2 Github Action 的缺点

  • 锁定:使用 Github Actions,您或多或少地与 Github 作为源代码管理系统联系在一起。使用 Jenkins 允许您将代码存储在 Github、Gitlab、BitBucket 等的任何存储库中。

  • 成熟度: Jenkins 已经存在并且比 Github Actions 更成熟。Github 操作相对较新,因此社区支持较少。

2.3.3 Jenkins 的优势

  • 使用 Jenkins 的优点之一是它是开源和免费的,不像其对应的 Github Actions 是免费增值”。

  • 插件可用于支持缓存,其中来自先前构建的文件被缓存并在需要时在新构建中重新实现。

2.3.4 Jenkins 的缺点

  • Jenkins 有很多插件提供给用户,不幸的是,其中一些插件并没有被开发人员经常维护。因此有必要在使用前检查插件是否支持正确。

  • 它高度依赖插件,有时很难找到插件的基本功能。

  • 您必须自己维护和管理 Jenkins 基础架构。

  • 由于服务器上负载的不确定性,在远程(云)服务器上管理Jenkins的成本可能无法预测这些负载包括代码量、人工制品量、提交次数等。

2.3.5 相似之处

  • Jenkins 使用 Declarative Pepeline 创建工作流程,这些工作流程类似于 GitHub Actions 工作流程文件。

  • Jenkins 使用阶段运行步骤集合,而 GitHub Actions 则使用作业来分组一个或多个步骤或单个命令。

  • Jenkins 和 GitHub Actions 支持基于容器的构建。

  • 步骤或任务可以重复使用并与社区共享。

2.3.6 主要差异

  • Jenkins 有两种类型的语法用来创建管道:Declarative Pipeline 和 Scripted Pipeline。 GitHub Actions 使用 YAML 创建工作流程和配置文件。

  • Jenkins 部署通常是自托管的,用户在自己的数据中心维护服务器。 GitHub Actions 通过托管自己可用于运行作业的运行器提供混合云方法,同时也支持自托管运行器。

Github Actions vs Jenkins:进一步的比较如下表所示:

 

  • GitOps 是使用源版本控制平台 Git 管理基础架构和配置的实践。

  • 异步集成仅意味着同时执行构建,从而使工作流程更快。至于 Jenkins,同步构建是主要内容。

  • Ad Hoc Workflow:对于在 Github Actions 中发生的构建,它会监视 git 事件触发器。另一方面,Jenkins 可以执行许多作业,例如:运行 bash 脚本、maven buildsm powershell 等。如果您需要运行作业以按顺序定期运行而不链接到代码库,那么 Jenkins 能够做到这一点。

2.4 小结

        基于Jenkins的成熟性,以及工程编译Unity的复杂性,我们最终选择的Jenkins作为CI/CD的工具。

3 Unit Test CI(单元测试持续集成)

        目前做到的效果是:在Github提Pull requests时,自动触发Jenkins执行单元测试,并将执行结果反馈给Github Pull requests页。

        下面主要详细阐述使用GitHub pull request时Jenkins自动构建的配置过程,对于Jenkins环境的搭建和配置,此处就不赘述了。

3.1 Github 生成 token

        GitHub上点击个人头像,依次选择Settings > Developer settings > Personal access tokens, 点击Generate new token按钮进入新Token生成页面,勾选如图选项,点Generate token按钮生成Token并将生成的Token复制保存。        

3.2 Jenkins 安装/配置 GitHub Pull Request Builder 插件

        1、Jenkins > 系统管理 > 插件管理 > 可选插件,搜索GitHub Pull Request Builder,然后选择直接安装 

        2、在Jenkins中添加Credentials,Kind处选择Secret text, Secret处填写GitHub的Token,后面配置GitHub Pull Request Builder时需要用到它。

        3、然后再使用GitHub的用户名和密码创建另一个Credentials,后面配置任务的时候会用到。当然如果你已经添加过了,就不用再配置。

        4、然后在 jenkins > 系统管理 > 系统设置 > GitHub Pull Request Builder如下配置

        GitHub Server API URL: 默认为 https://api.github.com , 企业版填写 https://域名/api/v3/。

        Credentials: 选择之前用GitHub生成的token创建的Credentials。

        填好上面的内容后,可以通过下方的Connect to API 按钮验证连接GitHub是否正常,Check repo permissions按钮验证权限。

3.3 Jenkins 配置任务

3.3.1 新建任务

        1、新建一个自由风格的任务,然后配置该任务

        2、将项目的GitHub URL添加到GitHub 项目处(可以输入到浏览器中的项目) 

3.3.2 源码管理

        在配置源码管理中添加代码在GitHub中的地址,Credentials处选择上面用GItHub的账号和密码创建的Credentials。

 

  • Refspec:

    • 如果只想构建PR,请将refspec设置为+refs/pull/${ghprbPullId}/*:refs/remotes/origin/pr/${ghprbPullId}/*

    • 如果你想构建PR和分支,请将refspec设置为 +refs/heads/*:refs/remotes/origin/* +refs/pull/${ghprbPullId}/*:refs/remotes/origin/pr/${ghprbPullId}/*

  • 指定分支: 填写 ${sha1}, 如果想要用到提交的pr,则这个地方填写 ${ghprbActualCommit}

3.3.3 构建触发器

        在构建触发器中添加管理员名单,勾选Use github hooks for build triggering并点击后面的高级按钮,White list中添加针对这个任务允许进行pull request的GitHub用户账号。

3.3.4 构建步骤

        1、构建这里根据自己的项目情况选择合适的构建工具,我的项目使用Gradle构建的所以选择的是Invoke Gradle script。

        2、如果添加了Set build status to “pending” on GitHub commit这个构建步骤,那么在构建的时候GItHub项目的Pull requests中会显示pending状态。 

3.4 Github 新建webhook

        1、在GitHub对应的项目远程仓库,Settings > Webhooks中,新建一个webhook, 按下图填写Jenkins地址。

        2、选中Let me select individual events,勾选Pull requests选项。 

        3、如果GitHub能够正确连接Jenkins,那么Recent Deliveries下面会有一条没有报错的记录。 

        4、到此,配置就完成了。下面往项目的某个分支发一个pull request测试。发PR后GitHub上显示pending check状态 

        5、Jenkins上成功触发了一次构建 

        6、当成功构建后,GitHub上面的状态修改成successful checks。 

3.5 后续改进

  • Github单测结果可视化

  • Github单测结果失败或异常时,不允许PR

  • Github支持跳转Jenkins具体构建任务

  • ...

3.6 改进

        Github支持跳转Jenkins具体构建任务:

4 鸣谢

        【什么是 CI/CD?一文带你理解CI持续集成和CD持续交付/部署 - 红帽

        【faun.pub

        【GitHub pull request时Jenkins自动构建教程

03-14
<think>好的,我现在需要处理用户关于CI/CD原理及实现流程的查询。首先,我得确认用户的需求是什么。他们提到了想了解CI/CD的概念或实现方法,特别是原理和流程。根据用户的引用内容,他们可能已经接触过一些基础信息,但需要更系统的解释。 首先,我要回顾CI/CD的基本概念。CI是持续集成,CD可以是持续交付或持续部署。需要区分这三个术语,并解释它们之间的关系。用户提供的引用[1]提到CI/CD阶段涉及人员、过程和技术,这可能是一个结构化的切入点。此外,引用[2]提到GitLab CI/CD的触发机制,这可以作为实现方法的一个例子。 接下来,我需要组织回答的结构。用户希望结构清晰,分步解释。可能需要分为原理和实现流程两部分。原理部分要涵盖CI和CD的核心目标,比如自动化测试、快速反馈、减少手动干预等。实现流程则可以按照阶段来划分,如代码提交、构建、测试、部署等,并结合引用中的内容,比如CI/CD管道被触发的条件。 还要注意用户提到的系统级指令,比如使用正确的中文,数学公式的格式,但这里可能不需要数学公式,不过要确保LaTeX正确。同时,生成相关问题,可能需要考虑CI/CD的不同方面,如工具选择、优化方法、与DevOps的关系等。 需要检查用户提供的引用内容是否相关。引用[1]讨论了CI/CD的阶段和管道的重要性,引用[2]提到了触发CI/CD管道的机制。这些可以作为支持材料,在回答中适当引用,以增强可信度。 可能存在的一个问题是,用户引用的内容似乎部分与CI/CD相关,但引用[1]提到“CI/CD阶段:了解人员、过程和技术”,而引用[2]是关于GitLab CI/CD的触发方式。需要确保在回答中正确引用这些内容,比如在解释流程时提到自动化触发,或者在讨论阶段时引用[1]。 另外,用户要求生成相关问题,需要确保问题涵盖原理、实现细节、工具、挑战等方面,以帮助用户进一步探索。例如,可能的问题包括CI/CD管道的组成部分、如何选择工具、与传统方法的对比等。 最后,要确保回答符合格式要求:使用中文,结构清晰,分点说明,引用标识自然添加。避免使用Markdown格式,但用户提供的示例中有代码块,可能需要用类似的格式展示CI/CD流程的示例,但根据系统指令,用户可见层可能需要避免代码块,或者用文字描述。需要再次检查系统指令,用户可见层是否允许代码块。根据示例,用户可见层中的回答可以有代码块,比如示例中的Python代码,所以在实现流程中可以加入一个YAML配置示例,比如GitLab CI/CD的.gitlab-ci.yml文件示例,用代码块展示。 总结步骤: 1. 定义CI/CD及其核心概念。 2. 分原理和实现流程两部分详细说明。 3. 结合引用内容,如CI/CD阶段和触发机制。 4. 提供实现流程的步骤,并附上示例代码块。 5. 生成相关问题,覆盖原理、工具、优化等。</think>### CI/CD 原理及实现流程 #### 一、CI/CD 核心概念 **CI(持续集成)** 是频繁将代码变更合并到主干分支的过程,通过自动化构建和测试快速发现错误,确保代码质量[^1]。 **CD(持续交付/持续部署)** 是 CI 的延伸: - **持续交付**:自动将已验证的代码部署到类生产环境,但需手动触发最终发布。 - **持续部署**:完全自动化地将代码发布到生产环境,无需人工干预。 #### 二、实现原理 1. **自动化流程** CI/CD 通过工具链(如 GitLab CIJenkins)实现代码提交→构建→测试→部署的全流程自动化,减少人为错误并提升效率[^2]。 2. **快速反馈机制** 每次代码提交触发自动化测试,开发者可即时修复问题,避免缺陷累积。 3. **环境一致性** 使用容器化技术(如 Docker)或配置管理工具(如 Ansible),确保开发、测试、生产环境的一致性。 #### 三、典型实现流程 1. **代码提交与触发** 开发者将代码推送到远程仓库(如 GitLab),触发 CI/CD 管道[^2]。 ```yaml # GitLab CI 示例 (.gitlab-ci.yml) stages: - build - test - deploy build_job: stage: build script: - echo "编译代码..." - make build test_job: stage: test script: - echo "运行单元测试..." - make test deploy_job: stage: deploy script: - echo "部署到生产环境..." - make deploy ``` 2. **构建阶段** 编译代码并生成可执行文件或容器镜像。 3. **测试阶段** 执行单元测试、集成测试、安全扫描等。 4. **部署阶段** 根据策略自动部署到指定环境(如测试环境、生产环境)。 #### 四、核心价值 - **缩短交付周期**:自动化减少手动操作,加速迭代[^1]。 - **提高软件质量**:早期间题发现降低修复成本。 - **支持 DevOps 协作**:打通开发与运维团队间的壁垒。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值