千家信息网

python中gitlab库有什么用

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,这篇文章主要介绍了python中gitlab库有什么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中gitlab库有什么用文章都会有所收获,下面我们一起来看
千家信息网最后更新 2025年12月03日python中gitlab库有什么用

这篇文章主要介绍了python中gitlab库有什么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python中gitlab库有什么用文章都会有所收获,下面我们一起来看看吧。

安装

首先需要安装 python-gitlab

pip 安装

sudo pip install --upgrade python-gitlab

源码安装

git clone https://github.com/python-gitlab/python-gitlabcd python-gitlabsudo python setup.py install

用法

CLI 用法

首先需要对环境进行配置才能使用 cli ,需要提供一个配置文件,指明 gitlab server 信息以及连接参数,配置文件格式为 INI ,样例如下:

[global]default = somewheressl_verify = truetimeout = 5[somewhere]url = https://some.whe.reprivate_token = vTbFeqJYCY3sibBP7BZMapi_version = 4[elsewhere]url = http://else.whe.re:8080private_token = CkqsjqcQSFH5FQKDccu4timeout = 1
  • 其中 global 部分是必须提供的,主要是连接 gitlab 的参数

  • 其他部分是可选,当没有配置时默认用的是 default

  • 使用过程中可以通过 -g 指定具体使用的是那一节,如 gitlab -g somewhere project list

本文使用的配置文件如下 :

[global]ssl_verify = truetimeout = 5[gitlab]url = https://gitlab-russellgo.cnprivate_token = xxxxxxapi_version = 4

配置文件可以通过以下几种方法生效 :

  • 通过环境变量配置 PYTHON_GITLAB_CFG

  • 放在系统配置下 /etc/python-gitlab.cfg

  • 放在当前用户 home 目录下 ~/.python-gitlab.cfg

  • 通过命令行指定 -c 或者 --config-file

本文的配置文件放在了 home 下。

当配置好了环境就可以愉快的使用了

  • 列出所有的 project (分页返回)

    # 上面定义了一个 gitlab 的组,所以执行时可以通过 -g 指定gitlab -g gitlab project list


  • 列出所有的 project

    gitlab -g gitlab project list --all


试到这里有个疑问,怎么知道 gitlab 目前支持哪些命令呢

gitlab -g gitlab # 以下是输出usage: gitlab [-h] [--version] [-v] [-d] [-c CONFIG_FILE] [-g GITLAB]              [-o {json,legacy,yaml}] [-f FIELDS]              {application-settings,audit-event,broadcast-message,current-user,current-user-email,current-user-gp-gkey,current-user-key,current-user-status,deploy-key,dockerfile,event,feature,geo-node,gitignore,gitlabciyml,group,group-access-request,group-badge,group-board,group-board-list,group-cluster,group-custom-attribute,group-epic,group-epic-issue,group-epic-resource-label-event,group-issue,group-label,group-member,group-merge-request,group-milestone,group-notification-settings,group-project,group-subgroup,group-variable,hook,issue,l-da-pgroup,license,merge-request,namespace,notification-settings,pages-domain,project,project-access-request,project-additional-statistics,project-approval,project-approval-rule,project-badge,project-board,project-board-list,project-branch,project-cluster,project-commit,project-commit-comment,project-commit-discussion,project-commit-discussion-note,project-commit-status,project-custom-attribute,project-deployment,project-environment,project-event,project-export,project-file,project-fork,project-hook,project-import,project-issue,project-issue-award-emoji,project-issue-discussion,project-issue-discussion-note,project-issue-link,project-issue-note,project-issue-note-award-emoji,project-issue-resource-label-event,project-issues-statistics,project-job,project-key,project-label,project-member,project-merge-request,project-merge-request-approval,project-merge-request-award-emoji,project-merge-request-diff,project-merge-request-discussion,project-merge-request-discussion-note,project-merge-request-note,project-merge-request-note-award-emoji,project-merge-request-resource-label-event,project-milestone,project-note,project-notification-settings,project-pages-domain,project-pipeline,project-pipeline-job,project-pipeline-schedule,project-pipeline-schedule-variable,project-pipeline-variable,project-protected-branch,project-protected-tag,project-push-rules,project-registry-repository,project-registry-tag,project-release,project-runner,project-service,project-snippet,project-snippet-award-emoji,project-snippet-discussion,project-snippet-discussion-note,project-snippet-note,project-snippet-note-award-emoji,project-tag,project-trigger,project-user,project-variable,project-wiki,runner,runner-job,snippet,todo,user,user-activities,user-custom-attribute,user-email,user-event,user-gp-gkey,user-impersonation-token,user-key,user-project,user-status}

