python-gitlab

 一、安装

pip install python-gitlab

官方文档: http://python-gitlab.readthedocs.io/en/stable/

API: https://docs.gitlab.com/ce/api/projects.html

二、获取gitlab token

1、进入账户设置界面

python-gitlab_第1张图片

2、选择access tokens,填写信息生成token

python-gitlab_第2张图片

三、使用

1、登录gitlab


import gitlab
 
#url: gitlab地址;token: 刚才生成的token
gl = gitlab.Gitlab(url, token)

2、Project

2.1 创建用户|项目|组


#直接创建项目
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}) 

2.2 查找和搜索project


#获取项目。默认获取第一页的项目,每页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’)

2.3 project基本属性


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
  }
}

2.4 修改和删除project

#修改基本属性
project.snippets_enabled = 1
project.save()
 
#项目头像可以作为数据(文件的内容)或文件来传递
#以二进制模式打开的对象
project.avatar = open('path/to/file.png', 'rb')
project.save()
 
#删除
gl.projects.delete(project_id)
project.delete()

2.5 project基本操作

2.5.1 分支管理
#通过指定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()
2.5.2 标签管理

# 获取指定项目的所有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()
2.5.3 提交管理
#获取所有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)
2.5.4 合并管理
# 获取指定项目的所有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()

2.5.5 钩子管理
#获取指定项目的现有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()
2.5.6 获取项目文件内容
f = project.files.get(file_path=git_path, ref=分支名)
file_content = f.decode()
file_content = file_content.decode()

你可能感兴趣的:(python,python,gitlab,开发语言)