Continuous Integration: GitHub Actions

Package Hosting: PyPi

Project Description

Add some description for your project.

[tool.poetry]
name = "python-lifecycle-training"
version = "0.1.0"
repository = "https://github.com/sp-fm/python-lifecycle-training"
documentation = "https://sp-fm.github.io/python-lifecycle-training/"
description = "A training program to learn the Python Development Cycle"
authors = ["Shashanka Prajapati <shashanka@fusemachines.com>"]
readme = "README.rst"
license =  "MIT license"
keywords = []
classifiers = [
    "Development Status :: 2 - Pre-Alpha",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: MIT License",
    "Natural Language :: English",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3 :: Only",
    "Programming Language :: Python :: 3.7",
    "Programming Language :: Python :: 3.8",
]
packages = [
    { include = "python_lifecycle_training" },
    { include = "tests", format = "sdist" },
]

[tool.poetry.urls]
"Bug Tracker" = "https://github.com/sp-fm/python-lifecycle-training/issues"

Token Setup

  • Create a PyPi account if you don’t have one.

  • Goto Account Settings from the top right corner

  • Click Add API token

  • Set the Token name and Scope

  • Click Add token

IMPORTANT NOTICE: Save this token ID somewhere very safe as it represents your PyPi identity. You’ll need this to deploy packages. If you lose it then you’ll have to generate a new one. If others get hold of this token then they can host packages in your name.

Add Token to your Project

  • Go to your project settings

  • Click on Secrets

  • Click on New secret

  • Add your token as PYPI_TOKEN

Sample Configuration

#.github/workflows/upload-python-package.yml
name: Release

on:
  release:
    types: [created]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: "3.x"

      - name: Get full python version
        id: full-python-version
        run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info[:3]))")

      - name: Install and set up Poetry
        run: |
          python -m pip install --upgrade pip
          pip install --upgrade poetry --pre
          poetry config virtualenvs.in-project true

      - name: Set up cache
        uses: actions/cache@v1
        with:
          path: .venv
          key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }}

      - name: Install dependencies
        run: poetry install

      - name: Build and publish
        env:
          PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
        run: |
          poetry config pypi-token.pypi $PYPI_TOKEN
          poetry publish --build

Most of the commands meant for PyPi hosting are handled by poetry.

Tagged Commit

When you push a tag to GitHub it’s called as a tagged commit.

$ poetry version minor
$ git add pyproject.toml
$ git commit -m "chore: bump version from 0.1.0 to 0.2.0"
$ git tag `poetry version -s`
$ git push --tags

Release

  • Click on tags in your project repo

  • Go to Releases

  • Draft a new release

  • Add the tag version, release title, and the description. You can edit the PR description

  • Click on Publish Release

  • Check if your package is there in PyPi

Note

Generally a pre-release is published until it’s stable. It’s published as an official release at a later date.

Add a badge

Release
.. image:: https://github.com/sp-fm/python-lifecycle-training/workflows/Release/badge.svg
    :target: https://pypi.python.org/pypi/python-lifecycle-training
    :alt: Release
PyPi Version
.. image:: https://img.shields.io/pypi/v/python-lifecycle-training.svg
    :target: https://pypi.python.org/pypi/python-lifecycle-training
    :alt: PyPi Version