当前位置:首页 > 技术分析 > 正文内容

java调用API操作GitLab

ruisui885个月前 (01-08)技术分析32

最近需要在一个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
 ** ---------------------------------------------------------**/
@Service
public 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<GitlabBranch> 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;//上传失败
   }
}

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/119.html

分享给朋友:

“java调用API操作GitLab” 的相关文章

「2022」打算跳槽涨薪,必问面试题及答案——VUE篇

1、为什么选择VUE,解决了什么问题?vue.js 正如官网所说的,是一套构建用户界面的渐进式框架。与其它重量级框架不同的是,vue 被设计为可以自底向上逐层应用。vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另外一方面,当与现代化工具链以及各种支持类库结合使用时,vu...

面试官:聊聊你知道的Vue与React的区别

最近面到很多大公司的时候,小编都会碰到一个很尴尬的问题,很多大公司的技术栈都是React,但是小编学的是Vue,其实从本质上来说两者都是比较优秀的前端框架,所以有些面试官会问到Vue和React的区别。小编认真整理了一些自己所知道的Vue和React的区别,给大家分享分享。1. 模板语法 vs JS...

Gitlab+Jenkins通过钩子实现自动部署web项目,图文详细教程

扩展参考:Jenkins+Gitlab通过脚本自动部署回滚web项目至集群 一:基础环境介绍及准备1):Gitlab服务器:ubuntu 192.168.152.131 ---参考搭建:Linux安装gitlab,docker安装gitlab教程2):Jenkins服务器:ubunu 192.168...

迁移GIT仓库并带有历史提交记录

迁移git仓库开发在很多时候,会遇到一个问题。GIT仓库的管理,特别是仓库的迁移。我需要保留已有的历史记录,而不是重新开发,重头再来。我们可以这样做:使用--mirror模式会把本地的分支都克隆。// 先用--bare克隆裸仓库 git clone git@gitee.com:xxx/testApp...

BuildKit 镜像构建工具

#暑期创作大赛#快速开始 对于 Kubernetes 部署,请参阅examples/kubernetes。BuildKit 由buildkitd守护进程和buildctl客户端组成。虽然buildctl客户端可用于 Linux、macOS 和 Windows,但buildkitd守护程序目前仅适用于...

双子座应用程序推出模型切换器以在Android上访问2.0

#头条精品计划# 快速导读谷歌推出了Gemini 2.0 Flash实验版,现已在其安卓应用中可用,之前仅在gemini.google.com网站上提供。新版本的15.50包含模型切换器,用户可以在设置中选择不同模型,包括1.5 Pro、1.5 Flash和2.0 Flash实验版。谷歌提醒,2.0...