这样可以列出当前 gitlab 支持的资源,知道了支持的资源,那有怎么知道某种资源支持哪些操作的,以 project 为例,

gitlab -g gitlab project # 以下是输出usage: gitlab project [-h]                      {list,get,create,update,delete,repository-blob,repository-contributors,delete-merged-branches,share,archive,repository-compare,create-fork-relation,languages,mirror-pull,unarchive,star,search,artifact,trigger-pipeline,repository-archive,delete-fork-relation,repository-raw-blob,repository-tree,unstar,housekeeping,unshare,upload,snapshot,update-submodule,transfer-project}                      ...gitlab project: error: too few arguments

这样就可以知道 gitlab 支持对何种资源做哪些操作,再通过 --help 就可以知道具体的参数,如

gitlab -g gitlab project list  --help # 以下是输出usage: gitlab project list [-h] [--sudo SUDO] [--search SEARCH]                           [--owned OWNED] [--starred STARRED]                           [--archived ARCHIVED] [--visibility VISIBILITY]                           [--order-by ORDER_BY] [--sort SORT]                           [--simple SIMPLE] [--membership MEMBERSHIP]                           [--statistics STATISTICS]                           [--with-issues-enabled WITH_ISSUES_ENABLED]                           [--with-merge-requests-enabled WITH_MERGE_REQUESTS_ENABLED]                           [--with-custom-attributes WITH_CUSTOM_ATTRIBUTES]                           [--page PAGE] [--per-page PER_PAGE] [--all]optional arguments:  -h, --help            show this help message and exit  --sudo SUDO  --search SEARCH  --owned OWNED  --starred STARRED  --archived ARCHIVED  --visibility VISIBILITY  --order-by ORDER_BY  --sort SORT  --simple SIMPLE  --membership MEMBERSHIP  --statistics STATISTICS  --with-issues-enabled WITH_ISSUES_ENABLED  --with-merge-requests-enabled WITH_MERGE_REQUESTS_ENABLED  --with-custom-attributes WITH_CUSTOM_ATTRIBUTES  --page PAGE  --per-page PER_PAGE  --all

这样就可以很方便的对 gitlab 进行操作了。

编程用法

除了通过命令行操作 gitlab 之外,还可以用编程的方式进行集成,一个常见的场景,要从 gitlab 中下载某个文件

基本用法
#!/usr/bin/env python# coding=utf-8from __future__ import print_functionimport gitlab# 实例化一个 gitlab 对象url = "https://gitlab.russellgao.cn"private_token = "xxxxxxxx"gl = gitlab.Gitlab('https://gitlab.russellgao.cn', private_token=private_token)# 列出所有的项目projects = gl.projects.list()for project in projects:    print(project)# 获取 group id 是 2 的 listgroup = gl.groups.get(2)for project in group.projects.list():    print(project)# 创建一个用户user_data = {'email': 'jen@foo.com', 'username': 'jen', 'name': 'Jen'}user = gl.users.create(user_data)print(user)# 列出 create 和 update 时需要的参数# get_create_attrs() 创建时需要的参数# get_update_attrs() 更新时需要的参数print(gl.projects.get_create_attrs())(('name',), ('path', 'namespace_id', ...))# 返回的是两个元组, 第一个 必选的参数,第二个是可选的参数# 获取 对象的属性 ,如 projectproject = gl.projects.get(1)print(project.attributes)# 有些对象提供了 gitlab 相关的资源属性project = gl.projects.get(1)issues = project.issues.list()# python-gitlab 允许向 gitlab 发送任何数据,当发送非法数据或者缺少相关参数时会抛出异常gl.projects.list(sort='invalid value')# ...# GitlabListError: 400: sort does not have a valid value# 通过 query_parameters 进行传参 当参数和python 关键字冲突时gl.user_activities.list(from='2019-01-01')  ## invalidgl.user_activities.list(query_parameters={'from': '2019-01-01'})  # OK
函数封装例子

