Java统计GitLab代码量
1、生成密钥
2、添加依赖
<dependency><groupId>org.gitlab4j</groupId><artifactId>gitlab4j-api</artifactId><version>5.3.0</version></dependency>
Java代码实现
统计所有项目的代码行数:
private String url = "gitlab的仓库地址";private String authToken = "用户的token";private GitLabApi gitLabAPI = new GitLabApi(url, authToken);/*** 统计每个项目的代码行数** @throws Exception*/@Testpublic void codeTotalCount() throws Exception {//拉取属于我的所有项目List<Project> projectList = gitLabAPI.getProjectApi().getOwnedProjects();for (Project proj : projectList) {String namespace = proj.getNamespace().getFullPath();String name = proj.getPath();String url = proj.getWebUrl();log.info("项目命名空间:{}, 项目名称:{}, 项目地址:{}", namespace, name, url);//获取项目信息包含statistics信息Project project = gitLabAPI.getProjectApi().getProject(namespace, name, true);ProjectStatistics projectStatistics = project.getStatistics();Long totalLines = projectStatistics.getRepositorySize();log.info("项目名称:{}, 代码行数:{}", name, totalLines);}}
统计某一段时间人员的代码行数:
private String url = "gitlab仓库地址";private String authToken = "用户的token";private GitLabApi gitLabAPI = new GitLabApi(url, authToken);/*** 统计人员某段时间的代码行数** @throws Exception*/@Testpublic void codeAuthorCount() throws Exception {gitLabAPI.enableRequestResponseLogging(Level.ALL);List<Project> projectList = gitLabAPI.getProjectApi().getOwnedProjects();//获取项目中的人员信息List<User> userList = getMembers("in");log.info("查询人员列表:{}", JSON.toJSONString(userList));Date start = DateUtil.parse("2023-07-01 00:00:00", "yyyy-MM-dd HH:mm:ss");Date end = DateUtil.parse("2023-10-01 00:00:00", "yyyy-MM-dd HH:mm:ss");for (User user : userList) {Integer addCode = 0;Integer delCode = 0;Integer totalCode = 0;String name = user.getName();String userName = user.getUsername();String state = user.getState();//检查用户信息,不符合要求的用户如 blocked 可进行跳过if (checkUserInfo(name, state)) {continue;}for (Project p : projectList) {List<Commit> commitList = gitLabAPI.getCommitsApi().getCommits(p.getId(), "master", start, end);for (Commit commit : commitList) {//因commit信息中没有用户的memberId信息,每个人提交信息有些缺失故进行多次判断if (userName.contains(commit.getAuthorName()) ||commit.getCommitterEmail().contains(userName) ||commit.getAuthorEmail().contains(userName)) {Commit c = gitLabAPI.getCommitsApi().getCommit(p.getId(), commit.getShortId());//添加代码行数addCode += c.getStats().getAdditions();//删除代码行数delCode += c.getStats().getDeletions();//累计修改行数totalCode += c.getStats().getTotal();}}}log.info("开始时间:{},结束时间:{},姓名:{}, 添加代码行数:{}, 删除代码行数:{}, 累计变更行数:{}", start, end, name, addCode, delCode, totalCode);}}private boolean checkUserInfo(String name, String state) {if (state.equals("blocked") ||name.contains("产品部") ) {return true;}return false;}/*** 获取项目与group中的人员信息** @param groupPath* @return* @throws Exception*/private List<User> getMembers(String groupPath) throws Exception {List<User> userList = new ArrayList<>();//获取所有组路径下的人员信息List<Group> groupList = gitLabAPI.getGroupApi().getGroups();List<Project> projectList = new ArrayList<>();for (Group g : groupList) {log.info("组名称:{}, 组路径:{}", g.getDescription(), g.getFullPath());List<Member> members = gitLabAPI.getGroupApi().getMembers(g.getId());projectList.addAll(gitLabAPI.getGroupApi().getProjects(g.getId()));for (Member m : members) {if (!checkMemberExist(userList, m)) {User user = gitLabAPI.getUserApi().getUser(m.getId());userList.add(user);}}}//获取所有Project的人员信息for (Project project : projectList) {String name = project.getPath();Long id = project.getId();log.info("项目名称:{}, 项目Id:{}", name, id);List<Member> members = gitLabAPI.getProjectApi().getMembers(id);for (Member m : members) {if (!checkMemberExist(userList, m)) {User user = gitLabAPI.getUserApi().getUser(m.getId());userList.add(user);}}}return userList;}/*** 判断人员是否已经存在** @param userList* @param m* @return*/private boolean checkMemberExist(List<User> userList, Member m) {for (User user : userList) {if (user.getId().equals(m.getId())) {return true;}}return false;}