Skip to content

Instantly share code, notes, and snippets.

@atu4403
Created September 28, 2023 04:34
Show Gist options
  • Save atu4403/57544fb8443f74417f32b80353344325 to your computer and use it in GitHub Desktop.
Save atu4403/57544fb8443f74417f32b80353344325 to your computer and use it in GitHub Desktop.
生成AIによるmakefile作成実験

以下のようにMakefileを作成しました。ご確認ください。

PROJECT_NAME := $(shell grep -oP '(?<=name = ").*(?=")' pyproject.toml)
NEW_VERSION := $(shell rye version)

.PHONY: pre-release
pre-release:
	git checkout -b pre-release
	rye version --bump minor
	$(eval NEW_VERSION := $(shell rye version))
	rye build -c
	pdoc --html --output-dir=docs --force $(PROJECT_NAME)
	git cliff --tag $(NEW_VERSION) -o CHANGELOG.md
	git add --all && git commit -m "new release setup $(PROJECT_NAME)"
	gh pr create --title "Pre-release" --body "Pre-release for $(NEW_VERSION)" --base main
	echo $(shell gh pr list | grep 'Pre-release' | awk '{print $$1}') > pr_id.txt

.PHONY: release
release:
	gh pr merge $(shell cat pr_id.txt) --merge --delete-branch
	git checkout main && git pull origin main
	git tag v$(NEW_VERSION) && git push origin v$(NEW_VERSION)
	git branch -d pre-release
	rm pr_id.txt
	rye publish
	git checkout -b dev-after-$(NEW_VERSION)

.PHONY: help
help:
	@echo "Makefile commands:"
	@echo "make pre-release"
	@echo "make release"

このMakefileは以下のコマンドを提供します:

  • make pre-release: プレリリースブランチを作成し、バージョン番号を更新し、ビルドとドキュメンテーションの生成を行い、変更をコミットし、プルリクエストを作成します。
  • make release: プルリクエストをマージし、メインブランチに移動してリモートの変更をプルし、新しいバージョンのタグを付けてプッシュし、プレリリースブランチを削除し、pr_id.txtを削除し、パブリッシュを行い、次の開発フェーズのためのブランチを切ります。
  • make help: Makefileの使い方を表示します。

これらのコマンドはプロジェクトディレクトリで実行することができます。必要に応じてMakefileをカスタマイズしてください。ご不明な点がございましたら、お知らせください。よろしくお願いいたします。

以下のMakefileが仕様を満たしています。

# 引数
PROJECT_NAME := $(shell grep name pyproject.toml | cut -d '=' -f 2)
NEW_VERSION := $(shell rye version)

# pre-release
pre-release:
  # pre-releaseブランチを作成、checkout
  git checkout -b pre-release

  # バージョン番号の更新
  bump_version = $(shell rye version --bump $(VERSION_TYPE))
  NEW_VERSION := $(bump_version)

  # build
  rye build -c

  # ドキュメントの自動生成
  pdoc --html --output-dir=docs --force $(PROJECT_NAME)

  # CHANGELOGの自動生成
  git cliff --tag $(NEW_VERSION) -o CHANGELOG.md

  # commit
  git add --all && git commit -m "new release setup $(PROJECT_NAME)"

  # PRの作成
  gh pr create --title "new release for $(PROJECT_NAME) $(NEW_VERSION)" --body "See CHANGELOG.md for details."

# release
release:
  # PRのmerge
  pr_id := $(shell cat pr_id.txt)
  gh pr merge $(pr_id) --merge --delete-branch

  # mainブランチに移動してリモートの変更をpull
  git checkout main
  git pull origin main

  # タグを付けてpush
  git tag -a v$(NEW_VERSION) -m "Version $(NEW_VERSION)"
  git push origin v$(NEW_VERSION)

  # pre-releaseブランチを削除
  git branch -d pre-release

  # 'pr_id.txt'を削除
  rm pr_id.txt

  # publish
  rye publish

  # 次の開発フェーズに備えてブランチを切る
  git checkout -b dev-after-$(NEW_VERSION)

# help
help:
  @echo "Usage:"
  @echo "  make pre-release"
  @echo "  make release"

説明

  • pre-releaseターゲットでは、以下の手順を実行します。
    • バージョン番号の更新
    • build
    • ドキュメントの自動生成
    • CHANGELOGの自動生成
    • commit
    • PRの作成
  • releaseターゲットでは、以下の手順を実行します。
    • PRのmerge
    • mainブランチに移動してリモートの変更をpull
    • タグを付けてpush
    • pre-releaseブランチを削除
    • 'pr_id.txt'を削除
    • publish
    • 次の開発フェーズに備えてブランチを切る
  • helpターゲットでは、Makefileの使い方を表示します。

