Java 调用 GitLabAPI 获取仓库里的文件件 提交记录

1. 需求

项目组 需要做统计,获取每个开发人员的代码提交次数,提交时间,提交人等等,因代码在GitLab上管理,所以需要调用GitLabAPI来获取。

2. 开发

API官网:https://docs.gitlab.com/ee/api/

2.1 创建自定义令牌

自定义令牌是为了后续接口访问有权限而建立的。
创建 GitLab 个人访问令牌的方法如下:

  1. 在任何页面的右上角,单击您的个人资料照片,然后单击 “Settings(设置)”。
  2. 在左侧边栏中,单击 “Developer settings(开发者设置)”。
  3. 在左侧边栏中,单击 “Personal access tokens(个人访问令牌)”。
  4. 单击 “Generate new token(生成新令牌)”。
  5. 给令牌一个描述性名称。
  6. 选择要授予此令牌的作用域或权限。
  7. 要使用令牌从命令行访问仓库,请选择 “repo(仓库)”。
  8. 单击 “Generate token(生成令牌)”。
  9. 单击 “将令牌复制到剪贴板”。

请注意,离开此页面后,您将无法再次看到令牌,所以一定要保留好令牌。像对待密码一样对待您的令牌,确保其机密性。

2.2 找项目ID

第一步需要找项目的ID,这个不知道怎么找,我的方法是在gitlab项目上打开F12看控制台,看他们的接口访问的适合用的ID。
如图:110 就是项目ID,拿着项目ID能办很多事儿。
Java 调用 GitLabAPI 获取仓库里的文件件 提交记录_第1张图片

2.3 调接口

直接上代码了:

@Slf4j
@Service
public class GitLabApiCallService {

    @Resource(name = "initRestTemplate")
    private RestTemplate restTemplate;

    /**
     * 获取 项目下的文件 下的文件
     * @return
     */
    public JSONArray getTree(Integer page) throws Exception{
        String gitLabToken = ModelConfig.getGitLabToken();
        String gitLabApiUrl = ModelConfig.getGitLabApiUrl();
        String projectId = "110";
        String directoryPath = "aaaaa";
        String baseUrl = String.format("%s/projects/%s/repository/tree?ref=master&path=%s&per_page=100&page="+page,
                gitLabApiUrl,projectId,directoryPath);
        // 设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
        headers.set("Private-Token",gitLabToken);
        HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(null, headers);
        // 执行
        log.debug("url:{} , requestEntity: {} ", baseUrl, requestEntity);
        ResponseEntity<String> response = restTemplate.exchange(baseUrl, HttpMethod.GET, requestEntity, String.class);
        // 处理返回值
        if (response.getStatusCode() == HttpStatus.OK) {
            log.info("GET request successful");
            String body = response.getBody();
            if(StrUtil.isNotBlank(body)){
                JSONArray jsonArray = JSONArray.parseArray(body);
                log.debug("结果:{}",jsonArray);
                return jsonArray;
            } else {
                return null;
            }
        } else {
            log.error(" GET request failed");
            return null;
        }
    }

    /**
     * 查看提交记录
     * @return
     */
    public JSONArray getCommit(String filePath)  throws Exception {
        String gitLabToken = ModelConfig.getGitLabToken();
        String gitLabApiUrl = ModelConfig.getGitLabApiUrl();
        String projectId = "110";
        String directoryPath = "aaaa";
        Integer per_page = 201000;
        String baseUrl = String.format("%s/projects/%s/repository/commits?ref_name=master&path=%s",
                gitLabApiUrl,projectId,filePath);
        // 设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
        headers.set("Private-Token",gitLabToken);

        // 绑定请求头
        HttpEntity<String> requestEntity = new HttpEntity<>(null, headers);

        // 执行
        log.debug("url:{} , requestEntity: {} ", baseUrl, requestEntity);
        ResponseEntity<String> response = restTemplate.exchange(baseUrl, HttpMethod.GET, requestEntity, String.class);
        // 处理返回值
        if (response.getStatusCode() == HttpStatus.OK) {
            log.info("GET request successful");
            String body = response.getBody();
            if(StrUtil.isNotBlank(body)){
                JSONArray jsonArray = JSONArray.parseArray(body);
                log.debug("结果:{}",jsonArray);
                return jsonArray;
            } else {
                return null;
            }
        } else {
            log.error("GET request failed");
            return null;
        }
    }
}

String gitLabToken = ModelConfig.getGitLabToken();
String gitLabApiUrl = ModelConfig.getGitLabApiUrl();
这些都是配置的全局变量,可以根据自己的环境配置。

上面的代码只是个例子:很多接口类同。

需要注意的是分页最多返回100条,如果需要获取全部数据,需要自己写递归啊循环啊啥的怎么方便怎么来。

若有错误,希望大佬指出。
对你有帮助给点个再走呗。

你可能感兴趣的:(java,java,python,运维,gitlab)