文档章节

Gitlab基于git-hooks做checkstyle代码检测

熊大信了熊二的话
 熊大信了熊二的话
发布于 2018/08/05 09:29
字数 656
阅读 680
收藏 0

Gitlab基于git-hooks做checkstyle代码检测

描述:为了规范团队代码,在成员push代码时,做代码检测规范,不符合规范的禁止成员推送代码到服务端. 基于git-hook服务器端钩子pre-receive进行处理. 关于git hooks描述请参考: Git Hooks

git-hooks基于python脚本

在gitlab安装目录下[gitlab/embedded/service/gitlab-shell/hooks]找到pre-receive文件,修改该文件加入python代码块,示例脚本如下:

#!/usr/bin/python
#coding=utf-8
import os
import sys
import subprocess
import tempfile
import shutil
__author__ = "lance"
class Trigger(object):
   def __init__(self):
       '''
       初始化文件列表信息,提交者信息,提交时间,当前操作的分支
       '''
       self.pushAuthor = ""
       self.pushTime = ""
       self.fileList = []
       self.ref = ""
   def __getGitInfo(self):
       '''
       '''
       self.oldObject, self.newObject, self.ref = sys.stdin.readline().strip().split(' ')
   def __getPushInfo(self):
       '''
       git show命令获取push作者,时间,以及文件列表
       文件的路径为相对于版本库根目录的一个相对路径
       '''
       rev = subprocess.Popen('git rev-list '+self.newObject,shell=True,stdout=subprocess.PIPE)
       revList = rev.stdout.readlines()
       revList = [x.strip() for x in revList]
       #查找从上次提交self.oldObject之后还有多少次提交,即本次push提交的object列表
       indexOld = revList.index(self.oldObject)
       pushList = revList[:indexOld]
   pushList.reverse()
       # temp file
   tempdir = tempfile.mkdtemp('git_hook')
       #循环获取每次提交的文件列表
       for pObject in pushList:
           p = subprocess.Popen('git show '+pObject,shell=True,stdout=subprocess.PIPE)
           pipe = p.stdout.readlines()
           pipe = [x.strip() for x in pipe]
           #print("===>",pipe)   
           #验证是否java文件
       file = pipe[6].strip("diff").strip()       
       if not file.lower().endswith('.java'):
       continue        
       filename = file.split('/')[-1]
           #git get Tree
         content_hash = pipe[7].strip("index").strip()[9:16]
       content_p = subprocess.Popen('git cat-file -p '+content_hash,shell=True,stdout=subprocess.PIPE)
        cpipe = content_p.stdout.readlines()
       #print(cpipe)
           with open(os.path.join(tempdir, filename), 'w+') as fp:
       fp.writelines(cpipe)
       #self.handler_checkstyle(tempdir+"/"+content_hash+'.java')      
   # checkstyle    
       self.handler_checkstyle(tempdir)
   def getGitPushInfo(self):
       self.__getGitInfo()
       self.__getPushInfo()
if __name__ == "__main__":
   #print("argv: ", sys.argv)
   t = Trigger()
   t.getGitPushInfo()    
   exit(0)

通过获取git推送信息,并保存到临时目录文件下

通过checkstyle命令行模式检测代码是否符合配置的规则

通过java -jar启动checkstyle做代码检测, 并把不符合规范代码提示打印给客户端, 供客户端进行检测修改, 并再次进行代码推送. 代码规则定义google_checks.xml采用Google定义的检测规范, 可以做适当的修改

CheckStyle 命令行执行代码检测

# 处理java文件 
   def handler_checkstyle(self, file):
   try:
       cmd = r'java -jar /mnt/checkstyle-8.11-all.jar -c /mnt/google_checks.xml '+file+'/'
       #print(cmd)
           result = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
           rpipe = result.stdout.readlines()
       if len(rpipe)>2:
           print(rpipe)
       exit(1)
   finally:
           shutil.rmtree(file)
       #pass

代码提交后效果如下

© 著作权归作者所有

熊大信了熊二的话

熊大信了熊二的话

粉丝 40
博文 11
码字总数 5878
作品 0
上海
后端工程师
私信 提问
GitLab 8.0 正式发布,新外观和 GitLab CI

GitLab 8.0 正式发布,15 个月之前 GitLab 团队发布了 GitLab 7.0 版本,从那开始就专注于提升 GitLab 的性能。GitLab 深度集成了 LDAP,支持 Git 的大型文件。GitLab 基于此还重写了 UI,G...

oschina
2015/09/22
21.5K
37
jenkins 设置 gitlab web hooks

背景 接口自动化期望代码push后触发实现持续集成,代码push后,自动化执行jenkins的job。 步骤 准备工作 工具:jenkins,gitlab jenkins需要安装插件:git plugin,gitlab hook plugin , gi...

千往
2017/08/29
0
0
SonarQube 之 gitlab-plugin配合gitlab-ci完成每次commit代码检测

目录 背景介绍 环境、软件准备 Sonar GitLab Plugin 安装 配置使用说明 1、背景介绍 我们知道使用 SonarQube 可以在日常开发中检测代码质量,除了使用 IDE 上集成 SonarLint 插件检测外,如果...

张艺兴女朋友
2018/07/10
443
0
GitLab 7.14.2 发布,代码托管平台

GitLab 7.14.2 发布,修复的内容如下: CE: Fix errors with ISO-encoded files CE: Handle broken symlinks in create-hooks CE: Security Fix Escape user-provided content in preserved ......

oschina
2015/09/10
684
2
opensuse12.2安装gitlab详细教程

opensuse 12.2 + gitlab 4.1 #email: 187343853@qq.com #opensuse下安装gitlab, 几尽折腾, 终于弄好了, 给大家分享! #参考官方文档步骤: https://github.com/gitlabhq/gitlabhq/blob/stable/......

hxz
2013/03/06
3K
0

没有更多内容

加载失败,请刷新页面

加载更多

sync.Mutex 互斥锁

说明: 互斥锁用来保证在任一时刻,只能有一个例程访问某对象。Mutex 的初始值为解锁状态。Mutex 通常作为其它结构体的匿名字段使用,使该结构体具有 Lock 和 Unlock 方法。Mutex 可...

李琼涛
5分钟前
1
0
自建redis笔记

自建redis笔记 最近在linux安装了一下redis,特做一些笔记! 本文先单节点启动redis,然后再进行持久化配置,在次基础上,再分享搭建主从模式的配置以及Sentinel 哨兵模式及集群的搭建 单节点...

北极之北
8分钟前
2
0
扛住阿里双十一高并发流量,Sentinel是怎么做到的?

Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景 本文介绍阿里开源限流熔断方案Sentinel功能、原理、架构、快速入门以及相关框架比较 基本介绍 1 名词解释 服务限流 :当系统资源...

分布式系统架构
10分钟前
2
0
事假杨晨龙(Z16021)月薪请假单

svn co URL --username xxx-- password yyy ./

桃花飞舞
33分钟前
3
0
当Activity关闭后,网络请求回调的处理

当我们在使用网络请求的时候,一般都是通过回调来获取请求到的数据。对于网络请求的回调需要注意的几个点 比如我们的回调在Activity中处理数据,当我们把Activity关闭后,如果获取到数据时,...

shzwork
34分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部