GitHub ActionsでAPI tokenを使ってPyPIへリリースする

2019-11-24·
Aki Ariga
Aki Ariga
· 2 min read

ふと思い立って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への書き込みが何故かできない
  • マイナーなハマりどころに対して情報が少なくデバッグも厳しい

というところだろう。

実際のテストのワークフローはこちら

chezou/tabula-py

GitHub ActionsからPyPIへリリースする

実際のworkflowを見てもらうと速いと思う。

chezou/tabula-py

もともと、公式で用意されていたWorkflowはReleaseが作成されたときにpublishされるというものだったが、setuptools-scmでタグを付けるとバージョンも付与されるようにしていたので、

  1. tagをpush (するとversionも付与される)。あるいはtagをGitHubで作成しても良い
  2. GitHub Actionsによって、tagからreleaseが作成される
  3. 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_PASSWORDpypi- からはじまるAPI Tokenにすれば良い。ちょいちょいこの仕様が変わっていたこともあるので、最新情報はドキュメントを確認してほしい。

TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}

Workflowの中にはtwine用の環境変数が用意されている。便利。


Back to home

Aki Ariga
Authors
Principal Software Engineer
Interested in Machine Learning, ML Ops, and Data driven business. If you like my blog post, I’m glad if you can buy me a tea 😉

Related