GitHub ActionsでAPI tokenを使ってPyPIへリリースする
2019-11-24·
·
2 min read

Aki Ariga
ふと思い立ってtravisを捨ててGitHub Actionsを使ったPythonのテストを行うようにしてみた。また、ついでにPyPIへリリースもできるようにしてみた。
GitHub ActionsをPythonのテストに使う
GitHub ActionsをPythonに使うメリットとしては
- OS (Ubuntu, macOS, Windows) や Python versionのmatrixが使えて複数バージョンのテストが楽
- JDKなど追加の依存のインストールも
uses
を使ってサクッとできる - 起動もまあまあ速い
といった点が上げられる。
例えば、JDK 12を入れようと思ったら、このような記述をしてあげれば良い。楽。
- uses: actions/setup-java@v1
with:
java-version: '12'
java-package: jdk
architecture: x64
一方、残念な点としては
- Windowsのtemp directoryへの書き込みが何故かできない
- マイナーなハマりどころに対して情報が少なくデバッグも厳しい
というところだろう。
実際のテストのワークフローはこちら
GitHub ActionsからPyPIへリリースする
実際のworkflowを見てもらうと速いと思う。
もともと、公式で用意されていたWorkflowはReleaseが作成されたときにpublishされるというものだったが、setuptools-scmでタグを付けるとバージョンも付与されるようにしていたので、
- tagをpush (するとversionも付与される)。あるいはtagをGitHubで作成しても良い
- GitHub Actionsによって、tagからreleaseが作成される
- releaseからwheelを作成、PyPIへAPI Tokenを使ってpublishする
という流れを作ってみた。便利なのはtagを打ってpushするだけでこれが行けること。
ポイントは
on:
push:
tags:
- 'v*'
のように、トリガーをtagsにすることと
deploy:
needs: release
のように、 release
jobを依存関係として追加すること。
PyPIのAPI Tokenは、予めPyPIにて取得しておく。Project単位でのscopeを設定できるので、今回はtabula-pyのアップロードのためにだけ使うことにした。 Projectの Settings → Secrets から PYPI_USERNAME
を __token__
に、 PYPI_PASSWORD
を pypi-
からはじまるAPI Tokenにすれば良い。ちょいちょいこの仕様が変わっていたこともあるので、最新情報はドキュメントを確認してほしい。
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
Workflowの中にはtwine用の環境変数が用意されている。便利。