GitHubから自動でPyPIへパッケージ登録

久しぶりに公開しているパッケージ(django-compositepk-model)を更新する必要が出た。

色々新し方法に変わっているようで、パッケージ作成方法をhatchに変更し、GitHubからタグ付け時に自動でパッケージ作成し登録(公開)するようにした。

PyPIの管理画面から案内が出ていた新しいパッケージの作成方法については、以下ページ。

Python Packaging User Guide

日本語ページは以下。

https://packaging.python.org/ja/latest/guides/section-build-and-publish

色々書いてあるが、以下手順で行った。

1)pyproject.toml を書く

プロジェクト直下にpyproject.tomlファイルを作成する。説明通りに順に自分のプロジェクト用を作成した。

  • ビルドバックエンドはhatch用を設定
  • バージョンについては固定値にした※
  • 「実行可能なスクリプトを作成する」「先進的なプラグイン」は関係なし

※バージョンアップ時には、これを書き換えて、タグ付けを行う

自分のプロジェクト構成が特殊で、hatchの標準のディレクトリ構成に合っていないので、hatch用のターゲットファイル指定を追記した。

https://hatch.pypa.io/latest/config/build

今回のパッケージの例では、以下。

https://github.com/Arisophy/django-compositepk-model/blob/main/pyproject.toml

以前のパッケージと構成が合うように、以下を追加している。

[tool.hatch.build.targets.sdist]
include = [
  "compositepk-model/cpkmodel/*.py",
]

[tool.hatch.build.targets.wheel]
packages = ["cpkmodel/"]

[tool.hatch.build.targets.wheel.force-include]
"compositepk-model/cpkmodel" = "cpkmodel"

2)pyproject.tomlの確認

※本手順は、以下3-2)のGitHub上のワークフロー定義でbuildだけを動くようにして(タグを付けなければbuildのみ実行)、作成されたファイルをActionsの結果からダウンロードして確認でもOK

念のため、以前のパッケージと同じ構成でパーケージ作成されることを確認。

ローカルの開発環境で、hatchをインストールして、

pip install hatch

ビルドを行い

hatch build

pyproject.tomlの記述に問題がなく、正しい構成でパッケージが作成されることを確認した。

3)GitHub Actions CI/CD ワークフローを用いてパッケージ配布物のリリースを公開する

「TestPyPI へ公開」 と「配布パッケージに署名する」は必要ないので、以下を行う。

3-1)PyPI側でGitHubからの連携許可

https://pypi.org/manage/account/publishing/ で以下を登録。

  • PyPI Project Name:PyPIのプロジェクト名
  • オーナー:自分のGitHubアカウント
  • Repository name:GitHubのレポジトリ名
  • Workflow name:後で定義するので、適当な名前(release.yml等)

Environment nameは、空欄のままでよい。

3-2)GitHub側でワークフロー定義

.github/workflows/ ディレクトリに、上で定義したWorkflow nameのファイル名でワークフロー定義を作成する。

「配布パッケージに署名する」以下は無視で、基本そのままコピーして、以下のパッケージ名を変えれば良い。

 url: https://pypi.org/p/<package-name>  # Replace <package-name> with your PyPI project name

あとは、起動条件が単にpush時のままでは、ビルドは毎回動くので、以下を参考に条件を付けるとよい。

https://docs.github.com/ja/actions/using-workflows/triggering-a-workflow#using-filters-to-target-specific-branches-or-tags-for-push-events

今回のパッケージの例は以下。

https://github.com/Arisophy/django-compositepk-model/blob/main/.github/workflows/release.yml

Actionのバージョンは、古いとワーニングが出るので、現時点での最新に書き換えている。

4)実行

パッケージを更新する場合には、

  • pyproject.tomlファイルのバージョンを書き換え
  • タグ付けしてpush

すれば、自動でパッケージのバージョンアップ登録されるようになる。

OSSへの参加

Djangoで開発している中で、汎用的なクラスを公開したほうがいいのかなと思い、今までは躊躇していたが、OSSに参加することにした。利用させてもらうだけというのも、確かに申し訳ないし。

まずは、GitHubで業務に関係のない共通的なクラスで、他の人にも役立ちそうなものを登録して、Djangoコミュニティーにも参加していこうかと思う。

1.GitHub

仕事関係は、自分でGitサーバーを立てて管理していたが、共通ライブラリーはGitHubに入れるようにする。

1.1 オープンソースについて

まずは、オープンソースについて知識を入れる。

オープンソースガイドライン

1.2 マークダウン言語

https://guides.github.com/features/mastering-markdown/

https://gist.github.com/mignonstyle/083c9e1651d7734f84c99b8cf49d57fa

1.3 レポジトリーを公開

最初の公開レポジトリーを作成した。

https://github.com/Arisophy/django-searchview

2.Django

(オープンソースとしてのDjango)

https://docs.djangoproject.com/ja/3.1/#the-django-open-source-project

(DjangoのGitHub)

https://github.com/django/django

2.1 Djangoメーリングリストへの参加

まずは、開発者メーリングリストに登録した。

https://docs.djangoproject.com/ja/3.1/internals/mailing-lists/#django-developers

3.パッケージを作る

パッケージを作って、以下に登録した。

https://pypi.org/

最初のパッケージは、以下を作った。

https://pypi.org/project/django-searchview-lib/

3.1 パッケージ作成手順

https://packaging.python.org/tutorials/packaging-projects/

1)以下コマンドでパッケージ作る

python setup.py sdist bdist_wheel

2)パッケージをアップロード

(テスト環境)
python -m twine upload --repository testpypi dist/*

(リリース)
python -m twine upload dist/*