我想知道是否有可能将存储在gitlab中的Python包版本放入gitlab运行程序中。
我有一个包结构示例:
/package
/src
/__init__.py
main.py
setup.py
Dockerfile
.gitlab-ci.ymlinit.py包括:
__version__ = '1.0.0'setup.py包括:
setup(
name='foo',
version=src.__version__,
packages=find_packages(),
install_required=[foo, bar]
)简单的碰撞和释放工作流如下所示:在github和pypi上发布新python包版本的最佳工作流和实践
但是,我们是否可以在直接发布gitlab的同时,在__init_.py中自动插入版本呢?
发布于 2020-11-02 23:19:26
为此,我喜欢使用bump2version包。
下面是我的gitlab-ci.yml的最小设置(几乎):
image: python:latest
# Change pip's cache directory to be inside the project directory since we can
# only cache local items.
variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
# Pip's cache doesn't store the python packages
# https://pip.pypa.io/en/stable/reference/pip_install/#caching
#
# If you want to also cache the installed packages, you have to install
# them in a virtualenv and cache it as well.
cache:
paths:
- .cache/pip
- venv/
before_script:
- python --version
- pip install virtualenv
- virtualenv venv
- source venv/bin/activate
- pip install -r requirements.txt
stages:
- build
- release
upload package:
stage: release
script:
- pip install twine bump2version
- bump2version --tag release
- python setup.py sdist bdist_wheel
- TWINE_PASSWORD=${PYPI_TOKEN} TWINE_USERNAME=__token__ python -m twine upload --repository-url https://upload.pypi.org/legacy/ dist/*
# Necessary to avoid a bug corrupting the version in setup.py. Just in case it's forgotten to do manually. Now we only have to explicitly bump version for major or minors.
- bump2version patch
- git config --global user.email "${GITLAB_USER_EMAIL}"
- git config --global user.name "${GITLAB_USER_NAME}"
- git remote set-url origin "https://gitlab-ci-token:${MY_PUSH_TOKEN}@gitlab.com/${CI_PROJECT_NAMESPACE}/${CI_PROJECT_NAME}.git"
- git push -o ci.skip --tags origin HEAD:${CI_COMMIT_REF_NAME}
artifacts:
paths:
- dist/*.whl
only:
- master我的项目根目录中还有一个.bumpversion.cfg文件,其内容如下:
[bumpversion]
commit = True
tag = False
current_version = 0.1.0-dev0
parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\-(?P<release>[a-z]+)(?P<build>\d+))?
serialize =
{major}.{minor}.{patch}-{release}{build}
{major}.{minor}.{patch}
[bumpversion:file:setup.py]
[bumpversion:part:build]
[bumpversion:part:release]
optional_value = gamma
values =
dev
gamma使用了两个自定义变量。它们需要添加到回购设置中的CI变量中。如果要在不受保护的分支上使用它们,请确保取消选中受保护的检查。
MY_PUSH_TOKEN --这是在我的配置文件中创建的个人访问令牌。它具有read_repository和write_repository权限。我是这个存储库的所有者/维护者,因此它授予了推动这个回购的权限。PYPI_TOKEN -可选的,需要将包推送到pypi.org。最后但同样重要的是,值得一提的是:
-o ci.skip参数防止生成管道触发循环。用法:
ci工作负责包装,发布,上传和碰撞到下一个补丁。
若要突出大调或小调,请从特性分支中的本地命令行手动调用它,并将其推送。
bump2version工具也会自动处理标记。
用于解决此解决方案的一些资源:
发布于 2021-09-01 11:13:20
一个选项是使用供应链管理 (来自)。为了确定版本,setuptools_scm看了三件事:
如果您有自动标记您的版本的机制,但是您可以选择手动添加标记,那么上述操作是最优的。在任何情况下,您都希望setuptools_scm获取最新的标记(如2.1.12),并使用它更新库的版本。
下面的示例说明了一个典型的设置会是什么样子。我使用了semantic-delivery-gitlab (它使用基于提交消息的语义版本控制)来标记各种提交,但其他方法是可能的。master分支被视为发布分支。
配置setuptools_scm:
# pyproject.toml
[build-system]
requires = ["setuptools>=45", "wheel", "setuptools_scm>=6.2"]
[tool.setuptools_scm]
write_to = "my_library/__version__.py"获取版本:
# `my_library/__init__.py`
try:
from my_library.__version__ import version as __version__
except ImportError:
pass极小.gitlab-ci.yaml
# .gitlab-ci.yaml
stages:
- build
- release
- publish
build:
stage: build
script:
- pip install --upgrade pip
- pip install setuptools setuptools_scm[toml] --upgrade
- python setup.py bdist_wheel
artifacts:
expire_in: 7 days
paths:
- dist/*
.publish:
stage: publish
script:
- WHEEL=$(ls dist)
- publish_artifact.sh # Upload wheel to repository manager (e.g. artifactory)
publish-snapshot:
<<: *publish
except:
- tags
- master
publish-release:
<<: *publish
only:
- tags
release:
stage: release
script:
- npx @hutson/semantic-delivery-gitlab --token ${GITLAB_AUTH_TOKEN}
only:
- master
when: manual # Manually trigger the tagging job for better control您可能还希望将my_library/__version__.py添加到.gitignore中。在此过程结束时,您可以安装软件包并确认它有正确的版本
>>> import my_library
>>> my_library.__version__
1.0.1https://stackoverflow.com/questions/55025067
复制相似问题