跳过正文
  1. Posts/

通过 Jenkins 定期自动给老板提供 Git 仓库的多维度代码分析报告

·1045 字·3 分钟· ·
沈显鹏
作者
沈显鹏
目录

上一篇(GitStats - Git 历史统计信息工具),我已经给老板提供了他想看的所有仓库的 Git 提交历史分析报告了,并且把报告都部署到了一台虚拟机的 tomcat 上了,老板可以通过网址访问直接查看每个仓库的分析报告了,看看谁的贡献大,谁活跃,谁偷懒了,谁周末写代码了(这里不鼓励 996)。

最近老板提需求了。

老板:你弄个这个网址的数据咋不更新呢?报告上咋没见你们提交代码呢? 小开:老板儿,您看到这些一个个仓库的数据都是小开我人肉手动生成的,要不您给我点时间,我来做个自动化任务吧。

我这么积极主动,不是我奉承老板,我心里也知道老板如果觉得 Git Stats 这个工具好用,肯定希望看到的分析报告是最新的。既然老板先提了,那我就别磨蹭了,赶紧干吧。

不过用啥实现呢?肯定是 Jenkins 了。一来我已经在 Jenkins 上做了很多的自动化任务了,轻车熟路;二来使用同一套系统不但可以减少繁多的系统入口,降低学习成本,也提高 Jenkins 服务器的利用率。

设身处地的考虑了下老板的使用需求,他肯定不希望自己去 Jenkins 服务器上去运行 Job 来生成这个Git 仓库的多维度代码分析报告,那么,如果我是老板,我希望:

  1. 这个 Jenkins 任务要定期执行,不需要太频繁,一周更新一次就行;
  2. 另外还要支持对单独仓库的单独执行,一旦老板要立即马上查看某个仓库的的分析报告呢。

最后实现的效果如下:

手动执行
#

老板可以勾选他最关心的代码仓库进行更新

每周末定时执行
#

老板在周一上班就能看到最新的分析数据了,可以看到这个任务 Started by timer

最终的 Jenkinsfile 是这样的
#

pipeline{
  agent{
    node {
      label 'main-slave'
      customWorkspace "/workspace/gitstats"
    }
  }

  environment {
    USER_CRE = credentials("d1cbab74-823d-41aa-abb7")
    webapproot = "/workspace/apache-tomcat-7.0.99/webapps/gitstats"
  }

  parameters {
    booleanParam(defaultValue: true, name: 'repo1', summary: 'uncheck to disable [repo1]')
    booleanParam(defaultValue: true, name: 'repo2', summary: 'uncheck to disable [repo2]')
  }

  triggers {
    cron '0 3 * * 7'    # 每周日早上进行定时运行,因此此时机器是空闲的。
  }

  options {
    buildDiscarder(logRotator(numToKeepStr:'10'))
  }

  stages{
    stage("Checkout gitstats"){
      steps{
        # 准备存放 html 报告目录
        sh "mkdir -p html"
        # 下载 gitstats 代码
        sh "rm -rf gitstats && git clone https://github.com/hoxu/gitstats.git"
      }
    }
    stage("Under statistics") {
      parallel {
        stage("reop1") {
          when {
            expression { return params.repo1 }  # 判断是否勾选了
          }
          steps {
            # 下载要进行分析的仓库 repo1
            sh 'git clone -b master https://$USER_CRE_USR:"$USER_CRE_PSW"@git.software.com/scm/repo1.git'
            # 进行仓库 repo1 的历史记录分析
            sh "cd gitstats && ./gitstats ../repo1 ../html/repo1"
          }
          post {
            success {
              # 如果分析成功,则将分析结果放到 apache-tomcat-7.0.99/webapps/gitstats 目录下
              sh 'rm -rf ${webapproot}/repo1 && mv html/repo1 ${webapproot}'
              # 然后删掉 repo1 的代码和 html 报告,以免不及时清理造成磁盘空间的过度占用
              sh "rm -rf repo1"
              sh "rm -rf html/repo1"
            }
          }
        }
      }
      stage("repo2") {
          when {
            expression { return params.repo2 }
          }
          steps {
            sh 'git clone -b master https://$USER_CRE_USR:"$USER_CRE_PSW"@git.software.com/scm/repo2.git'
            sh "cd gitstats && ./gitstats ../repo2 ../html/repo2"
          }
          post {
            success {
              sh 'rm -rf ${webapproot}/repo2 && mv html/repo2 ${webapproot}'
              sh "rm -rf repo2"
              sh "rm -rf html/repo2"
            }
          }
        }
      }
    }
  }
  post{
    always{
      # 总是给执行者分送邮件通知,不论是否成功都会对工作空间进行清理
      script {
        def email = load "vars/email.groovy"
        email.build(currentBuild.result, '')
      }
      cleanWs()
    }
  }
}

最后
#

如果你是测试、DevOps或是从事研发效能方面的工作,那么利用好开源工具,比如 Jenkins 和 Git Stats 就可以快速帮助老板或是你自己提供一个 Git 仓库的多维度代码分析报告,有助于更加了解产品的代码情况。

相关文章

Git 历史统计信息生成器
·1133 字·3 分钟
GitStats,一个用 Python 编写的 Git 历史统计信息生成工具,能够生成详细的代码提交统计报告,帮助开发者分析项目活跃度和贡献者情况。
Git 提交合并(Squash)
·296 字·1 分钟
介绍如何将多个 Git 提交合并为一个提交,包括本地和已推送到远程的情况,分别使用交互式 rebase 和在 Bitbucket 中的合并策略。
Git 分支策略
·772 字·2 分钟
介绍大型项目的 Git 分支策略,包括 master、develop、release 和 hotfix 分支的作用和使用方法,帮助团队更好地管理代码和版本发布。
通过 Jenkins 来提交修改的代码 git push by Jenkins
·439 字·1 分钟
如何通过 Jenkins Pipeline 脚本来提交修改的代码到 Git 仓库,包括克隆仓库、修改代码和推送更改等步骤。
Git 管理
·324 字·1 分钟
本文介绍了 Git 的常见管理操作,包括分支管理、提交规范、代码审查等,帮助开发者更好地使用 Git 进行版本控制。
Error: Permission denied (publickey)
·276 字·1 分钟
本文介绍了如何在配置多个 SSH Git Key 时解决 “Permission denied (publickey)” 错误,确保 GitHub 和 Bitbucket 的 SSH 连接正常工作。