Setting up python-semantic-release on GitHub Actions#

Python Semantic Release includes a GitHub Action which runs the version and publish commands. The repository is set to PyPI. You can read the full set of inputs available, and their descriptions in the action definition.

Your project’s configuration file will be used as normal.

The GitHub Action provides the following outputs:

Output

Description

released

“true” if a release was made, “false” otherwise

version

The newly released version if one was made, otherwise the current version

tag

The Git tag corresponding to the “version” output. The format is dictated by your configuration.

Example Workflow#

name: Semantic Release

on:
  push:
    branches:
      - master

jobs:
  release:
    runs-on: ubuntu-latest
    concurrency: release
    permissions:
      id-token: write
      contents: write

    steps:
    - uses: actions/checkout@v3
      with:
        fetch-depth: 0

    - name: Python Semantic Release
      uses: python-semantic-release/python-semantic-release@master
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}

concurrency is a beta feature of GitHub Actions which disallows two or more release jobs to run in parallel. This prevents race conditions if there are multiple pushes in a short period of time.

If you would like to use Python Semantic Release to create GitHub Releases against your repository, you will need to allow the additional contents: write permission. More information can be found in the permissions for GitHub Apps documentation

Warning

You must set fetch-depth to 0 when using actions/checkout@v2, since Python Semantic Release needs access to the full history to determine whether a release should be made.

Warning

The GITHUB_TOKEN secret is automatically configured by GitHub, with the same permissions as the user who triggered the workflow run. This causes a problem if your default branch is protected.

You can work around this by storing an administrator’s Personal Access Token as a separate secret and using that instead of GITHUB_TOKEN. In this case, you will also need to pass the new token to actions/checkout (as the token input) in order to gain push access.

Multiple Projects#

If you have multiple projects stored within a single repository (or your project is not at the root of the repository), you can pass the directory input. The step can be called multiple times to release multiple projects.

- name: Release Project 1
  uses: python-semantic-release/python-semantic-release@master
  with:
    directory: ./project1
    github_token: ${{ secrets.GITHUB_TOKEN }}

- name: Release Project 2
  uses: python-semantic-release/python-semantic-release@master
  with:
    directory: ./project2
    github_token: ${{ secrets.GITHUB_TOKEN }}