Utility to aid in incrementing the semantic version of a Python package in an automated build
Project description
semantic-version-inator
Utility to aid in incrementing the semantic version of a Python package in an automated build.
How to use:
Set up CI/CD pipeline/workflow to set parameters: release_type
and current_version
The release_type
parameter should have a default value of PATCH, with an option to set as MINOR
or MAJOR as appropriate. This param could be user selectable when manually triggering a build, or
could be automated if a means of programmatically determining type of release is possible.
The current_version
parameter must be derived from the latest published package version.
One option is to download the latest (i.e. pip download) and parse the file name from the file.
Installing this package installs two console commands, each taking the two arguments noted above:
get_next_ver_file_name
is a convenience function, intended to parse the current version
from a package file name, i.e. pkg_name-0.0.0-py3-none-any.whl:
input/output examples:
get_next_ver_file_name pkg_name-0.0.0-py3-none-any.whl PATCH
0.0.1
get_next_ver_file_name pkg_name-0.0.0-py3-none-any.whl MINOR
0.1.0
get_next_ver_file_name pkg_name-0.0.0-py3-none-any.whl MAJOR
1.0.0
get_next_ver
is an alternative to the above in case the above does not handle a given package
name well, or if the version is obtained independently of the current version package file name.
It is intended to receive the current semantic version (not file name), i.e. 0.0.0:
input/output examples:
get_next_ver 0.0.0 PATCH
0.0.1
get_next_ver 0.0.0 MINOR
0.1.0
get_next_ver 0.0.0 MAJOR
1.0.0
When the new version number is derived using one of the options above, set it as an environment variable, which setup.py can use to dynamically set during the package build process, i.e.:
setup.py sample content:
PKG_VERSION = "0.0.0"
try:
new_ver = os.environ["new_ver"]
if new_ver:
PKG_VERSION = new_ver
else:
print("new_ver not found, using PKG_VERSION default:", PKG_VERSION)
except KeyError:
print("new_ver not found, using PKG_VERSION default:", PKG_VERSION)
setup(
...
version=PKG_VERSION,
...
)
Example Github Actions workflow using the above - note:
- replace <<<PROJECT_NAME>>> with actual repository directory (project) name
- assumes this package is pip installed as one of the dev-dependencies
name: Build <<<PROJECT_NAME>>>
on:
push:
branches:
- "main"
workflow_dispatch:
inputs:
publishPackage:
description: Publish Package
required: true
default: false
type: boolean
versionType:
description: 'Version Type'
required: true
default: 'PATCH'
type: choice
options:
- 'PATCH'
- 'MINOR'
- 'MAJOR'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
path: <<<PROJECT_NAME>>>
- name: set vars
run: |
publishPackage="false"
if [ "${{ github.event.inputs.publishPackage }}" != "" ]
then
publishPackage="${{ github.event.inputs.publishPackage }}"
fi
echo "publishPackage=$publishPackage" >> $GITHUB_ENV
versionType="PATCH"
if [ "${{ github.event.inputs.versionType }}" != "" ]
then
versionType="${{ github.event.inputs.versionType }}"
fi
echo "versionType=$versionType" >> $GITHUB_ENV
- name: check vars
run: |
echo "publishPackage: ${{ env.publishPackage }}"
echo "versionType: ${{ env.versionType }}"
- name: Set up Python 3.10
uses: actions/setup-python@v3
with:
python-version: "3.10"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f <<<PROJECT_NAME>>>/requirements-dev.txt ]; then pip install -r <<<PROJECT_NAME>>>/requirements-dev.txt; fi
- name: Run pylint
run: |
pylint <<<PROJECT_NAME>>>/<<<PROJECT_NAME>>> --fail-under=8
- name: Run pytest
run: |
pytest <<<PROJECT_NAME>>> --cov-report=html --cov-branch --cov=.
- name: Check coverage
run: |
coverage report --fail-under=80 --omit="setup.py,*/__init__.py,*/tests/*"
- name: Get next version
continue-on-error: true
run: |
pip download <<<PROJECT_NAME>>>
file_name=$(ls <<<PROJECT_NAME>>>*.whl)
if [ "$file_name" != "" ]
then
new_ver=$(get_next_ver_file_name $file_name ${{ env.versionType }})
echo "new_ver: "$new_ver
echo "new_ver=$new_ver" >> $GITHUB_ENV
else
echo "unable to get next version"
fi
- name: Build package
run: |
cd <<<PROJECT_NAME>>>
python -m build --wheel
- name: Publish package to pypi
if: ${{ env.publishPackage == 'true' }}
uses: pypa/gh-action-pypi-publish@release/v1.5
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}
packages_dir: <<<PROJECT_NAME>>>/dist
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
File details
Details for the file semantic_version_inator-0.0.2-py3-none-any.whl
.
File metadata
- Download URL: semantic_version_inator-0.0.2-py3-none-any.whl
- Upload date:
- Size: 9.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.9.13
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8d95a1ae452697ded419b8be60a866923301e8e4514252373f734c2284c73351 |
|
MD5 | 4c223f4d38c900fe90697e85d3f2aa1f |
|
BLAKE2b-256 | 3a9d8a9104e28733c7e452a133d2c7a3be6bb29ede81ad2cb4d17e776a4c6d66 |