likes
comments
collection
share

GitLab Open Api 到底能帮助我们干什么

作者站长头像
站长
· 阅读数 14

GitLab Open Api 到底能帮助我们干什么?

Gitlab界面不是这些都是可视化的,我点击New subgroup按钮后可以创建一个仓库分组,我点击New Project可以创建一个空的仓库,我想创建分支(Branches)、标签(tags)都使用命令行或者直接再界面点击点击就创建了,什么场景下会需要用到他的API呢?以下是GitLab开放接口的一些常见功能作用介绍

GitLab开放接口(API)提供了一组功能丰富的端点和方法,允许开发者通过编程方式与GitLab进行交互。以下是一些可以通过GitLab开放接口实现的常见功能:

  1. 仓库管理:你可以使用GitLab API来创建、删除和修改仓库,包括分支、标签、合并请求等。

  2. 用户管理:通过GitLab API,你可以管理用户账户,例如创建新用户、更新用户信息、重置密码等。

  3. 项目协作GitLab API可以帮助你获取、创建和管理合并请求、问题、评论等,从而实现项目的协作开发和问题跟踪。

  4. CI/CD集成:你可以使用GitLab API与CI/CD流水线进行集成,例如触发构建、获取流水线状态、获取构建日志等。

  5. 权限管理:通过GitLab API,你可以管理用户、组织和项目的访问权限,例如添加、删除和修改用户的角色和权限设置。

  6. 数据查询GitLab API提供了丰富的查询功能,例如获取仓库列表、获取提交历史、搜索代码等。

简单说就是能通过脚本调Gitlab Open Api能解决你繁琐的需要使用界面、或者指令一直重复的创建项目、创建分支。帮助你通过某个时机打tags,触发gitci等。

使用GitLab Open Api

我前几年使用的是gitlab这个npm包, 能减化使用方式,现在已经废弃,现在使用@gitbeaker/rest, 用法基本一致。@gitbeaker/rest对Node 版本要求较高 v18+。

基本示例:

import { Gitlab } from '@gitbeaker/rest';

const api = new Gitlab({
  host: 'http://example.com',
  token: 'personaltoken',
});

// Listing users
let users = await api.Users.all();  

// Or using Promise-Then notation
api.Projects.all().then((projects) => {
  console.log(projects);
});
  • host 就是你的gitlab服务;
  • token 可以通过点击头像,选择Edit profile,在选择Access Tokens,填入token name,等信息然后点击Create personal access token生产token。

由于我本机的node环境没有那么高,就不再麻烦使用@gitbeaker/rest,我下面就使用gitlab这个npm包一步一步带你实现如何使用起来开放api。

首先呢,咱们简单搭建一个node服务环境,如下:

// app.js
const Koa = require('koa')
const app = new Koa()
const router = require('./router/routes') // 在下面
const koaLogger = require('koa-logger') // 输出请求日志:koa-logger
const cors = require('kcors')
const json = require('koa-json')
const bodyParser = require('koa-bodyparser') // body解析器:koa-bodyparser


app.use(cors({ credentials: true }))       //允许跨域,并且允许附带cookie
app.use(koaLogger())
app.use(bodyParser());
app.use(json())

// 加载路由
router(app)

app.listen(5000, () => {
  console.log(`server is running at http://localhost:${5000}`)
})

router.js

// router.js
const Router = require('koa-router')
const gitCtrl = require('../controller/git-controller')

module.exports = app => {
    const router = new Router()
    const apiRouter = new Router()
    router.get('/', async (ctx, next) => {
      ctx.type = 'text/html'
      ctx.body = `<h1>这里是Koa首页</h1>`
    })
    apiRouter.get('/projectList', gitCtrl.getProjectList)      // 获取项目列表
    apiRouter.get('/branches/:id', gitCtrl.getBranches)      // 获取分支
    apiRouter.get('/tags/:id', gitCtrl.getTags)      // 获取tags
    apiRouter.post('/project/add', gitCtrl.createProject)      // 创建项目
    apiRouter.post('/group/add', gitCtrl.createGroup)   // 创建组
    //设定api路由为router的子路由
    router.use('/api', apiRouter.routes(), apiRouter.allowedMethods())
    //如果匹配不到路由则返回404
    router.all('/*', async (ctx, next) => {
      ctx.response.status = 404;
      ctx.response.body = `<h1>page not found!</h1>`
    })
    app.use(router.routes()).use(router.allowedMethods())
}

