Python ライブラリの保守は、特に新しいバージョンをリリースする場合に困難になることがあります。このプロセスを手動で行うと、時間がかかり、エラーが発生しやすくなります。この投稿では、GitHub Actions と Commitizen を使用してリリース プロセスを自動化する手順を説明します。このアプローチにより、リリースの一貫性が確保され、セマンティック バージョニング (semver) が遵守され、変更ログが最新に保たれると同時に、手動による介入が減ります。
セマンティック バージョニング (semver) は、MAJOR.MINOR.PATCH 形式の 3 つの数値を使用するバージョン管理スキームです。このスキームは、各リリースでの変更点を伝える明確かつ予測可能な方法を提供します。
セマンティック バージョニングは、開発者が依存関係を効果的に管理するのに役立つため、非常に重要です。ライブラリの新しいバージョンに重大な変更 (マイナー アップデートやパッチ アップデートなど) が導入されないことがわかっている場合は、アプリケーションの破損を心配することなく、自信を持って依存関係を更新できます。
semver の詳細については、semver.org をご覧ください。
Commitizen は、コミットメッセージを標準化し、バージョン管理と変更ログの作成を自動化するツールです。特定のコミット メッセージ形式を強制することにより、Commitizen は必要なバージョン バンプの種類 (メジャー、マイナー、またはパッチ) を判断し、変更ログを自動的に生成できます。
コミットメッセージの形式は次の構造に従います:
<commit-type>(<topic>): the commit message
例:
feat(parser): add support for parsing new file formats
fix(api): handle null values in the response
feat(api): change response of me endpoint BREAKING CHANGE: changes the API signature of the parser function
この例では、feat コミット内の BREAKING CHANGE ノートがメジャー バージョン バンプをトリガーします。この一貫性により、バージョン番号が適切なレベルの変更を確実に伝えることができます。これは、ライブラリを利用するユーザーにとって重要です。
Commitizen を Python プロジェクトと統合するには、pyproject.toml ファイルで構成する必要があります。追加する必要がある構成は次のとおりです:
[tool.commitizen] name = "cz_conventional_commits" version = "0.1.0" tag_format = "v$version" version_files = [ "pyproject.toml:version", ] update_changelog_on_bump = true
説明:
リリースを手動で管理するのは面倒で、特にプロジェクトが成長するにつれてエラーが発生しやすくなります。自動化はいくつかの重要な利点をもたらします:
自動化がどのように機能するかを明確に理解できるように、概要を次に示します。
簡単かつ明確にするために、自動化を 2 つのワークフローに分割します。
This workflow handles the logic of detecting changes and bumping the version:
name: Merge to Main on: push: branches: - "main" concurrency: group: main cancel-in-progress: true jobs: bump: if: "!startsWith(github.event.head_commit.message, 'bump:')" runs-on: ubuntu-latest steps: - name: Setup Python uses: actions/setup-python@v5 with: python-version: "3.10" - name: Checkout Repository uses: actions/checkout@v4 with: token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} fetch-depth: 0 - name: Create bump and changelog uses: commitizen-tools/commitizen-action@0.21.0 with: github_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} branch: main
Explanation:
This workflow is triggered when a tag is pushed, and it handles the release process:
name: On Tag Creation on: push: tags: - 'v*' concurrency: group: tag-release-${{ github.ref }} cancel-in-progress: true jobs: detect-release-parameters: runs-on: ubuntu-latest outputs: notes: ${{ steps.generate_notes.outputs.notes }} steps: - name: Setup Python uses: actions/setup-python@v5 - name: Checkout Repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Get release notes id: generate_notes uses: anmarkoulis/commitizen-changelog-reader@v1.2.0 with: tag_name: ${{ github.ref }} changelog: CHANGELOG.md release: runs-on: ubuntu-20.04 needs: detect-release-parameters steps: - name: Checkout repo uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.10" - name: Install dependencies run: | python -m pip install --upgrade pip pip install poetry - name: Configure pypi token run: | poetry config pypi-token.pypi ${{ secrets.PYPI_TOKEN }} - name: Build and publish package run: | poetry publish --build release-github: runs-on: ubuntu-latest needs: [release, detect-release-parameters] steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Create Release Notes File run: | echo "${{ join(fromJson(needs.detect-release-parameters.outputs.notes).notes, '') }}" > release_notes.txt - name: Create GitHub Release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} VERSION: ${{ github.ref_name }} run: | gh release create ${{ github.ref }} \ --title "Release $VERSION" \ --notes-file "release_notes.txt"
Explanation:
To ensure the workflows can perform actions like creating commits and tagging releases, you’ll need to set up a Personal Access Token (PAT) in your GitHub repository:
This token is crucial because it allows the workflow to push changes (like the updated changelog and version bump) back to the repository.
After running the workflows, a CHANGELOG.md file will be generated and updated automatically. Here’s an example of what it might look like:
## v2.0.0 (2021-03-31) ### Feat - **api**: change response of me endpoint ## v1.0.1 (2021-03-30) ### Fix - **api**: handle null values in the response ## v1.0.0 (2021-03-30) ### Feat - **parser**: add support for parsing new file formats
This CHANGELOG.md is automatically updated by Commitizen each time a new version is released. It categorizes changes into different sections (e.g., Feat, Fix), making it easy for users and developers to see what's new in each version.
Finally, here’s what a GitHub release looks like after being created by the workflow:
Incorrect Token Permissions: If the workflow fails due to permission errors, ensure that the PAT has the necessary scopes (e.g., repo, workflow).
Commitizen Parsing Issues: If Commitizen fails to parse commit messages, double-check the commit format and ensure it's consistent with the expected format.
Bump Commit Conflicts: If conflicts arise when the bump commit tries to merge into the main branch, you might need to manually resolve the conflicts or adjust your workflow to handle them.
Concurrent Executions: Without proper concurrency control, multiple commits or tags being processed simultaneously can lead to issues like duplicate version bumps or race conditions. This can result in multiple commits with the same version or incomplete releases. To avoid this, we’ve added concurrency settings to both workflows to ensure only one instance runs at a time for each branch or tag.
Automating the release process of your Python library with GitHub Actions and Commitizen not only saves time but also ensures consistency and reduces human errors. With this setup, you can focus more on developing new features and less on the repetitive tasks of managing releases.
As a next step, consider extending your CI/CD pipeline to include automated testing, code quality checks, or even security scans. This would further enhance the robustness of your release process.
If you found this post helpful, please feel free to share it with others who might benefit. I’d love to hear your thoughts or any questions you might have in the comments below. Have you implemented similar workflows in your projects? Share your experiences!
以上がGitHub Actions と Commitizen を使用した Python ライブラリのリリースの自動化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。