Python에서 gitlab 라이브러리를 사용하는 방법은 무엇입니까?
설치
먼저 python-gitlab
라이브러리를 설치해야 합니다python-gitlab
库
pip 安装
sudo pip install --upgrade python-gitlab
源码安装
git clone https://github.com/python-gitlab/python-gitlab cd python-gitlab sudo python setup.py install
用法
CLI 用法
首先需要对环境进行配置才能使用 cli ,需要提供一个配置文件,指明 gitlab server 信息以及连接参数,配置文件格式为 INI
,样例如下:
[global] default = somewhere ssl_verify = true timeout = 5 [somewhere] url = https://some.whe.re private_token = vTbFeqJYCY3sibBP7BZM api_version = 4 [elsewhere] url = http://else.whe.re:8080 private_token = CkqsjqcQSFH5FQKDccu4 timeout = 1
其中
global
部分是必须提供的,主要是连接 gitlab 的参数其他部分是可选,当没有配置时默认用的是 default
使用过程中可以通过
-g
指定具体使用的是那一节,如gitlab -g somewhere project list
本文使用的配置文件如下 :
[global] ssl_verify = true timeout = 5 [gitlab] url = https://gitlab-russellgo.cn private_token = xxxxxx api_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-8 from __future__ import print_function import 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 的 list group = 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', ...)) # 返回的是两个元组, 第一个 必选的参数,第二个是可选的参数 # 获取 对象的属性 ,如 project project = 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') ## invalid gl.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 setup from 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
pip 설치
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 ...
소스 코드 설치
rrreee UsageCLI Usage
🎜먼저 cli를 사용하기 위한 환경을 구성해야 합니다. gitlab 서버 정보와 연결 매개변수를 나타내는 구성 파일을 제공해야 합니다. 구성 파일 형식은 다음과 같습니다. INI
, 예를 들어: 🎜rrreee
global
부분은 주로 제공되어야 합니다. gitlab에 연결하기 위한 매개변수🎜
그 외 부분은 선택 사항입니다. 구성이 없을 경우 기본값은 기본값입니다🎜
사용 중에 특정 항목을 지정할 수 있습니다. -g
를 통해 사용하는 것 gitlab -g 어딘가 프로젝트 목록
🎜
🎜과 같은 해당 섹션에서 사용되는 구성 파일은 다음과 같습니다. 다음:🎜rrreee🎜구성 파일은 다음 방법을 통해 적용할 수 있습니다.🎜
global
부분은 주로 제공되어야 합니다. gitlab에 연결하기 위한 매개변수🎜
그 외 부분은 선택 사항입니다. 구성이 없을 경우 기본값은 기본값입니다🎜
사용 중에 특정 항목을 지정할 수 있습니다. -g
를 통해 사용하는 것 gitlab -g 어딘가 프로젝트 목록
🎜
환경 변수 PYTHON_GITLAB_CFG
를 통해 구성🎜 li>
시스템 구성 /etc /python-gitlab.cfg
🎜에 넣습니다.
현재 사용자의 홈 디렉터리에 넣습니다. ~/.python-gitlab.cfg
🎜
명령을 통해 -c
또는 --config-file
지정 line🎜
-
모든 프로젝트 나열(페이지로 돌아가기)🎜rrreee
🎜🎜 li>
-
모든 프로젝트 나열🎜rrreee
🎜🎜
gitlab
이 현재 어떤 명령을 지원하는지 어떻게 알 수 있나요? ? 🎜rrreee🎜이렇게 하면 현재 gitlab에서 지원하는 리소스를 나열할 수 있습니다. 지원되는 리소스를 알고 나면 특정 리소스가 어떤 작업을 지원하는지 어떻게 알 수 있나요? 프로젝트를 예로 들어보겠습니다. 🎜rrreee🎜이렇게 하면 gitlab code>가 어떤 리소스에 대해 어떤 작업을 지원하는지 알 수 있으며, <code>--help
를 통해 🎜rrreee🎜와 같은 특정 매개변수를 알 수 있습니다. 이렇게 하면 쉽게 작업을 수행할 수 있습니다. gitlab
이 실행되었습니다. 🎜프로그래밍 사용법
🎜 명령줄을 통해 gitlab을 작동하는 것 외에도 프로그래밍을 통해 통합할 수도 있습니다. 일반적인 시나리오는 gitlab🎜기본 사용법 h5>rrreee에서 파일을 다운로드하는 것입니다. 함수 캡슐화 예시
🎜gitlab raw url을 통해 파일 다운로드🎜rrreee소스코드 분석🎜🎜소스코드 주소 : https://github.com/python- gitlab /python-gitlab/🎜🎜setup.py#L31:5🎜rrreee🎜에서 볼 수 있습니다.python-gitlab은 패키징을 위해 setuptools를 사용합니다. 패키지에는 두 가지 기능이 있습니다:🎜
파이썬 라이브러리로 사용(기본값)🎜
entry_points={"console_scripts": ["gitlab = gitlab.cli:main"]}
설명 cli로 사용할 수 있으며 명령은 gitlab
이고 실제로 호출되는 것은 Take a에서 gitlab.cli:main
함수🎜
🎜입니다. 항목 파일 cli.py
를 살펴보세요. 항목 파일에서 cli.py#L182:14🎜rrreee🎜여기에서 cli 구문 분석 라이브러리는 argparse
를 사용하여 이를 수행합니다. make 명령. 행 매개변수 분석. 🎜🎜GitlabCLI
클래스 cli.py#L29:7에서 볼 수 있듯이 🎜rrreee🎜cli의 기본 형식은 gitlab what action args
이며, 이는 cli
entry_points={"console_scripts": ["gitlab = gitlab.cli:main"]}
설명 cli로 사용할 수 있으며 명령은gitlab
이고 실제로 호출되는 것은 Take a에서gitlab.cli:main
함수🎜
파이썬 라이브러리로 사용(기본값)🎜
cli.py
를 살펴보세요. 항목 파일에서 cli.py#L182:14🎜rrreee🎜여기에서 cli 구문 분석 라이브러리는 argparse
를 사용하여 이를 수행합니다. make 명령. 행 매개변수 분석. 🎜🎜GitlabCLI
클래스 cli.py#L29:7에서 볼 수 있듯이 🎜rrreee🎜cli의 기본 형식은 gitlab what action args
이며, 이는 cligitlab에서 지원하는 리소스에 대해 수행되는 작업과 이 작업에 해당하는 매개변수
🎜🎜client 파일을 읽어 보면 이를 확인할 수 있습니다. py
client.py#L446:9 🎜rrreee위 내용은 Python에서 gitlab 라이브러리를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Python은 게임 및 GUI 개발에서 탁월합니다. 1) 게임 개발은 Pygame을 사용하여 드로잉, 오디오 및 기타 기능을 제공하며 2D 게임을 만드는 데 적합합니다. 2) GUI 개발은 Tkinter 또는 PYQT를 선택할 수 있습니다. Tkinter는 간단하고 사용하기 쉽고 PYQT는 풍부한 기능을 가지고 있으며 전문 개발에 적합합니다.

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

