Jenkins Pipeline 实现 Github 单元测试 CI流程

目录

前言

1 Pipeline

2 Github Robot

3 Pipeline配置

3.1 配置Github项目,且不允许流水线并发构建

 3.2 配置GitHub Pull Requests插件

3.3 编写Pipeline脚本

4 Github配置

4.1 配置Branches        

4.2 新建Github Robot

5 小结


前言

        接上一篇文章——单元测试 CI/CD_Swuagg的博客-CSDN博客。之前是通过“新建任务”的方式实现的单元测试CI,但遇到了如下问题或者说是需求:

  • Github单测结果可视化——需要以机器人的方式在Github展示;

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

        于是重新寻找解决方案,多种尝试这里就不赘述了,最后发现Jenkins的“新建Pipeline”比“新建任务”更强大,可定制性更高,索性再次研究Pipeline去实现Github单元测试的CI流程。

新建任务
Pipeline

1 Pipeline

Pipeline方式也叫流水线方式。首先,Pipeline需要实现之前新建任务方式已实现的功能,即:

  1. Github提交PR时,能够触发Jenkins;
  2. Jenkins在代码仓库的某个分支执行单元测试;
  3. 将单元测试结果告知Github。

其次,还需要实现:

  1. Github以机器人的形式展示单元测试结果,而不是以开发者个人名义去展示;
  2. Github实时显示Jenkins Pipeline状态;
  3. Pipeline正在执行或单测失败、异常时,不允许Github点击PR;
  4. 支持手动触发Jenkins再跑一遍流水线。

2 Github Robot

后面将详细讲述Pipeline的配置,这里先讨论下Github机器人的问题。

        我理解的Github机器人就是Github Apps,这就需要我们自己去实现,那我们可以找到网上已有的轮子吗?事实是有这个轮子,也可以说是没有,且让我慢慢道来,毕竟利用零碎时间花了好几天去寻找方案。

        (1)可以自己去创建一个Github App(创建 GitHub 应用程序 - GitHub Docs),然后使用Github API实现机器人的功能(在应用程序中使用 GitHub API - GitHub Docs)。

        (2)可以使用Probot开源机器人的方式简化创建Github App。其一,可以查找是否有现成免费的机器人可供使用(https://probot.github.io/apps/),我把这几十个Robot细看了一番,未发现符合要求的Github Commit机器人;其二,Probot也提供新建机器人的方式去实现Github App(https://probot.github.io/docs/

        (3)自己创建Github App比较麻烦,Probot开源机器人也没找到合适的,且创建Probot机器人也还是需要费一些时,而创建一个Github机器人账号的方式也未找到合适的,最后还是决定使用一种不太优雅的方式实现——单独创建一个Github小号作为机器人。

寻找方案过程:

  1. Github App
  2. Probot开源机器人
  3. 创建Github机器人账号
  4. 创建Github小号作为机器人

3 Pipeline配置

3.1 配置Github项目,且不允许流水线并发构建

 3.2 配置GitHub Pull Requests插件

        1、触发模式选择:Hooks with Persisted Data

        2、触发流水线执行的事件:(1)在Commit输入Jenkins please retry unit test;(2)PR打开时;(3)代码Commit改变时。

        3、触发流水线执行的分支:在WhiteList Target Branches中填写分支名

3.3 编写Pipeline脚本

        1、定义阶段:Init、Clone、Build、Test...

        2、setGitHubPullRequestStatus向Github发送status

        3、script可执行shell脚本,clone仓库、编译项目和执行单测等。如:

setGitHubPullRequestStatus context: 'Robot', message: 'Cloning...', state: 'PENDING'
script {
    sh '''
        if [ ! -d "BUD-Android-Global" ]; then
            echo mkdir 当前项目 and clone
            mkdir 当前项目
            git clone [email protected]:***/当前项目.git
            cd ./当前项目            
        else
            echo 当前项目 'already exists'
            cd ./当前项目
        fi         
        git pull origin master
        git checkout master
        ./gradlew clean
        ./gradlew unit_test:test
    '''
}
setGitHubPullRequestStatus context: 'Robot', message: 'Unit Test Success.', state: 'SUCCESS'
githubPRComment comment: githubPRMessage('Unit Test Success. '), statusVerifier: allowRunOnStatus("SUCCESS"), errorHandler: statusOnPublisherError("UNSTABLE")

        对应Github响应结果如下:

4 Github配置

4.1 配置Branches        

        要求在merge之前通过状态检查,下面的Status checks需要搜索用户或者用户创建的Jenkins任务、Jenkins Pipeline。(多说一句:这里之前我遇到一直没有拦截成功状态,就是没设置对,多尝试下。ps:吐槽一下,Github这里的交互也不好,没有列表可供选择)

4.2 新建Github Robot

        上文也提到,这里的Github Robot是采取曲线救国的方式。

        1、首先,需要申请一个小号,名字就叫GitRobot,并生成一个Personal access tokens。

        2、然后,在Jenkins中新建名为GitRobot的凭据,接着在系统管理-系统配置中配置Github服务器,并使用到GitRobot凭据(详细步骤可参考我的上一篇文章,有详细讲解)。

         注:这里不用配置Github的WebHook,本文3.2节配置的GitHub Pull Requests插件应该会自动帮忙创建一个WebHook。

5 小结

        Jenkins Pipeline的简单配置就分享到这了,CI/CD这条路其实也才刚刚开始,后面还有很多知识等待去探讨。

猜你喜欢

转载自blog.csdn.net/Agg_bin/article/details/125620923
今日推荐