上面定义了几个api接口: 获取项目列表(/api/projectList Get)获取分支(/api//branches/1111 Get)获取tags(/api//tags/1111 Get)创建项目(/api/project/add Post)创建仓库组(/api/group/add Post)几个使用GitLab Open Api的示例带着大家学习。

controller

// controller
const gitService = require('../service/git-service')

const result = {
  error(msg, data) { 
		return data ? { code: 100, msg: msg, data: data } : { code: 100, msg: msg }
	},
	success(msg, data) {
		return { code: 200, msg: msg, data: data }
	}
}
module.exports = {
  getBranches: async (ctx) => {
    const { id } = ctx.params
    const models = await gitService.getBranches(id)
    ctx.body = result.success('获取成功', models)
  },

  getTags: async (ctx) => {
    const { id } = ctx.params
    const models = await gitService.getTags(id)
    ctx.body = result.success('获取成功', models)
  },

  getProjectList: async (ctx) => {
    const { id } = ctx.params
    const models = await gitService.getProjectList(id)
    ctx.body = result.success('获取成功', models)
  },

  createProject: async (ctx) => {
    const { id } = ctx.params
    const models = await gitService.createProject(id)
    ctx.body = result.success('获取成功', models)
  },

  createGroup: async (ctx) => {
    const { id } = ctx.params
    const models = await gitService.createGroup(id)
    ctx.body = result.success('获取成功', models)
  },
}

service

// service
const gitModels = require('../models/git.js')

module.exports = {
  getProjectList: async(id) => {
    const res = await gitModels.getProjectList(id)
    return res
  },
  getBranches: async (id) => {
    try {
      let res
      res = await gitModels.getProjectBranches(id)
      return res
    } catch (error) {
      return error
    }
  },
  getTags: async (id) => {
    try {
      let res
      res = await gitModels.getProjectTags(id)
      return res
    } catch (error) {
      return error
    }
  },
  createProject() {

  },
  createGroup() {

  },
}

models层关键会在这个里面调用git开放接口接口达到创建项目等相关操作

const { Gitlab } = require('gitlab');

const api = new Gitlab({
  host: 'http://example.com',
  token: 'personaltoken', //  **token 可以通过点击头像,选择`Edit profile`,在选择`Access Tokens`,填入`token name`,等信息然后点击`Create personal access token`生产token。**
});

/**
 * 获取项目信息
 * @param {*} projectName
 */
const getProjectInfo = async function (projectName) {
  // 模糊查找项
  const res = await api.Projects.search(projectName);
  return res
}

const getGroupProjectList = async function (id) {
  const res = await api.Groups.all({ id: id });
  return res
}

const getGroupProject = async function (groupId) {
  const res = await api.GroupProjects.all(groupId);
  return res
}

/**
 * 根据项目名称获取分支列表
 * @param {*} projectName 
 */
const getProjectBranches = async function (projectId) {
  const res = await api.Branches.all(projectId)
  return res
}
/**
 * 根据项目名称获取分支tags列表
 * @param {*} projectName 
 */
const getProjectTags = async function (projectId) {
  const res = await api.Tags.all(projectId)
  return res
}

/**
 * name:项目名称
 * path:项目路径
 * description: 项目介绍
 * namespace_id: 群组ID
 * @param {*} params 
 */
const createProject = async function (params) {
  try {
    const res = await api.Projects.create(params);
    return res
  } catch (error) {
    return error
  }
}
/**
 * 
 * @param {*} params 
 * Attribute	  Type	      Required	     Description
 * id	          integer	     yes	          ID or URL-encoded path of the project owned by the authenticated user.
 * branch	      string	     yes	          Name of the branch.
 * ref	        string	     yes	          Branch name or commit SHA to create branch from.
 */
const createBranches = async function (params) {
  try {
    const res = await api.Branches.create(params);
    return res
  } catch (error) {
    return error
  }
}


/**
 * name:组名称
 * path:组路径
 * description: 组介绍
 * namespace_id: 群组ID
 * @param {*} params 
 */
const createGroup = async function (params) {
  try {
    const res = await api.Groups.create(params);
    return res
  } catch (error) {
    return error
  }
}

module.exports = {
  getProjectInfo,
  getGroupProjectList,
  getGroupProject,
  getProjectBranches,
  getProjectTags,
  createProject,
  createGroup,
  createBranches,
}

然后使用nodemon运行,再你得package.json增加:

{
  "name": "gitlab-api-test",
  "version": "0.0.1",
  "main": "index.js",
  "scripts": {
    "dev": "nodemon -w src src/app.js"
  },
  "description": "Gitlab Open Api Test",
  "dependencies": {
    "gitlab": "^14.2.2",
    "kcors": "^2.2.2",
    "koa": "^2.13.0",
    "koa-body": "^4.2.0",
    "koa-bodyparser": "^4.3.0",
    "koa-json": "^2.0.2",
    "koa-logger": "^3.2.1",
    "koa-router": "^9.1.0",
    "koa-static": "^5.0.0",
    "lodash": "^4.17.15",
    "path": "^0.12.7",
    "shelljs": "^0.8.4"
  },
  "devDependencies": {
    "nodemon": "^2.0.4"
  }
}

可以看到使用起来还是蛮简单的,关键点在于再初次使用gitlab没有明确的文档告诉你,那个方法是创建、新增、查找、删除,不知道要传什么参数。但是由于这个插件是TS编写的,可以再编码中看到以下图提示,至于传参由于也是ts写的咱们可以看到。 如果你对ts比较陌生,也没关系,可以去 gitlab官网openapi整体预览gitlab官网openapi使用文档中查看,参数名都是保持一致的。

GitLab Open Api 到底能帮助我们干什么

GitLab Open Api 到底能帮助我们干什么

GitLab Open Api 到底能帮助我们干什么

GitLab Open Api 到底能帮助我们干什么

官网部分使用截图:

GitLab Open Api 到底能帮助我们干什么

GitLab Open Api 到底能帮助我们干什么

GitLab Open Api 到底能帮助我们干什么

还有你可能会疑惑ID是啥怎么传如下图:

GitLab Open Api 到底能帮助我们干什么

GitLab Open Api 到底能帮助我们干什么

结语

以上就是使用Gitlab Open Api相关的使用总结,如果对您有帮助,欢迎点赞收藏关注。可以在评论区说下你们的GitLab Open Api 使用场景。