如何使用极狐GitLab 软件包仓库功能托管 python?

news2025/5/11 17:52:18

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有:

  • 极狐GitLab 中文文档
  • 极狐GitLab 中文论坛
  • 极狐GitLab 官网

软件包库中的 PyPI 包 (BASIC ALL)

在项目的软件包库中发布 PyPI 包。然后在需要将它们用作依赖项时安装它们。
软件包库适用于:

  • pip
  • twine

使用极狐GitLab 软件包库进行身份验证

在您发布到极狐GitLab 软件包仓库之前,您必须进行认证。
要如此,您可以使用:

  • 一个具有 api 范围的个人访问令牌。
  • 一个具有 read_package_registry 或/和 write_package_registry 范围的部署令牌。
  • 一个 CI 作业令牌。

请勿使用此处文档记录的方法以外的其他身份验证方法。 未记录的身份验证方法可能会在将来删除。

TWINE_USERNAMETWINE_PASSWORD 环境变量用于使用极狐GitLab 令牌进行身份验证。

使用个人访问令牌进行认证

要使用个人访问令牌进行身份验证,请更新 TWINE_USERNAMETWINE_PASSWORD 环境变量:

image: python:latest

run:
  variables:
    TWINE_USERNAME: <your_personal_access_token_name>
    TWINE_PASSWORD: <your_personal_access_token>
  script:
    - pip install build twine
    - python -m build
    - python -m twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi dist/*

使用部署令牌进行认证

要使用部署令牌进行身份验证,请更新 TWINE_USERNAMETWINE_PASSWORD 环境变量:

image: python:latest

run:
  variables:
    TWINE_USERNAME: <deploy token username>
    TWINE_PASSWORD: <deploy token>
  script:
    - pip install build twine
    - python -m build
    - python -m twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi dist/*

使用 CI 作业令牌进行认证

要使用 CI 作业令牌进行身份验证,请更新 TWINE_USERNAMETWINE_PASSWORD 环境变量:

image: python:latest

run:
  variables:
    TWINE_USERNAME: gitlab-ci-token
    TWINE_PASSWORD: $CI_JOB_TOKEN
  script:
    - pip install build twine
    - python -m build
    - python -m twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi dist/*

进行身份验证以访问某个群组内的软件包

遵循上述的令牌类型指南,但使用群组 URL 代替项目 URL:

https://gitlab.example.com/api/v4/groups/<group_id>/-/packages/pypi

发布 PyPI 软件包

先决条件:

  • 您必须使用软件包库进行身份验证。

  • 您的版本字符串必须有效。

  • 允许的最大包大小为 5 GB。

  • description 字段的最大长度为 4000 字符。更长的 description 字符串会被截断。

  • 不能多次上传同一版本的包。如果您尝试,您会收到错误 400 Bad Request

  • 使用您的 项目 ID 发布 PyPI 包。

  • 如果您的项目在一个群组中,则发布到您的项目库的 PyPI 包也可以在群组级库中使用(请参阅从群组级别安装)。

然后,您就可以使用 twine 发布 PyPI 包。

使用 twine 发布 PyPI 包

定义您的仓库源,编辑 ~/.pypirc 文件并添加:

[distutils]
index-servers =
    gitlab

[gitlab]
repository = https://gitlab.example.com/api/v4/projects/<project_id>/packages/pypi

要发布 PyPI 包,请运行类似的命令:

python3 -m twine upload --repository gitlab dist/*

如下消息预示着包已成功发布:

Uploading distributions to https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi
Uploading mypypipackage-0.0.1-py3-none-any.whl
100%|███████████████████████████████████████████████████████████████████████████████████████████| 4.58k/4.58k [00:00<00:00, 10.9kB/s]
Uploading mypypipackage-0.0.1.tar.gz
100%|███████████████████████████████████████████████████████████████████████████████████████████| 4.24k/4.24k [00:00<00:00, 11.0kB/s]

要查看已发布的软件包,前往您项目的 软件包与镜像库 页面。
如果您没有使用 .pypirc 文件来定义仓库源,则可以使用内联身份验证发布到仓库:

TWINE_PASSWORD=<personal_access_token or deploy_token or $CI_JOB_TOKEN> TWINE_USERNAME=<username or deploy_token_username or gitlab-ci-token> python3 -m twine upload --repository-url https://gitlab.example.com/api/v4/projects/<project_id>/packages/pypi dist/*

如果您没有遵循此页面上的步骤,请确保您的包已正确构建,并且您使用 setuptools 创建了一个 PyPI 包.
然后,您就可以使用如下的命令来上传您的软件包:

python -m twine upload --repository <source_name> dist/<package_file>
  • <package_file> 是您的软件包文件名,以 .tar.gz.whl 结尾。

  • <source_name> 是设置期间使用的源名称。

发布具有相同名称或版本的软件包

如果具有相同名称和版本的软件包已经存在,则您无法发布软件包。您必须先删除现有的软件包。如果您尝试多次发布同一个软件包,则会发生 400 Bad Request 错误。

安装 PyPI 软件包

当在软件包仓库中找不到 PyPI 软件包时,请求转发到 pypi.org。

管理员可以在持续集成设置中禁用此行为。

WARNING:当您使用 --index-url 选项时,不要指定默认端口,例如 80http 开头的 URL,或 443https 开头的 URL。

从项目进行安装

要安装最新版本的软件包,使用以下命令:

pip install --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple --no-deps <package_name>
  • <package_name> 是软件包名称。

  • <personal_access_token_name> 是具有 read_api 范围的个人访问令牌名称。

  • <personal_access_token> 是具有 read_api 范围的个人访问令牌。

  • <project_id> 是项目的 URL 编码路径(例如:group%2Fproject),或项目 ID(例如:42)。

在这些命令中,您可以使用 --extra-index-url 代替 --index-url。如果您遵循指南,并想要安装 MyPyPiPackage 软件包,您可以运行:

pip install mypypipackage --no-deps --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/simple

如下信息显示软件包已成功安装:

Looking in indexes: https://<personal_access_token_name>:****@gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/simple
Collecting mypypipackage
  Downloading https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/pypi/files/d53334205552a355fee8ca35a164512ef7334f33d309e60240d57073ee4386e6/mypypipackage-0.0.1-py3-none-any.whl (1.6 kB)
Installing collected packages: mypypipackage
Successfully installed mypypipackage-0.0.1
安全性影响

当安全 PyPI 时,使用 --extra-index-url--index-url 时,安全性影响很大,值得深入了解。如果您在使用:

  • --index-url:此选项会替换具有指定 URL 的 PyPI 索引。它是更安全的,因为它仅检查指定索引中的包。在您想确保仅从信任的私人源安装包时使用此选项。

  • --extra-index-url:此选项会将附加索引添加到默认的 PyPI 索引。它是不安全的,因为它会检查默认的 PyPI 索引和附加索引中的包,因此会导致依赖混淆攻击。

从群组安装

要从群组安装最新版本的软件包,使用以下命令:

pip install --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/groups/<group_id>/-/packages/pypi/simple --no-deps <package_name>

在此命令中:

  • <package_name> 是软件包名称。

  • <personal_access_token_name> 是具有 read_api 范围的个人访问令牌名称。

  • <personal_access_token> 是具有 read_api 范围的个人访问令牌。

  • <group_id> 是群组 ID。

在这些命令中,您可以使用 --extra-index-url 代替 --index-url。然而,使用 --extra-index-url 会使您受到依赖混淆攻击的影响,因为它会在检查自定义仓库之前检查 PyPi 仓库中的包。 --extra-index-url 添加了提供的 URL 作为额外的仓库,客户端将检查它是否存在包。 --index-url 告诉客户端仅在提供的 URL 中检查包。

如果您遵循指南,并且想要安装 MyPyPiPackage 软件包,您可以运行:

pip install mypypipackage --no-deps --index-url https://<personal_access_token_name>:<personal_access_token>@gitlab.example.com/api/v4/groups/<your_group_id>/-/packages/pypi/simple

软件包名称

极狐GitLab 查找使用 PEP-503 标准化名称的软件包。-_. 都被视为相同,并且重复的字符会被删除。
针对 my.packagepip install 请求会查找匹配任何三个字符的包,例如 my-packagemy_packagemy....package

使用 requirements.txt

如果您想 pip 能够访问您的公共仓库,请将 --extra-index-url 参数与您的仓库 URL 一起添加到您的 requirements.txt 文件中。

--extra-index-url https://gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple
package-name==1.0.0

如果这是私有仓库,您可以使用以下方式进行身份验证:

  • 使用您的 requirements.txt 文件:
--extra-index-url https://__token__:<your_personal_token>@gitlab.example.com/api/v4/projects/<project_id>/packages/pypi/simple
package-name==1.0.0
  • 使用 ~/.netrc 文件:
machine gitlab.example.com
login __token__
password <your_personal_token>

版本化 PyPI 软件包

正确的版本化对高效管理 PyPI 软件包是非常重要的。遵循这些最佳实践以确保您的软件包能够正确版本化。

使用语义化版本号(SemVer)

为您的软件包采用语义化版本号(SemVer)。版本号应使用格式 MAJOR.MINOR.PATCH:

  • 为不兼容的 API 变更,增加 MAJOR 版本号。
  • 为向后兼容的新功能,增加 MINOR 版本号。
  • 为向后兼容的 bug 修复,增加 PATCH 版本号。

比如,1.0.0、1.1.0、1.1.1。

从 0.1.0 开始

对于新项目,从 0.1.0 开始。这表示初始开发阶段,API 还未稳定。

使用有效的版本设置

确保您的版本字符串符合 PyPI 标准。极狐GitLab 使用特定的正则表达式来验证版本字符串:

\A(?:
    v?
    (?:([0-9]+)!)?                                                 (?# epoch)
    ([0-9]+(?:\.[0-9]+)*)                                          (?# release segment)
    ([-_\.]?((a|b|c|rc|alpha|beta|pre|preview))[-_\.]?([0-9]+)?)?  (?# pre-release)
    ((?:-([0-9]+))|(?:[-_\.]?(post|rev|r)[-_\.]?([0-9]+)?))?       (?# post release)
    ([-_\.]?(dev)[-_\.]?([0-9]+)?)?                                (?# dev release)
    (?:\+([a-z0-9]+(?:[-_\.][a-z0-9]+)*))?                         (?# local version)
)\z}xi

故障排查

为了改善性能,pip 命令会缓存与软件包相关的文件。Pip 不自行删除数据。缓存会随着新软件包的安装而增长。如果您遇到问题,请使用此命令清除缓存:

pip cache purge

多个 index-urlextra-index-url 参数

您可以定义多个 index-urlextra-index-url 参数。
如果您使用令牌认证多次使用了相同的域名名称(例如:gitlab.example.com),pip 可能无法找到您的软件包。这个问题是由在命令执行期间 pip 注册和存储令牌导致。
为解决此问题,你可以使用一个群组部署令牌,该令牌来自所有作为 index-urlextra-index-url 值所指向目标的项目或群组的共同父群组,且其权限范围为 read_package_registry
要解决此问题,您可以

支持的 CLI 命令

极狐GitLab PyPI 仓库支持如下 CLI 命令:

  • twine upload: 将软件包上传到仓库。

  • pip install: 从仓库安装 PyPI 软件包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2373309.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

右值引用的剖析

引入&#xff1a;为什么要有右值引用&#xff1f; 右值引用的存在&#xff0c;就是为了解决左值引用解决不了的问题&#xff01; 左值引用的问题&#xff1a; 我们知道&#xff0c;左值引用在做参数和做返回值都可以提高效率&#xff1b;但是有时候&#xff0c;我们无法用左…

高效Python开发:uv包管理器全面解析

目录 uv简介亮点与 pip、pip-tools、pipx、poetry、pyenv、virtualenv 对比 安装uv快速开始uv安装pythonuv运行脚本运行无依赖的脚本运行有依赖的脚本创建带元数据的 Python 脚本使用 shebang 创建可执行文件使用其他package indexes锁定依赖提高可复现性指定不同的 Python 版本…

【Linux系统编程】进程属性--进程状态

1.进程的状态 1.1进程的状态在PCB中就是一个变量 一般用宏来定义&#xff0c;例如&#xff1a; #define RUNNING 1 #define BLOCK 2 struct task_struct中的int status 1.2并行和并发 CPU执行代码&#xff0c;不是把进程代码执行完毕&#xff0c;才执行下一个&#xff0…

高精度之加减乘除之多解总结(加与减篇)

开篇总述&#xff1a;精度计算的教学比较杂乱&#xff0c;无系统的学习&#xff0c;且存在同法多线的方式进行同一种运算&#xff0c;所以我写此篇的目的只是为了直指本质&#xff0c;不走教科书方式&#xff0c;步骤冗杂。 一&#xff0c;加法 我在此讲两种方法&#xff1a; …

dify插件接入fastmcp示例

文章目录 1. 使用python完成mcp服务1.1 准备环境&#xff08;python安装fastmcp&#xff09;1.2 mcp服务端示例代码1.3 启动mcp服务端 2. dify接入2.1 安装MCP SSE和 Agent 策略&#xff08;支持 MCP 工具&#xff09; 插件2.2 dify agent插件配置mcp:2.3 mcp服务配置&#xff…

c++——二叉树进阶

1. 内容安排说明 二叉树在前面C数据结构阶段已经讲过&#xff0c;本节取名二叉树进阶是因为&#xff1a; 1. map和set特性需要先铺垫二叉搜索树&#xff0c;而二叉搜索树也是一种树形结构 2. 二叉搜索树的特性了解&#xff0c;有助于更好的理解map和set的特性 3. 二叉树中部…

基于flask+pandas+csv的报表实现

基于大模型根据提示词去写SQL执行SQL返回结果输出报表技术上可行的&#xff0c;但为啥还要基于pandas去实现呢&#xff1f; 原因有以下几点&#xff1a; 1、大模型无法满足实时性输出报表的需求&#xff1b; 2、使用大模型比较适合数据量比较大的场景&#xff0c;大模型主要…

PySide6 GUI 学习笔记——常用类及控件使用方法(常用类字体QFont)

文章目录 一、QFont常用方法二、常用方法总结1. 基础属性设置2. 高级样式控制3. 序列化与反序列化4. 字体信息获取 三、应用实例 字体类QFont用于设置界面控件上显示的字体&#xff0c;它包含字体名称、字体尺寸、粗体字、斜体字、删除线、上划线、下划线、字体间距等属性。 如…

宝塔服务安装使用的保姆级教程

宝塔介绍&#xff1a; 宝塔面板&#xff08;BT Panel&#xff09; 是一款 国产的服务器运维管理面板&#xff0c;主要用于简化 Linux/Windows 服务器的网站、数据库、FTP、防火墙等管理操作。它通过图形化界面&#xff08;Web端&#xff09;和命令行工具&#xff08;bt 命令&a…

Linux平台下SSH 协议克隆Github远程仓库并配置密钥

目录 注意&#xff1a;先提前配置好SSH密钥&#xff0c;然后再git clone 1. 检查现有 SSH 密钥 2. 生成新的 SSH 密钥 3. 将 SSH 密钥添加到 ssh-agent 4. 将公钥添加到 GitHub 5. 测试 SSH 连接 6. 配置 Git 使用 SSH 注意&#xff1a;先提前配置好SSH密钥&#xff0c;然…

Java【网络原理】(5)深入浅出HTTPS:状态码与SSL/TLS加密全解析

目录 1.前言 2.正文 2.1状态码 2.2HTTP与HTTPS的关系 2.3SSL协议 2.3.1对称加密 2.3.2非对称加密 2.3.3中间人攻击 2.3.4校验机制 2.3.4.1证书 2.3.4.2数字签名 1. 数字签名的生成过程 2. 数字签名的验证过程 2.4TLS协议&#xff08;握手过程&#xff09; 3.小结…

【基础IO下】磁盘/软硬链接/动静态库

前言&#xff1a; 文件分为内存文件和磁盘文件。磁盘文件是一个特殊的存在&#xff0c;因为磁盘文件不属于冯诺依曼体系&#xff0c;而是位于专门的存储设备中。因此&#xff0c;磁盘文件存在的意义是将文件更好的存储起来&#xff0c;一边后续对文件进行访问。在高效存储磁盘…

SpringBoot项目容器化进行部署,meven的docker插件远程构建docker镜像

需求&#xff1a;将Spring Boot项目使用容器化进行部署 前提 默认其他环境,如mysql,redis等已经通过docker部署完毕, 这里只讨论,如何制作springboot项目的镜像 要将Spring Boot项目使用docker容器进行部署&#xff0c;就需要将Spring Boot项目构建成一个docker镜像 一、手动…

【小记】excel vlookup一对多匹配

一个学生报四门课&#xff0c;输出每个学生课程 应用概述操作预处理数据计数指令 COUNTIFS进行一对多匹配 vlookup 应用概述 应用场景&#xff1a;学生报名考试&#xff0c;需要整理成指定格式&#xff0c;发给考试院。 一个学生最多报考四门 格式实例&#xff1a;准考证号 …

LeetCode热题100 两数之和

目录 两数之和题目解析方法一暴力求解代码 方法二哈希代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f978; C语言 &#x1f43f;️&#x1f43f;️&#x1f43f;…

[春秋云镜] Brute4Road 仿真场景

文章目录 靶标介绍&#xff1a;知识点约束性委派攻击 外网redis主从复制base64提权 内网搭建代理wpcargo插件漏洞mssql弱口令SweetPotato提权远程桌面连接mimikatz抓取hash约束性委派攻击 参考文章 靶标介绍&#xff1a; Brute4Road是一套难度为中等的靶场环境&#xff0c;完成…

鸿蒙系统使用ArkTS开发语言支持身份证阅读器、社保卡读卡器等调用二次开发SDK

har库导入&#xff1a; { "license": "", "devDependencies": {}, "author": "", "name": "entry", "description": "Please describe the basic information.", &qu…

《Python星球日记》 第54天:卷积神经网络进阶

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、深度CNN架构解析1. LeNet-5&#xff08;1998&#xff09;2. AlexNet&#x…

《AI大模型应知应会100篇》第53篇:Hugging Face生态系统入门

第53篇&#xff1a;Hugging Face生态系统入门 ——从模型获取到部署的全流程实战指南 &#x1f4cc; 摘要 在人工智能快速发展的今天&#xff0c;Hugging Face已成为自然语言处理&#xff08;NLP&#xff09;领域最具影响力的开源平台之一。它不仅提供丰富的预训练模型、强大…

【基于 LangChain 的异步天气查询2】GeoNames实现地区实时气温查询

目录 功能简介 一、创建GeoNames账号 1、进入官网 2、创建账号 二、运行代码 weather_runnable.py main.py 运行结果 功能简介 本文主要通过Langchain&#xff0c;结合GeoNames实现了地区温度的实时查询&#xff0c;并通过GPT-4o对温度进行一段简短的描述。 一、创建Ge…