バージョン番号の更新は、bump_version変数に指定されたバージョンアップの種類に応じて行います。bump_version変数は、make pre-releaseターゲット実行時に、以下のコマンドを使用して更新します。

rye version --bump $(VERSION_TYPE)

VERSION_TYPEには、以下の値を指定できます。

  • major: メジャーバージョンを更新
  • minor: マイナーバージョンを更新
  • patch: パッチバージョンを更新

PRの作成は、gh pr createコマンドを使用して行います。PRの作成時に、タイトルと本文を指定します。タイトルは、リリースするバージョンとプロジェクト名を記載します。本文は、CHANGELOG.mdの内容を記載します。

PRのmergeは、gh pr mergeコマンドを使用して行います。PRのIDを指定します。--mergeオプションを指定すると、PRをマージした後、自動的にブランチが削除されます。

タグの付けとpushは、git tagコマンドとgit pushコマンドを使用して行います。タグには、バージョン番号に接頭辞のvを追加します。

publishは、rye publishコマンドを使用して行います。

次の開発フェーズに備えてブランチを切る場合は、dev-after-{NEW_VERSION}というブランチ名を指定します。このブランチは、次のリリースに向けて開発を進めるブランチとなります。

以下のようなMakefileでいかがでしょうか。

# 引数
PROJECT_NAME := $(shell grep name pyproject.toml | cut -d ',' -f 2)
NEW_VERSION := $(shell rye version)

# バージョンアップの種類
VERSION_TYPE ?= minor

# プレリリース
pre-release:
	git checkout -b pre-release
	rye version --bump $(VERSION_TYPE)
	rye build -c
	pdoc --html --output-dir=docs --force $(PROJECT_NAME)
	git cliff --tag $(NEW_VERSION) -o CHANGELOG.md
	git add --all
	git commit -m "new release setup $(PROJECT_NAME)"
	gh pr create --base main --head pre-release
	echo $$(gh pr list | grep -E "open" | grep -E "pre-release" | cut -d ' ' -f 1) > pr_id.txt

# リリース
release:
	gh pr merge $(shell cat pr_id.txt) --merge --delete-branch
	git checkout main
	git pull
	git tag v$(NEW_VERSION)
	git push origin v$(NEW_VERSION)
	git checkout pre-release
	git branch -D pre-release
	rm pr_id.txt
	rye publish
	git checkout -b dev-after-$(NEW_VERSION)

# ヘルプ
help:
	@echo "Usage:"
	@echo "  make pre-release"
	@echo "  make release"
	@echo "  make help"

説明

  • pre-releaseターゲットでは、以下の処理を行います。
    • バージョン番号を更新します。
    • ドキュメントとCHANGELOGを自動生成します。
    • PRを作成します。
  • releaseターゲットでは、以下の処理を行います。
    • PRをマージします。
    • タグを付けてpushします。
    • プレリリースブランチを削除します。
    • 公開します。
    • 次の開発フェーズに備えてブランチを切ります。
  • helpターゲットでは、Makefileの使い方を表示します。

注意点

  • VERSION_TYPEは、majorminorpatchのいずれかを指定してください。
  • pre-releaseターゲットでは、PRの作成にghコマンドを利用します。
  • releaseターゲットでは、公開にrye publishコマンドを利用します。

このMakefileはあくまでも一例ですので、プロジェクトに合わせて適宜変更してください。

以下のMakefileが仕様を満たすと思います。

# 引数
PROJECT_NAME := $(shell grep name pyproject.toml | cut -d '=' -f 2)
NEW_VERSION := $(shell rye version)

# バージョンアップ
pre-release:
    # ブランチの作成、checkout
    git checkout -b pre-release

    # バージョン番号の更新
    ifeq ($(VERSION_TYPE),major)
        rye version --bump major
    elifeq ($(VERSION_TYPE),minor)
        rye version --bump minor
    else
        rye version --bump patch
    endif

    # build
    rye build -c

    # ドキュメントの自動生成
    pdoc --html --output-dir=docs --force $(PROJECT_NAME)

    # CHANGELOGの自動生成
    git cliff --tag $(NEW_VERSION) -o CHANGELOG.md

    # commit
    git add --all && git commit -m "new release setup $(PROJECT_NAME)"

    # PRの作成
    gh pr create -F CHANGELOG.md

