この記事はGitHub Actions - Qiita Advent Calendar 2024 - Qiita 6日目の記事です(現在12/18ですが、たまたまネタがあったので空いている日に入れてみました)。

GitHub Actionsを使ってリリースを自動化してみたので、私が作った設定を紹介します。

前提

  1. bump-my-versionでソフトウェアのバージョンを上げる
  2. bump-my-versionはバージョンを上げるとGitタグを打ってソースコード中のバージョン番号を更新してくれる
  3. バージョンアップは作業用ブランチで行い、Pull Requestを作成する
  4. バージョン番号入りのGitタグを打ったPull Requestをマージするとリリースされる

bump-my-versionの設定

pyproject.tomlに以下の内容を書きます。

[tool.bumpversion]
current_version = "0.0.0"
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
serialize = ["{major}.{minor}.{patch}"]
search = "{current_version}"
replace = "{new_version}"
regex = false
ignore_missing_version = false
ignore_missing_files = false
tag = true
sign_tags = false
tag_name = "v{new_version}"
tag_message = "Bump version: {current_version} → {new_version}"
allow_dirty = false
commit = true
message = "Bump version: {current_version} → {new_version}"
commit_args = ""
setup_hooks = []
pre_commit_hooks = []
post_commit_hooks = []

[[tool.bumpversion.files]]
filename = "release.sh"
search = "CURRENT_VERSION=\"v{current_version}\""
replace = "CURRENT_VERSION=\"v{new_version}\""

リリース用スクリプトのコード

プロジェクト直下にrelease.shを作成し、以下の内容を書きます。

#!/bin/sh
set -e

CURRENT_VERSION="v0.0.0"
LATEST_RELEASE=$(gh release list --json isLatest,name -q '.[] | select(.isLatest == true) | .name')

if [ "$CURRENT_VERSION" = "$LATEST_RELEASE" ]; then
  echo "Current version ($CURRENT_VERSION) is already released"
  exit 0
fi

gh release create $CURRENT_VERSION --generate-notes

GitHub Actionsの設定

.github/workflows/release.ymlを作成し、以下の内容を書きます。

name: Release

on:
  pull_request_target:
    types:
      - closed

jobs:
  release:
    if: github.event.pull_request.merged == true
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - name: Checkout the code
        uses: actions/checkout@v4
      - name: Release
        run: ./release.sh
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          # GitHub Enterpriseの場合は上記の代わりに以下のように設定する
          # GH_ENTERPRISE_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          # GH_HOST: "example.com"  # GitHub Enterpriseのホスト名

bump-my-versionを実行してPRを作成してくれるGitHub Actionsワークフロー

このワークフローは必須ではありませんが、bump-my-versionの実行をローカル以外でもやりたい場合に役立ちます。

.github/workflows/bump-version.ymlを作成し、以下の内容を書きます。

name: Bump version

on:
  workflow_dispatch:
    inputs:
      bump-type:
        description: 'Bump type'
        required: true
        default: 'patch'
        type: choice
        options:
        - major
        - minor
        - patch

jobs:
  build:
    runs-on: ubuntu-latest

    permissions:
      contents: write
      pull-requests: write

    env:
      BRANCH_NAME: bump-version-${{ github.run_id }}

    steps:
      - name: Checkout the code
        uses: actions/checkout@v4

      - name: Setup Git
        run: |
          git config user.name "github-actions[bot]"
          git config user.email "41898282+github-actions[bot]@users.noreply.github.com"          

      - name: Setup python
        uses: actions/setup-python@v5
        with:
          python-version: '3.12'
          cache: 'pip'

      - name: Install bump-my-version
        run: |
          python -m pip install --upgrade pip
          pip install bump-my-version          

      - name: Bump version
        run: |
          git checkout -b ${{ env.BRANCH_NAME }}
          bump-my-version bump ${{ inputs.bump-type }}
          git push origin ${{ env.BRANCH_NAME }} --tags -f          

      - name: Check
        run: |
          gh pr create -f          
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          # GitHub Enterpriseの場合は上記の代わりに以下のように設定する
          # GH_ENTERPRISE_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          # GH_HOST: "example.com"  # GitHub Enterpriseのホスト名

上記のワークフローはデフォルトの権限では動きません。 該当リポジトリの「Settings」-「Actions」-「General」を開き、「Allow GitHub Actions to create and approve pull requests」にチェックを入れる必要があります。 Organizationの設定で上記を実施できない場合は、Organizationの管理者に連絡して「Allow GitHub Actions to create and approve pull requests」を有効にしてもらってください。

「Allow GitHub Actions to create and approve pull requests」にチェック

上記のワークフローは、該当リポジトリの「Actions」-「Bump version」から手動で実行できます。

ワークフローの呼び出し

ワークフローの実行に成功すると、以下のようにPRが作成されます。

作成されたPR

参考URL