DEV Community

Cover image for PyPI release using GitHub Actions
Andrew May for Leading EDJE

Posted on

PyPI release using GitHub Actions

My Workflow

I'm making use of the release event in a GitHub action to release my open source stackmanager project to PyPI. This allows me to use the GitHub tag name for the PyPI release and just have one place to manage versions.

I don't always want to release a new version after a PR is merged to master, so this gives me manual control over releases.

This has been my first time using GitHub Actions and I've been generally pleased with how it worked but found some of the documentation to be a bit cryptic.

Submission Category:

Maintainer Must-Haves

Yaml File or Link to Code

GitHub logo LeadingEDJE / stackmanager

Utility for managing Cloudformation stacks


PyPI version Coverage Status

Utility to manage CloudFormation stacks based upon a Template (either local or in S3) and a YAML configuration file.

Uses ChangeSets to create or update CloudFormation stacks, allowing the ChangeSets to either be automatically applied or applied later (e.g. during a later phase of a build pipeline after review of the ChangeSet).

There are also some utility methods for building a lambda file zip and uploading files to S3 These are to provide some of the AWS SAM CLI functionality while fitting into the workflow and configuration style of stackmanager.


The configuration file can either be a single YAML document containing the configuration for a stack for a specific environment and region, or can contain multiple documents for different deployments of that stack to different environments and regions.

Single Environment

The configuration combines together the different values that are typically passed to the CloudFormation command line when creating…

Specifically, the release.yml workflow is triggered on release.

Additional Info

The version of the release is taken from the github.event.release.tag_name property of the release event and passed to as the STACKMANAGER_VERSION environment variable.

I'm using a PyPI API token restricted to this project so that I don't have to store a username and password in GitHub secrets (this also allows me to turn on 2FA for my PyPI account).

    - name: Package and Upload
        STACKMANAGER_VERSION: ${{ github.event.release.tag_name }}
        TWINE_USERNAME: __token__
        TWINE_PASSWORD: ${{ secrets.PYPI_APIKEY }}
      run: |
        python sdist bdist_wheel
        twine upload dist/*

Top comments (1)

eitchtee profile image
Herculino Trotta

I have a very similar action for my packages, but I've been bumping versions manually for all this time, this changes everything.

Great work!