一、背景:
需要对当前公司所有的项目进行代码行数的统计
二、 可实现方式
1.脚本:通过git脚本将所有的项目拉下来并然后通过进行代码行数的统计
样例:- echo 创建项目对应的文件夹
- mkdir 项目名称echo 切到创建的文件夹中
- cd 项目名称echo 进行git初始化
- git init
- echo 添加远程仓库
- git remote add origin 项目地址
- git fetch origin
- git checkout -b master origin/master
- echo 切换检出的分支为master
- git branch
- echo 拉取项目代码
- git pull origin master
- echo 将项目名称追加输出到上级目录的projectCount.txt文件中注意逗号分隔
- echo 项目名称, >> ../projectCount.txt
- echo 使用git命令统计该项目的代码行数并将结果追加到上级目录的projectCount.txt文件中
- git ls-files | xargs cat | wc -l >> ../projectCount.txt
- cd ..
- echo 创建项目对应的文件夹
- mkdir 项目名称
- ...
- 将该代码保存成sh脚本,在gitbash命令行执行
复制代码 将所有的项目进行脚本处理之后便可以得到一张项目名称,代码行数的txt文件,因为以逗号分隔故转换成csv文件后可以复制到excel中进行统计排序处理
2.gitlab提供的有标准的API接口可以通过调用API的方式进行统计
在网上进行一番的搜索发现已经有封装好的SDK包添加maven依赖后可以直接使用
样例:
引入maven依赖,如果需要其他的版本可以到github上面找到对应的版本:https://github.com/gitlab4j/gitlab4j-api- <dependency>
- <groupId>org.gitlab4j</groupId>
- <artifactId>gitlab4j-api</artifactId>
- <version>5.3.0</version>
- </dependency>
复制代码 统计所有项目的代码行数:
- private String url = "gitlab的仓库地址";
- private String authToken = "用户的token";
- private GitLabApi gitLabAPI = new GitLabApi(url, authToken);
- /**
- * 统计每个项目的代码行数
- *
- * @throws Exception
- */
- @Test
- public 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
- */
- @Test
- public 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;
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |