3 min read

Automating Releases with Poetry, Semantic Release, and Node.js

By combining Poetry, Semantic Release, and Node.js, you can automate the entire release workflow for your Python projects. This approach ensures that your versioning adheres to semantic versioning principles, your changelogs are always up-to-date
Automating Releases with Poetry, Semantic Release, and Node.js

Managing software releases efficiently can make or break a project’s development workflow. Manual versioning, changelog generation, and package publication are prone to human error and can become time-consuming as a project grows. This is where tools like Poetry, Semantic Release, and Node.js come in handy. By combining their strengths, you can create a seamless release process for Python projects that aligns with modern software development practices.

In this post, we’ll explore how to:

  • Use Poetry for Python dependency management and packaging.
  • Automate versioning and changelog generation with Semantic Release.
  • Integrate Node.js for cross-platform build and deployment tasks.

What is Poetry?

Poetry is a modern dependency management and packaging tool for Python. It simplifies the creation, versioning, and distribution of Python projects by managing your pyproject.toml file, dependencies, and virtual environments.

Key Features:

  • Declarative dependency management in pyproject.toml.
  • Easy publishing to PyPI.
  • Built-in support for versioning.

What is Semantic Release?

Semantic Release automates the process of versioning, changelog generation, and package publication based on commit messages. By following the Conventional Commits specification, you can:

  • Determine the next version (major, minor, or patch).
  • Automatically generate changelogs.
  • Publish your package to registries like PyPI or npm.

Setting Up Poetry and Semantic Release

Step 1: Initialize a Poetry Project

First, set up a Python project with Poetry:

poetry new my_project
cd my_project

Update the pyproject.toml file with your project details:

[tool.poetry]
name = "my_project"
version = "0.1.0"
description = "A sample project"
authors = ["Your Name <youremail@example.com>"]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

Step 2: Install Semantic Release

Install python-semantic-release, which provides the tooling to integrate Semantic Release with Python projects:

pip install python-semantic-release

Add Semantic Release configuration to your pyproject.toml:

[tool.semantic_release]
version_variable = "my_project/__init__.py:__version__"
upload_to_pypi = false

Ensure your project’s version is stored in __init__.py:

__version__ = "0.1.0"

Step 3: Write Conventional Commit Messages

Semantic Release determines version bumps and changelogs based on commit messages. Use the following format:

  • fix: [description] for bug fixes (increments PATCH).
  • feat: [description] for new features (increments MINOR).
  • BREAKING CHANGE: [description] for breaking changes (increments MAJOR).

Example:

git commit -m "feat: add user authentication"

Integrating Node.js for Build and Release Automation

Node.js can be used to enhance your release process with additional tools, such as GitHub Actions or npm scripts. Here’s how to integrate it:

Step 1: Initialize Node.js in Your Project

Run the following to create a package.json:

npm init -y

Step 2: Add Semantic Release for Node.js

Install the Semantic Release package for Node.js:

npm install --save-dev semantic-release @semantic-release/changelog @semantic-release/git

Add a .releaserc.json file to configure Semantic Release:

{
  "branches": ["main"],
  "plugins": [
    "@semantic-release/commit-analyzer",
    "@semantic-release/release-notes-generator",
    "@semantic-release/changelog",
    [
      "@semantic-release/git",
      {
        "assets": ["CHANGELOG.md", "pyproject.toml"],
        "message": "chore(release): ${nextRelease.version} [skip ci]"
      }
    ]
  ]
}

Step 3: Update CI/CD Pipelines

Use a CI/CD tool like GitHub Actions to automate your release process:

GitHub Actions Workflow

Create .github/workflows/release.yml:

name: Release

on:
  push:
    branches:
      - main

jobs:
  release:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: 3.9

      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: 16

      - name: Install dependencies
        run: |
          pip install poetry python-semantic-release
          npm install

      - name: Run Semantic Release
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          semantic-release

Benefits of This Setup

  1. Automated Versioning: Ensures consistent version bumps based on commit history.
  2. Changelog Generation: Automatically generates and updates changelogs.
  3. Seamless Integration: Combines the power of Python and Node.js tools.
  4. Time Efficiency: Reduces manual overhead in the release process.

Conclusion

By combining Poetry, Semantic Release, and Node.js, you can automate the entire release workflow for your Python projects. This approach ensures that your versioning adheres to semantic versioning principles, your changelogs are always up-to-date, and your packages are ready for publication without manual intervention. Start integrating these tools today to streamline your development and release cycles!