pip install python-gitlab
官方文档: http://python-gitlab.readthedocs.io/en/stable/
API: https://docs.gitlab.com/ce/api/projects.html
1、进入账户设置界面
2、选择access tokens,填写信息生成token
import gitlab
#url: gitlab地址;token: 刚才生成的token
gl = gitlab.Gitlab(url, token)
#直接创建项目
project = gl.projects.create({'name':'project1'})
# 创建用户
"""
常用参数:以下参数都可以使用user对象进行修改
email (必填)-电子邮件
username (必填)-用户名
name (必填)-名称
password (可选)-密码
can_create_group (可选)-用户可以创建组-正确或错误
skip_confirmation (可选)-跳过确认-正确或错误(默认)
external (可选)-将用户标记为外部用户-true或false(默认)
"""
user = gl.users.create({'email': '[email protected]',
'password': 'qinsh123456',
'username': 'qinsh',
'name': '秦始皇'})
# 根据用户ID获取用户对象
# user = gl.users.get(1)
# 根据用户Git账号获取用户对象
# user = gl.users.list(username="qinsh")[0]
# 根据用户对象可以进行如下操作
username = user.username # 获取用户Git账号
name = user.name # 获取用户姓名
user_id = user.id # 获取用户ID
# 修改用户属性
user.external = True # 将用户标记为外部用户
user.save()
# 删除用户
gl.users.delete(user_id) # 根据用户ID进行删除
user.delete() # 根据用户对象直接进行删除
#为特定用户创建项目
alice = gl.users.list(username='alice')[0]
user_project = alice.projects.create({'name': 'project'})
# 创建组
group = gl.groups.create({'name': 'group1', 'path': 'group1'})
# 修改组信息
group.description = 'My awesome group'
group.save()
# 删除组
gl.groups.delete(1) # 通过组ID进行删除
group.delete() # 通过组对象直接删除
# 获取当前组的成员
members = group.members.list()
# members = group.members.all(all=True)
# 通过组成员ID获取组员member_id
# members = group.members.get(1)
# 添加一个成员到指定组
"""
GIT权限:
gitlab.GUEST_ACCESS = 10
gitlab.REPORTER_ACCESS = 20
gitlab.DEVELOPER_ACCESS = 30
gitlab.MAINTAINER_ACCESS = 40
gitlab.OWNER_ACCESS = 50
"""
member = group.members.create({'user_id': user_id,
'access_level': gitlab.GUEST_ACCESS})
# 修改组的权限
member.access_level = gitlab.DEVELOPER_ACCESS
member.save()
# or
member.access_level = 10
member.save()
# 将成员从某组移除
group.members.delete(1) # 通过组成员ID进行移除member_id
member.delete() # 通过组成员对象直接进行移除
#为特定组创建项目
group_id = gl.groups.list(search='my-group')[0].id
project = gl.projects.create({'name': 'myrepo', 'namespace_id': group_id})
#获取项目。默认获取第一页的项目,每页20个
projects = gl.projects.list()
#获取指定页的项目
projects = gl.projects.list(page=2)
#获取所有项目
projects = gl.projects.list(all=True)
#根据项目名称搜索项目
projects = gl.projects.list(search='project_name')
#通过指定id 获取 project 对象
project = gl.projects.get(project_id)
#获取archived项目
projects = gl.projects.list(archived=1)
#根据项目visibility获取项目,public,internal,private
projects = gl.projects.list(visibility='public')
#获取当前用户(token的账户)拥有的项目
projects = gl.projects.list(owned=True)
#获取当前用户(token的账户)启动的项目
projects = gl.projects.list(starred=True)
#搜索结果排序
#在不指定的排序标准的情况下默认按照created_at,desc降序排列
#order_by参数:id, name, path, created_at, updated_at, last_activity_at.
#sort参数:asc,desc.
#查找所有项目,并按照项目id升序排列
projects = gl.projects.list(all=True,order_by='id',sort=‘asc’)
p=gl.projects.get(460)
print(p)
#输出结果如下:
#可以直接通过p.id,p.name,p.namespace['id']的方式获取单个信息
{
'id': 460,
'description': '协议转换转发公共',
'name': 'xy-transform-forward-common',
'name_with_namespace': 'xy / xy-transform-forward-common',
'path': 'xy-transform-forward-common',
'path_with_namespace': 'xy/xy-transform-forward-common',
'created_at': '2021-06-11T02:16:33.851Z',
'default_branch': 'master',
'tag_list': [],
'ssh_url_to_repo': '[email protected]:xy/xy-transform-forward-common.git',
'http_url_to_repo': 'http://gitlab.xy.in/xy/xy-transform-forward-common.git',
'web_url': 'http://gitlab.xy.in/xy/xy-transform-forward-common',
'avatar_url': None,
'star_count': 0,
'forks_count': 1,
'last_activity_at': '2021-07-02T08:47:37.645Z',
'_links': {
'self': 'http://gitlab.xy.in/api/v4/projects/460',
'issues': 'http://gitlab.xy.in/api/v4/projects/460/issues',
'merge_requests': 'http://gitlab.xy.in/api/v4/projects/460/merge_requests',
'repo_branches': 'http://gitlab.xy.in/api/v4/projects/460/repository/branches',
'labels': 'http://gitlab.xy.in/api/v4/projects/460/labels',
'events': 'http://gitlab.xy.in/api/v4/projects/460/events',
'members': 'http://gitlab.xy.in/api/v4/projects/460/members'
},
'archived': False,
'visibility': 'private',
'resolve_outdated_diff_discussions': False,
'container_registry_enabled': True,
'issues_enabled': True,
'merge_requests_enabled': True,
'wiki_enabled': True,
'jobs_enabled': True,
'snippets_enabled': True,
'shared_runners_enabled': True,
'lfs_enabled': True,
'creator_id': 1,
'namespace': {
'id': 2,
'name': 'xy',
'path': 'xy',
'kind': 'group',
'full_path': 'xy',
'parent_id': None
},
'import_status': 'none',
'import_error': None,
'open_issues_count': 0,
'runners_token': 'dWTY9wbm_xMziGKNHLiy',
'public_jobs': True,
'ci_config_path': None,
'shared_with_groups': [],
'only_allow_merge_if_pipeline_succeeds': False,
'request_access_enabled': False,
'only_allow_merge_if_all_discussions_are_resolved': False,
'printing_merge_request_link_enabled': True,
'merge_method': 'merge',
'permissions': {
'project_access': None,
'group_access': None
}
}
#修改基本属性
project.snippets_enabled = 1
project.save()
#项目头像可以作为数据(文件的内容)或文件来传递
#以二进制模式打开的对象
project.avatar = open('path/to/file.png', 'rb')
project.save()
#删除
gl.projects.delete(project_id)
project.delete()
#通过指定project对象获取该项目的所有分支
branches = project.branches.list()
# 获取指定分支的属性
branch = project.branches.get('master')
# 创建分支
#ref: 从哪创建分支
branch = project.branches.create({'branch_name': 'feature1','ref': 'master'})
# 删除分支
project.branches.delete('feature1')
# 分支保护/取消保护
branch.protect()
branch.unprotect()
# 获取指定项目的所有tags
tags = project.tags.list(all=True)
# 获取某个指定tag 的信息
tags = project.tags.list('1.0')
# 创建一个tag
tag = project.tags.create({'tag_name':'1.0', 'ref':'master'})
# 设置tags 说明:
tag.set_release_description('awesome v1.0 release')
# 删除tags
project.tags.delete('1.0')
# or
tag.delete()
#获取所有commit
commits = project.commits.list()
# 获取指定commit的info
commit = project.commits.get('e3d5a71b')
# 创建一个commit
data = {
'branch_name': 'master', # v3
'commit_message': 'blah blah blah',
'actions': [
{
'action': 'create',
'file_path': 'blah',
'content': 'blah'
}
]
}
commit = project.commits.create(data)
# 获取指定项目的所有merge request
mrs = project.mergerequests.list()
# 指定条件过滤 所有的merge request
# state: mr状态,可选参数merged, opened or closed
# order_by参数:created_at, updated_at
# sort参数: asc, desc
mrs = project.mergerequests.list(state='merged', sort='asc')
# 获取指定mr info
mr = project.mergerequests.get(mr_id)
#获取合并的全部提交列表
commits = mr.commits()
#获取合并的全部修改列表
changes = mr.changes()
#获取合并时将关闭的问题列表
mr.closes_issues()
# 创建一个merge request
mr = project.mergerequests.create({'source_branch':'cool_feature',
'target_branch':'master',
'title':'merge cool feature', })
# 更新一个merge request 的描述
mr.description = 'New description'
mr.save()
# 开关一个merge request (close or reopen):
mr.state_event = 'close' # or 'reopen'
mr.save()
# 删除:
project.mergerequests.delete(mr_id)
# or
mr.delete()
# 接受:
mr.merge()
#获取指定项目的现有hooks:
hooks = project.hooks.list()
#获取指定的hook详情:
hook = project.hooks.get(hook_id)
#创建hook
hook = project.hooks.create({'url': 'http://my/action/url', 'push_events': 1})
#更新hook
hook.push_events = 0
hook.save()
#删除hook
project.hooks.delete(hook_id)
# or
hook.delete()
f = project.files.get(file_path=git_path, ref=分支名)
file_content = f.decode()
file_content = file_content.decode()