最近需要在一个WEB项目中集成GitLab,用到了GitLab的API操作,在网上找了很久都是说直接调用GitLab的Http接口,而且API官方只有javadoc没有其它说明文档,特别记录下,以备查询。这里采用Token的认证方式,因此需要先登陆GitLab新建一个Token,创建方式如下:
创建完成以后,就可以在API中通过Token进行登陆并操作该GitLab服务了,以下是源码
package org.noka.gitlab.gitlab.service;import org.apache.commons.codec.binary.Base64;import org.gitlab.api.GitlabAPI;import org.gitlab.api.models.GitlabBranch;import org.gitlab.api.models.GitlabProject;import org.gitlab.api.models.GitlabRepositoryFile;import org.gitlab.api.models.GitlabSimpleRepositoryFile;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;import org.springframework.web.multipart.MultipartFile;import java.util.List;/** ------------------------------------------------------------ * GitLab 操作服务 * 包含分支创建,获取分支列表,上传文件,下载文件 * 依赖于java-gitlab-api 4.1.1 * @author xiefangjian@163.com * @version 1.0.0 ** ---------------------------------------------------------**/@Servicepublic class GitLabService { private static Logger logger = LoggerFactory.getLogger(GitLabService.class); @Value("${gitlab.token}") private String token; //GitLab Token,这里用gitlab的token连接,也可以用用户名和密码连接 @Value("${gitlab.url}") private String url; //GitLab 服务器地址 @Value("${gitlab.projectid}") private String projectid; //项目ID /** * 创建分支 * @param name 新分支的名称 * @param ref 分支来源 * @return 分支创建成功返回true,创建失败返回false */ public boolean createBaranche(String name,String ref){ try { GitlabAPI api = GitlabAPI.connect(url, token);//连接服务器 api.setConnectionTimeout(200);//设置连接超时 GitlabProject gp = api.getProject(projectid);//根据项目ID切换到指定项目的仓库 //以上部分代码也可以在spring中通过注解引入 api.createBranch(gp,name,ref);//在指定项目下创建分支 return true;//创建成功 }catch (Exception ex){ logger.error(ex.getMessage()); } return false;//创建失败 } /** * 获取分支列表 * @return 成功时返回分支列表,失败返回null */ public List getListBranches(){ try { GitlabAPI api = GitlabAPI.connect(url, token);//连接服务器 api.setConnectionTimeout(200);//设置连接超时 GitlabProject gp = api.getProject(projectid);//根据项目ID切换到指定项目的仓库 return api.getBranches(gp);//获取所有分支 }catch (Exception ex){ logger.error(ex.getMessage()); } return null;//获取失败时返回null } /** * 下载文件 * @param path 文件路径 * @param ref 文件所在分支 * @return 成功返回文件内容,失败返回null */ public byte[] getFile(String path,String ref){ try { GitlabAPI api = GitlabAPI.connect(url, token);//连接服务器 api.setConnectionTimeout(200);//设置连接超时 GitlabProject gp = api.getProject(projectid);//根据项目ID切换到指定项目的仓库 GitlabRepositoryFile gfile = api.getRepositoryFile(gp,path,ref);//根据项目,路径,分支获取具体的文件内容 Base64 bs = new Base64();//Base64转换工具类,依赖于commons-codec 1.14 return bs.decode(gfile.getContent());//从GitLab上获取的文件是以Base64字符串形式返回的,需要转成byte[] }catch (Exception ex){ logger.error(ex.getMessage()); } return null;//失败返回null } /** * 上传文件 * @param branch 需要上传到具体哪个分支 * @param path 文件在GitLab上的路径,可以有多级目录如/doc/man/等,如果目录不存在会自动创建 * @param msg 文件上传备注 * @param file 文件对象 * @return 成功返回true 失败返回false */ public boolean upfile(String branch,String path,String msg,MultipartFile file){ try { GitlabAPI api = GitlabAPI.connect(url, token);//连接服务器 api.setConnectionTimeout(200);//设置连接超时 GitlabProject gp = api.getProject(projectid);//根据项目ID切换到指定项目的仓库 Base64 bs = new Base64();//Base64转换工具类,依赖于commons-codec 1.14 String body = bs.encodeAsString(file.getBytes());//文件内容,GitLab只接受Base64字符串的文件内容,这里需要将文件转换成Base64字符串上传 try { GitlabSimpleRepositoryFile gf = api.createRepositoryFile(gp, path+"/" + file.getOriginalFilename(), branch, msg, body);//上传文件 }catch (Exception es) {//文件存在 logger.error(path+"/" + file.getOriginalFilename()+" 所传文件已经存在,执行更新操作"); api.updateRepositoryFile(gp, path+"/" + file.getOriginalFilename(), branch, msg, body);//更新文件 } return true;//上传成功 }catch (Exception ex){ logger.error(ex.getMessage()); } return false;//上传失败 }}