技术, CI, Python, GitLab

GitLab CI 配置自动化打包上传 Python 库

2023年04月23日

自己之前有些 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="bean@yuanfen.net",
    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_USERNAMETWINE_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 跟踪和提交。

您已成功订阅 HADB.ME
真棒!下一步,完成结账以便解锁 HADB.ME
欢迎回来!您已登录成功。
登录失败,请重试。
操作成功!您的账户已全面激活,现在您有所有内容的权限了。
错误!Stripe 结账失败。
成功!您的账单信息已更新。
错误!账单信息更新失败。