0


单元测试 CI/CD

前言

目前做到的效果是:在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,然后选择直接安装 ![](https://img-blog.csdnimg.cn/7f917e838f5247adaf5fc6146b113f9e.png)

    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自动构建教程】

本文转载自: https://blog.csdn.net/Agg_bin/article/details/125412464
版权归原作者 Swuagg 所有, 如有侵权,请联系我们删除。

“单元测试 CI/CD”的评论:

还没有评论