데비안 시스템의 readdir 함수는 디렉토리 컨텐츠를 읽는 데 사용되는 시스템 호출이며 종종 C 프로그래밍에 사용됩니다. 이 기사에서는 ReadDir를 다른 도구와 통합하여 기능을 향상시키는 방법을 설명합니다. 방법 1 : C 언어 프로그램을 파이프 라인과 결합하고 먼저 C 프로그램을 작성하여 readDir 함수를 호출하고 결과를 출력하십시오.#포함#포함#포함#포함#includinTmain (intargc, char*argv []) {dir*dir; structdirent*entry; if (argc! = 2) {

제한된 시간에 Python 학습 효율을 극대화하려면 Python의 DateTime, Time 및 Schedule 모듈을 사용할 수 있습니다. 1. DateTime 모듈은 학습 시간을 기록하고 계획하는 데 사용됩니다. 2. 시간 모듈은 학습과 휴식 시간을 설정하는 데 도움이됩니다. 3. 일정 모듈은 주간 학습 작업을 자동으로 배열합니다.

이 기사에서는 Debian 시스템에서 NginxSSL 인증서를 업데이트하는 방법에 대해 안내합니다. 1 단계 : CertBot을 먼저 설치하십시오. 시스템에 CERTBOT 및 PYTHON3-CERTBOT-NGINX 패키지가 설치되어 있는지 확인하십시오. 설치되지 않은 경우 다음 명령을 실행하십시오. sudoapt-getupdatesudoapt-getinstallcertbotpython3-certbot-nginx 2 단계 : 인증서 획득 및 구성 rectbot 명령을 사용하여 nginx를 획득하고 nginx를 구성하십시오.

데비안 시스템에서 HTTPS 서버를 구성하려면 필요한 소프트웨어 설치, SSL 인증서 생성 및 SSL 인증서를 사용하기 위해 웹 서버 (예 : Apache 또는 Nginx)를 구성하는 등 여러 단계가 포함됩니다. 다음은 Apacheweb 서버를 사용하고 있다고 가정하는 기본 안내서입니다. 1. 필요한 소프트웨어를 먼저 설치하고 시스템이 최신 상태인지 확인하고 Apache 및 OpenSSL을 설치하십시오 : Sudoaptupdatesudoaptupgradesudoaptinsta

데비안에서 gitlab 플러그인을 개발하려면 몇 가지 특정 단계와 지식이 필요합니다. 다음은이 과정을 시작하는 데 도움이되는 기본 안내서입니다. Gitlab을 먼저 설치하려면 Debian 시스템에 Gitlab을 설치해야합니다. Gitlab의 공식 설치 매뉴얼을 참조 할 수 있습니다. API 액세스 토큰을 얻으십시오 API 통합을 수행하기 전에 Gitlab의 API 액세스 토큰을 먼저 가져와야합니다. Gitlab 대시 보드를 열고 사용자 설정에서 "AccessTokens"옵션을 찾은 다음 새 액세스 토큰을 생성하십시오. 생성됩니다

아파치는 인터넷 뒤의 영웅입니다. 웹 서버 일뿐 만 아니라 큰 트래픽을 지원하고 동적 콘텐츠를 제공하는 강력한 플랫폼이기도합니다. 모듈 식 설계를 통해 매우 높은 유연성을 제공하여 필요에 따라 다양한 기능을 확장 할 수 있습니다. 그러나 Modularity는 또한 신중한 관리가 필요한 구성 및 성능 문제를 제시합니다. Apache는 사용자 정의가 필요한 서버 시나리오에 적합하고 복잡한 요구를 충족시킵니다.