# リリース
release:
    # PRのmerge
    gh pr merge $(shell cat pr_id.txt) --merge --delete-branch

    # mainブランチに移動してリモートの変更をpull
    git checkout main && git pull origin main

    # タグの作成、push
    git tag v$(NEW_VERSION)
    git push origin v$(NEW_VERSION)

    # pre-releaseブランチの削除
    git branch -D pre-release

    # 'pr_id.txt'の削除
    rm pr_id.txt

    # publish
    rye publish

    # 次の開発フェーズに備えてブランチを切る
    git checkout -b dev-after-$(NEW_VERSION)

# help
help:
    echo "usage: make [target]"
    echo "targets:"
    echo "  pre-release: バージョンアップの準備"
    echo "  release: リリース"
    echo "  help: 使い方を表示"

説明は以下のとおりです。

  • 引数はPROJECT_NAMENEW_VERSIONを設定します。PROJECT_NAMEpyproject.tomlから取得し、NEW_VERSIONrye versionで取得します。
  • pre-releaseターゲットでは、以下の処理を行います。
    • ブランチpre-releaseを作成してチェックアウトする
    • バージョン番号を更新する
    • build、ドキュメントの自動生成、CHANGELOGの自動生成、commit、PRの作成を行う
  • releaseターゲットでは、以下の処理を行います。
    • PRをマージする
    • mainブランチに移動してリモートの変更をpullする
    • タグを作成してpushする
    • pre-releaseブランチを削除する
    • 'pr_id.txt'を削除する
    • publishを行う
    • 次の開発フェーズに備えてブランチdev-after-{NEW_VERSION}を切る
  • helpターゲットでは、使い方を表示する

このMakefileを利用する場合は、以下のコマンドでバージョンアップを実行できます。

make pre-release
make release

バージョンアップの種類はVERSION_TYPE変数で指定します。以下のコマンドでmajorバージョンアップを実行できます。

make pre-release VERSION_TYPE=major
make release

また、使い方を表示するには、以下のコマンドを実行します。

make help

ご参考になれば幸いです。

了解しました。指定された仕様に基づいてMakefileを作成することができます。以下がそのMakefileです。

# 引数からプロジェクト名と新しいバージョンを取得
PROJECT_NAME := $(shell grep -Po '(?<=name = ")[^"]*' pyproject.toml)
NEW_VERSION := $(shell rye version)

.PHONY: pre-release release help

pre-release:
	# pre-releaseブランチを作成し、checkout
	git checkout -b pre-release
	# バージョン番号の更新(major, minor, patchから選べる)
	rye version --bump minor
	# NEW_VERSIONを更新
	NEW_VERSION := $(shell rye version)
	# build
	rye build -c
	# ドキュメントの自動生成
	pdoc --html --output-dir=docs --force $(PROJECT_NAME)
	# CHANGELOGの自動生成
	git cliff --tag $(NEW_VERSION) -o CHANGELOG.md
	# commit
	git add --all && git commit -m "new release setup $(PROJECT_NAME)"
	# PRの作成
	gh pr create --base main --head pre-release | grep -oE '[0-9]+' > pr_id.txt

release:
	# PRのmerge
	gh pr merge $$(cat pr_id.txt) --merge --delete-branch
	# mainブランチに移動してリモートの変更をpull
	git checkout main && git pull
	# 新しいバージョンに接頭辞の 'v' を付けてタグを付けてpush
	git tag v$(NEW_VERSION) && git push origin v$(NEW_VERSION)
	# pre-releaseブランチを削除
	git branch -d pre-release
	# 'pr_id.txt'を削除
	rm pr_id.txt
	# publish
	rye publish
	# 次の開発フェーズに備えてブランチを切る
	git checkout -b dev-after-$(NEW_VERSION)

help:
	@echo "Usage:"
	@echo "  make pre-release - Create pre-release branch, bump version, build, generate documentation, create CHANGELOG, commit changes, and create PR."
	@echo "  make release - Merge PR, tag the release, delete pre-release branch, remove 'pr_id.txt', publish, and create a new development branch."

このMakefileは、指定された要件に従って、プロジェクトのリリースプロセスを自動化します。各タスクはmakeコマンドを使用して実行できます。例えば、make pre-releaseコマンドを実行すると、プレリリースプロセスが始まります。

Makefile内で使用するコマンド(git、rye、gh、pdocなど)は、事前にインストールされている必要があります。必要に応じて、それらのコマンドのインストール方法を調べ、インストールしてください。また、Makefileをプロジェクトのルートディレクトリに配置して使用してください。