通过 gitlab raw url 进行下载文件

def download_gitlab_file(url, filename, private_token) :    """    从 gitlab 上下载文件    :param url: gitlab raw url    :param filename: 保存到本地的文件名称    :param private_token:    :return:    """    import gitlab    import codecs    def writeLinesToFile(filename, lines, append=False, encoding=None):        if (append == True):            file_mode = "a"        else:            file_mode = "w"        encoding = encoding or 'utf-8'        with codecs.open(filename, file_mode, encoding=encoding) as fp:            for line in lines:                print(unicode(line), file=fp)    url_patterns = url.split("/")    if len(url_patterns) < 8 :        raise ValueError("url: `{}` 参数不合法,以 / 分隔之后长度必须大于8".format(url))    baseurl = "{}//{}".format(url_patterns[0], url_patterns[2])    namespace = url_patterns[3]    project_name = url_patterns[4]    branch = url_patterns[6]    url_filename = "/".join(url_patterns[7:])    if url_patterns[5] == "-" :        branch = url_patterns[7]        url_filename = "/".join(url_patterns[8:])    gl = gitlab.Gitlab(str(baseurl), private_token)    projects = gl.projects.list(search=project_name)    projects = filter(lambda x : x.namespace.get("full_path") == namespace, projects )    if len(projects) == 0 :        raise ValueError("根据url 没有找到相应的 project ,请检查当前用户是否有权限或者 url 是否正确 ")    project = projects[0]    raw_content = project.files.raw(file_path=url_filename, ref=branch)    writeLinesToFile(filename, [raw_content])    return raw_content

源码解析

源码地址: https://github.com/python-gitlab/python-gitlab/

从 setup.py#L31:5 中可以看出

from setuptools import setupfrom setuptools import find_packages...setup(    name="python-gitlab",    ...    entry_points={"console_scripts": ["gitlab = gitlab.cli:main"]},    ....)

python-gitlab 采用 setuptools 进行打包,打成的包有两个作用:

  • 当作 python 库使用 (默认)

  • entry_points={"console_scripts": ["gitlab = gitlab.cli:main"]} 说明可以当作 cli 使用,指令是 gitlab ,真正调用的是 gitlab.cli:main 函数

在看一下 cli.py 这个入口文件,从入口文件可以看到 cli.py#L182:14

def main():    import gitlab.v4.cli...    # 可以跳转到这个函数中查看    parser = _get_base_parser(add_help=False)...def _get_base_parser(add_help: bool = True) -> argparse.ArgumentParser:    parser = argparse.ArgumentParser(        add_help=add_help, description="GitLab API Command Line Interface"    )    parser.add_argument("--version", help="Display the version.", action="store_true")    parser.add_argument(        "-v",        "--verbose",        "--fancy",        help="Verbose mode (legacy format only)",        action="store_true",    )...

这里可以 cli 解析库用的是 argparse 做命令行参数的解析 。

通过 GitlabCLI class cli.py#L29:7 可以看出

class GitlabCLI(object):    def __init__(self, gl, what, action, args):        self.cls_name = cli.what_to_cls(what)        self.cls = gitlab.v4.objects.__dict__[self.cls_name]        self.what = what.replace("-", "_")        self.action = action.lower()        self.gl = gl        self.args = args        self.mgr_cls = getattr(gitlab.v4.objects, self.cls.__name__ + "Manager")        # We could do something smart, like splitting the manager name to find        # parents, build the chain of managers to get to the final object.        # Instead we do something ugly and efficient: interpolate variables in        # the class _path attribute, and replace the value with the result.        self.mgr_cls._path = self.mgr_cls._path % self.args        self.mgr = self.mgr_cls(gl)        if self.mgr_cls._types:            for attr_name, type_cls in self.mgr_cls._types.items():                if attr_name in self.args.keys():                    obj = type_cls()                    obj.set_from_cli(self.args[attr_name])                    self.args[attr_name] = obj.get()

cli 基本格式为 gitlab what action args ,即上面 cli 章节提到的 gitlab 支持的资源 做什么操作 这个操作对应的参数

通过走读 client.py client.py#L446:9 这个文件可以看到

