GitLab CI 配置自动化打包上传 Python 库
自己之前有些 python 脚本类的项目,会用到一些通用的能力,如读取配置、打日志等,每次都 copy 一份 utils 目录有些不够优雅,于是撸了一个公共库,方便自己使用。
为了能配合 GitLab CI,setup.py
需要做一些小调整,版本号不需要手动输入了,直接读取 $CI_COMMIT_TAG
,代码如下:
import os
import setuptools
with open("README.md", "r") as fh:
long_description = fh.read()
setuptools.setup(
name="yuanfen",
version=os.environ.get("CI_COMMIT_TAG", "0.0.0"),
author="Bean",
author_email="[email protected]",
description="Yuanfen Python Library",
long_description=long_description,
long_description_content_type="text/markdown",
url="",
install_requires=["pyyaml", "watchdog"],
packages=setuptools.find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
)
.gitlab-ci.yml
代码如下:
image: python:3
stages:
- deploy
deploy:
stage: deploy
variables:
TWINE_USERNAME: $TWINE_USERNAME
TWINE_PASSWORD: $TWINE_PASSWORD
script:
- python setup.py sdist bdist_wheel
- pip install twine -i https://pypi.tuna.tsinghua.edu.cn/simple
- twine upload dist/*
only:
- tags
其中,需要在 GitLab 项目 Setting -> CI/CD -> Variables
中配置 TWINE_USERNAME
和 TWINE_PASSWORD
,这个是你在 pypi.org
上的用户名和密码。
另外需要注意的是,仓库的目录结构,setup.py
中指定的 name
是包名,而 __init__.py
所在的文件夹名是实际 import
的导入名。上传包时,PyPI 会检查报名是否重复,但不会检查导入名,所以如果定义了一个容易导致重复的导入名的话,就有可能有冲突。所以一般情况下该文件夹尽量是与包名统一,这样不容易有冲突。
以下是 ChatGPT 给出的目录结构的建议:
当你创建一个 Python 库时,通常需要遵循一些标准的目录结构和文件命名规范。下面是一个常见的建议目录结构,包括了一些常见文件和目录:
your_library/ your_library/ __init__.py module1.py module2.py ... examples/ example1.py example2.py ... tests/ test_module1.py test_module2.py ... README.md LICENSE setup.py requirements.txt .gitignore
在这个目录结构中,
your_library
是你的库的名称,它应该与setup.py
文件中定义的名称相同。your_library
目录包含了你的库的所有源代码和模块文件,以及__init__.py
文件,用于将your_library
目录转换为 Python 包。
examples
目录包含了一些示例代码,用于演示如何使用你的库。这些示例代码可以帮助用户更快地了解和使用你的库。
tests
目录包含了单元测试和集成测试代码,用于确保你的库的功能和质量。在这个目录中,你可以为每个模块编写一个或多个测试文件,并使用测试框架运行这些测试。
README.md
文件是你的库的说明文档,用于介绍你的库的功能、用法和示例。LICENSE
文件包含了你的库的许可证信息,用于明确你的库的使用和分发条件。
setup.py
文件是你的库的安装脚本,用于将你的库安装到 Python 环境中。在这个文件中,你需要指定库的名称、版本、作者、描述、依赖等信息。
requirements.txt
文件包含了你的库依赖的其他 Python 包的名称和版本号。在使用 pip 安装你的库时,pip 将自动安装这些依赖包。
.gitignore
文件是 Git 版本控制系统的忽略文件,用于指定哪些文件或目录不需要被 Git 跟踪和提交。