This is a Github Actions workflow for automatic publications to PyPi. Version data from a python file is extracted and then used by the PyPi setup process which will publish the package to PyPi Test and Prod, following PyPi's Trusted Publishing model.
The workflow will only be triggered for the publication of new repo releases / prereleases for the 'master' repo branch.
This repo contains three files that you may need to amend and copy to your Github repository:
setup.py: this is a regular Pythonsetup.pyfile; amend the file content with your package information and then save the file in your repo's root directorypublish-to-pypi.yml: Edit this file, amend the configuration settings (see next chapter) and then save the file in your repo's Github Actions directory (.github/workflows). You may also need to activate the new workflow once you have installed it - see documentation on Github.
Open the file. You will notice a section which looks like this:
env:
# relative path to the file containing your version info, e.g.
# ./MyLib/MyLib.py
SOURCE_FILE: ./REPLACE/ME
# Regex pattern used for extracting the version data from your file
# (usually, this does not need to be changed)
REGEX_PATTERN: __version__\s*=\s*"(.*)"
# Python version used for building the package
PYTHON_VERSION: '3.11'Replace the placeholder for the source file with the relative path to your Python file which contains the version information. Amend the RegEx and the Python version, if necessary.
Open the file. You will need to pupulate the header fields:
# source path for the class' package. Amend if necessary
PACKAGE_SOURCE_DIR = "path/to/class/directory"
# Amend this section with your custom data
PACKAGE_NAME="package-name"
DESCRIPTION = "package-description"
AUTHOR = "author-name"
AUTHOR_EMAIL = "author@email.com"
URL = "https://www.url.com/to/my/repository"
# https://pypi.org/classifiers/
CLASSIFIERS = [
"Intended Audience :: Developers",
"Programming Language :: Python",
"Programming Language :: Python :: 3",
"Topic :: Software Development",
"Operating System :: OS Independent",
"Development Status :: 4 - Beta",
"Framework :: Robot Framework",
]
INSTALL_REQUIRES=[
"package_1",
"package_2"
]
KEYWORDS=[
"Notifications",
"Notification Service",
"Push Notifications",
"Notifier",
"Alerts",
"Robot Framework"
]
LICENSE="GNU General Public License v3 (GPLv3)"PACKAGE_SOURCE_DIR- the path to your package source directory, containing your Python codePACKAGE_NAME- (future) PyPi package nameDESCRIPTION- PyPi package short dkescriptionAUTHORandAUTHOR_EMAIL- self-explanatoryURL- URL to your package`s repository on GitHubCLASSIFIERS- List of classifiers; have a look at the official listINSTALL_REQUIRES- Python packages that are required by your packageKEYWORDS- Keywords which are associated with your Python package
[!INFO] When being run as part of the provided GitHub workflow,
setup.pywill receive the future Python package's version info from the GitHub workflow and store it in theGITHUB_PROGRAM_VERSIONvariable. If you intend to install the package directly viapip install, you need to set the version info directly in the setup file or the process will fail.
Necessary steps for a manual usage:
- open
setup.pyand assign a version number to theGITHUB_PROGRAM_VERSIONvariable pip install git+https://github.com/my-repository-name@my-branch#egg=my-package-name
The workflow uses PyPi's Trusted Publisher model. For a new project on PyPi, follow these instructions for setting up a trusted publisher. For an existing project which you may want to migrate from a secret-based workflow to the new trusted workflows, use these instructions.
- In your GitHub project, go to Settings > Environments and create a new environment called
pypi. - Configure
Required reviewersor other settings, if necessary. You do NOT need to configure any secrets here.
- You need to configure the files prior to deployment, see previous chapter Configuration file instructions
setup.pygoes into your repository's root directorypublish-to-pypi.ymlgoes into your repository's.github/workflowsdirectory (or add as a new GitHub action)
- Log on to your PyPi Test & Prod accounts
- Follow the instructions on how to set up a Trusted Publisher on both Test and Prod environments:
- Set the
Workflow Nametopublish-to-pypi.yml - Set the
Environmenttopypi
- Set the
This Github action will do the following whenever a new release/pre-release is published for the 'master' branch:
- Read the Python file and extract the version information, based on the given Regex. Abort job if no match was found.
- Check if the Github
ref_typehas the valuetag. This is only the case when you drafted a new release. Otherwise, this value is likely set tomaster. Abort job in case of a mismatch. - Check if the Github
ref_nameis equal to the extracted version from you Python file. Abort job in case of a mismatch. This will prevent issues where there is a mismatch between your Github release version (tag) and the one in the Python file. - Build the PyPi package. Deploy it to PyPi Test and (if successful AND not a pre-release) PyPi Prod. Note: This is done as a separate workflow step, see this issue for technical details.
This job will be triggered for releases AND prereleases in 'created' state (read: you tag a (pre)release in Github). Releases will be pushed to both PyPi Test and Prod whereas prereleases will only be pushed to PyPi Test.
- Publish your package as a prerelease. This should deploy your code only to PyPi Test.
A basic workflow diagram of this Github Action can be found here