一.简介

Gitlab作为一个开源、强大的分布式版本控制系统,已经成为互联网公司、软件开发公司的主流版本管理工具。使用过Gitlab的都知道,想要提交一段代码,可以通过git push提交到远程仓库,也可以直接在Gitlab平台上修改提交。然而上述两种提交方式都是人工提交代码,需要手动登录Gitlab或者在第一次commit的时候提供Gitlab帐号和密码。

那么,假设有这么一个需求场景:我们开发了一个效率平台,可以自动拉分支、自动提交代码到远程仓库。这个需求该如何实现?其实很简单,Gitlab提供了一套完整的API,让第三方平台可以通过API自动创建帐号、自动提交代码、自动拉分支,等等。API涉及到的功能非常全面,覆盖了分支、tag、代码提交、用户、群组、项目等,基本上人工可以做的所有操作,都可以通过API自动实现。

Gitlab的Api的文档入口为http://{gitlab_host}/help/api/README.md

二.技术要点

Gitlab本质上也是一个web服务器,Gitlab官方提供了一个非常完整的restful API,我们可以使用apache开发的一个工具包HttpClient,HttpClient可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。

当我们想要执行某种操作时,我们只需要在Gitlab的api文档上查找到对应的路径,然后在自己的后台利用HttpClient将对应的链接发送至Gitlab服务器即可,HttpClient功能非常强大,支持get,post,put,delete等七种请求方式。

附录一个讲解HttpClient非常完善的HttpClient 4.3教程

三.案例

获取每个项目下的用户信息

#!/usr/bin/env python
#-*-coding:utf-8-*- import requests url = 'http://x.x.x.x/api/v3/projects?private_token=oMJwN5ErC8_n1QvTsyDR&per_page=50'    #private_token为必须项,这里为获取所有的项目信息 user_url= 'http://x.x.x.x/api/v3/projects/{}/users?private_token=oMJwN5ErC8_n1QvTsyDR&per_page=100'  #获取每个项目下的用户信息
#http://10.10.10.217/api/v3/projects/45/users?private_token=oMJwN5ErC8_n1QvTsyDR      #获取项目id为45的信息
#获取项目id和项目名称
def GetProject_id(project_url):  
r = requests.get(project_url)
data = r.json()
ProjectId_list = []
ProjectName_list = []
for i in data:
ProjectId_list.append(i['id'])
ProjectName_list.append(i['name'])
return ProjectId_list,ProjectName_list
#根据项目id获取项目下的用户信息
def GetProject_userlist():
IdList = GetProject_id(url)
project_id = IdList[0]
project_name = IdList[1] for id in project_id:
l = []
project_user = requests.get(user_url.format(id))  #生成完整的用于显示项目下所有user的连接
req_data = project_user.json()
for i in req_data:
l.append(i['name'])
print (project_name[project_id.index(id)],l) GetProject_userlist()

执行结果:项目名称,用户列表

示例:获取某些项目是否提交代码以及提交时间

#-*-coding:utf-8-*-

import requests
import re url = 'http://10.10.10.217/api/v3/projects?private_token=oMJwN5ErC8_n1QvTsyDR&per_page=50' r =requests.get(url) p_group = ['HJ'] data = r.json()
print ("项目名称",' '*20,'最近提交时间')
for i in data:
if i['ssh_url_to_repo'].split(':')[1].split('/')[0] in p_group:
r1 = requests.get(
'http://x.x.xx.x/api/v3/projects/%d/repository/commits/master?private_token=xxxxxxxxxxxxxxxxx'
% i['id'])
data2 = r1.json()
if data2['message'].strip() == '404 Commit Not Found':
print (i['ssh_url_to_repo'].split(':')[1],' '*11,'未提交任何代码')
else:
print(i['ssh_url_to_repo'].split(':')[1], ' ' * 11, data2['committed_date'][:10])

最新文章

  1. arduino 串口实时绘图(以mpu9250为例)
  2. clipboard_monitor_in_win7
  3. 基于ZooKeeper的Dubbo注册中心
  4. OAuth授权过程
  5. PagedList.MVC分页
  6. Azure linux centos 默认登陆账号是什么?
  7. Xcode7 修改bundle identifier
  8. ASP.NET - URL中参数加密解密操作
  9. linux设备驱动之字符设备驱动模型(2)
  10. 关于python环境配置的博客收藏
  11. asp.net webapi 生成在线文档--Swagger
  12. Hive shell 基本命令
  13. springboot的filter使用
  14. Future接口和FutureTask类【FutureTask实现了Runnable和Future接口】
  15. eclispse修改项目项目编码
  16. 2018.10.20 NOIP模拟 蛋糕(线段树+贪心/lis)
  17. CCF 201709-2公共钥匙盒
  18. Leetcode题库——7.反转整数
  19. Python学习-7.Python的循环语句-for语句
  20. HTML常用汇总

热门文章

  1. 1组-Alpha冲刺-1/6
  2. PHP 数组函数分类整理
  3. 不可忽视的Dubbo线程池
  4. bat批处理命令及解释
  5. SpringCloud升级之路2020.0.x版-40. spock 单元测试封装的 WebClient(上)
  6. mybatis判断集合长度
  7. layui某个字段不让页面显示显示
  8. ServerBootstrap的handler()和childHandler()区别
  9. 使用 SpringBoot 构建一个RESTful API
  10. Codeforces 671C - Ultimate Weirdness of an Array(线段树维护+找性质)