def http_request(        self,        verb: str,        path: str,        query_data: Optional[Dict[str, Any]] = None,        post_data: Optional[Dict[str, Any]] = None,        streamed: bool = False,        files: Optional[Dict[str, Any]] = None,        **kwargs: Any,    ) -> requests.Response:        """Make an HTTP request to the Gitlab server.        Args:            verb (str): The HTTP method to call ('get', 'post', 'put',                        'delete')            path (str): Path or full URL to query ('/projects' or                        'http://whatever/v4/api/projecs')            query_data (dict): Data to send as query parameters            post_data (dict): Data to send in the body (will be converted to                              json)            streamed (bool): Whether the data should be streamed            files (dict): The files to send to the server            **kwargs: Extra options to send to the server (e.g. sudo)        Returns:            A requests result object.        Raises:            GitlabHttpError: When the return code is not 2xx        """        query_data = query_data or {}        url = self._build_url(path)        params: Dict[str, Any] = {}        utils.copy_dict(params, query_data)        # Deal with kwargs: by default a user uses kwargs to send data to the        # gitlab server, but this generates problems (python keyword conflicts        # and python-gitlab/gitlab conflicts).        # So we provide a `query_parameters` key: if it's there we use its dict        # value as arguments for the gitlab server, and ignore the other        # arguments, except pagination ones (per_page and page)        if "query_parameters" in kwargs:            utils.copy_dict(params, kwargs["query_parameters"])            for arg in ("per_page", "page"):                if arg in kwargs:                    params[arg] = kwargs[arg]        else:            utils.copy_dict(params, kwargs)        opts = self._get_session_opts(content_type="application/json")        verify = opts.pop("verify")        timeout = opts.pop("timeout")        # If timeout was passed into kwargs, allow it to override the default        timeout = kwargs.get("timeout", timeout)        # We need to deal with json vs. data when uploading files        if files:            json = None            if post_data is None:                post_data = {}            post_data["file"] = files.get("file")            post_data["avatar"] = files.get("avatar")            data = MultipartEncoder(post_data)            opts["headers"]["Content-type"] = data.content_type        else:            json = post_data            data = None        # Requests assumes that `.` should not be encoded as %2E and will make        # changes to urls using this encoding. Using a prepped request we can        # get the desired behavior.        # The Requests behavior is right but it seems that web servers don't        # always agree with this decision (this is the case with a default        # gitlab installation)        req = requests.Request(verb, url, json=json, data=data, params=params, **opts)        prepped = self.session.prepare_request(req)        prepped.url = utils.sanitized_url(prepped.url)        settings = self.session.merge_environment_settings(            prepped.url, {}, streamed, verify, None        )        # obey the rate limit by default        obey_rate_limit = kwargs.get("obey_rate_limit", True)        # do not retry transient errors by default        retry_transient_errors = kwargs.get("retry_transient_errors", False)        # set max_retries to 10 by default, disable by setting it to -1        max_retries = kwargs.get("max_retries", 10)        cur_retries = 0...

关于"python中gitlab库有什么用"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"python中gitlab库有什么用"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

参数 文件 配置 资源 支持 命令 函数 可以通过 对象 源码 环境 用户 知识 输出 两个 入口 内容 属性 数据 格式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 高一关于网络安全大赛的英语作文 深圳工控软件开发报价 ctf网络安全大赛赛场 王者荣耀能不能优化一下服务器 银行营业大厅网络安全 服务器raid10更换硬盘坏了 网络安全侦查大队主要工作 江夏区信息网络安全维护怎么样 停车场管理数据库密码 狐表软件开发财务软件 数据库设计教师信息表 网络安全扫漏公司都有哪些 实时数据库open 阿里云购买甲骨文服务器 ppt网络安全素材波纹 灌云正规网络技术品质保障 共享电动车app软件开发 中国农业大学网络技术中心电话 管理sql2000数据库软件 河北电商软件开发哪家好 联想S258服务器安装 利用开源软件保护网络安全 增长引擎网络技术有限公司怎么样 access数据库电脑免费使用 青少年使用网络安全问题 贴吧邮箱数据库 哈工程网络安全复试 山西数据备份服务器 深圳软件开发公司价格 宝山区网络营销软件开发收费标准
0