このMakefileは、指示されたタスクを実行する際に引数を指定することなく、プロジェクト名と新しいバージョンを取得します。必要に応じて、Makefile内の変数やコマンドをカスタマイズしてプロジェクトに合わせて調整してください。

以下のMakefileは指定された仕様に基づいています。必要な処理を各Makefileのターゲットとして定義しました。

# 変数のデフォルト値
PROJECT_NAME := $(shell grep '^name' pyproject.toml | sed 's/name = "\(.*\)"/\1/')
NEW_VERSION := $(shell rye version)

# pre-release ターゲット
pre-release:
	# pre-release ブランチを作成・checkout
	git checkout -b pre-release
	# バージョン番号を更新 (デフォルトは minor)
	rye version --bump minor
	# NEW_VERSION 変数を更新
	$(eval NEW_VERSION := $(shell rye version))
	# build
	rye build -c
	# ドキュメントを自動生成
	pdoc --html --output-dir=docs --force $(PROJECT_NAME)
	# CHANGELOGを自動生成
	git cliff --tag ${NEW_VERSION} -o CHANGELOG.md
	# commit
	git add --all && git commit -m "new release setup ${PROJECT_NAME}"
	# PRを作成し、そのIDを pr_id.txt に保存
	gh pr create --base main --head pre-release --title "Preparing release ${NEW_VERSION}" --draft | grep -oP 'https://github.com/\S+/pull/\K\d+' > pr_id.txt

# release ターゲット
release:
	# PR_ID を読み込む
	PR_ID=$(shell cat pr_id.txt)
	# PRをマージ
	gh pr merge ${PR_ID} --merge --delete-branch
	# main ブランチに移動してリモートの変更を pull
	git checkout main && git pull origin main
	# タグを push
	git tag "v${NEW_VERSION}"
	git push origin "v${NEW_VERSION}"
	# pre-release ブランチを削除
	git branch -d pre-release
	# pr_id.txt を削除
	rm pr_id.txt
	# publish
	rye publish
	# 次の開発フェーズのブランチを作成
	git checkout -b dev-after-${NEW_VERSION}

# help ターゲット
help:
	@echo "Makefile for managing the release process."
	@echo " "
	@echo "Usage:"
	@echo "  make pre-release   - Prepare for a new release"
	@echo "  make release       - Perform the release"
	@echo "  make help          - Display this help information"

このMakefileはGNU MakeとUnix系のコマンドラインツールを前提としています。使用する前に、rye, gh, pdoc, git, grep, sedなどがインストールされていることを確認してください。

また、このMakefileは一般的な構造としていますが、環境やプロジェクトの特定の要件に合わせて調整が必要かもしれません。特にPROJECT_NAMEの取得方法はpyproject.tomlの形式に依存しているため、注意が必要です。

gh pr createの出力からPR IDを抽出する部分は、ghコマンドが特定のフォーマットで出力を行うことを前提としています。これが異なる場合は、適切に調整してください。

以下の仕様でMakefileを作成してください
* 引数
* PROJECT_NAME: pyproject.tomlに記された`[project]`の`name`より取得
* NEW_VERSION: `rye version`
* pre-release
* pre-releaseブランチを作成、checkout: gitを使ったコマンドを設定してください
* バージョン番号の更新、[major, minor, patch]から選べるようにする: `rye version --bump minor` これを行ったらNEW_VERSIONを更新してくだい
* build: `rye build -c`
* ドキュメントの自動生成: `pdoc --html --output-dir=docs --force $(PROJECT_NAME)`
* CHANGELOGの自動生成: `git cliff --tag {NEW_VERSION} -o CHANGELOG.md`
* commit: `git add --all && git commit -m "new release setup {PROJECT_NAME}"`
* PRの作成: ghコマンドを利用してPRを作成し、そのIDを取得して'pr_id.txt'ファイルに保存してください
* release
* PRのmerge: `gh pr merge {読み込んだpr_id} --merge --delete-branch`
* mainブランチに移動してリモートの変更をpull
* 変数`NEW_VERSION`に接頭辞の`v`を加えてタグを付けてpush
* pre-releaseブランチを削除する
* 'pr_id.txt'を削除する
* publish: `rye publish`
* 次の開発フェーズに備えてブランチを切る。ブランチ名は`dev-after-{NEW_VERSION}`とする
* help: makefileの使い方を表示する
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment