PyPIへのアップロードをAPIトークンを使う形に切り替える

趣味などで書いている自作のいくつかのPythonライブラリをpipで扱えるようにPyPIに登録したりしているのですが、先日新バージョンをアップロードしたら以下のような警告メッセージがPyPIから届くようになっていました。

> During your recent upload or upload attempt to PyPI, we noticed you used basic authentication (username & password). However, your account has two-factor authentication (2FA) enabled.
>
> In the near future, PyPI will begin prohibiting uploads using basic authentication for accounts with two-factor authentication enabled. Instead, we will require API tokens to be used.

どうやらアカウントの2段階認証を設定している状態でのアップロード時の基本的な認証の利用は近い内に禁止となるようです。代わりにAPIトークンを使ってくださいとのことです。

そのため備忘録も兼ねてGitHub Actionsで実行されているPyPIへのアップロードのジョブをPyPIのAPIを使う形に差し替えるための対応をメモしておきます。

# まずはAPIトークンを発行する

警告メッセージの対応手順には以下のように記載されていました。

> First, generate an API token for your account or project at https://pypi.org/manage/account/token/

まずはAPIトークンの発行・・・ということで上記のリンクにアクセスしてログインします。

すると以下のような画面になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/78e33b18-821c-e18d-bc27-a003a2c09ce9.png)

今回はapyscという以下の自作ライブラリのGitHub Actionsでまずは進めていこうと思うのでToken nameはapycs token、ScopeはProject: apyscとして対象ライブラリのみのスコープに設定してみます。Add tokenボタンを押して次に進みます。

再度ログインを要求される画面になりました。ログインしてみた・・・のですがまたToken追加の画面に戻されました。また同じ内容を入力して進んだら今度はトークン発行結果の画面にちゃんとなりました。この遷移は初見の時少し戸惑いますね・・・。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/ff5bf4a9-4982-530f-da97-32e70b19ca01.png)

※トークン部分は灰色で塗りつぶしてあります。

発行されたトークンの文字列をGitHub ActionsのSecretsに登録していきます。まずは右上のSettingsメニューをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/8fd75652-aa89-f128-476d-b8d1d8c1be62.png)

左のメニューにあるSecretsをクリックします。クリック後にいくつか候補が出る場合には今回はGitHub Actionsのものが対象なのでActionsを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/36e55f2d-dd44-4c9a-71d2-01ad192011b6.png)

右上のNew repository secretボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/f314c589-1ab5-9906-eeca-a57e9afad26f.png)

Nameには今回はPYPI_TOKENと設定してValueには先ほど発行されたAPIトークンの文字列をコピペします。Add secretボタンをクリックして保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/f885e9da-aac6-2156-c3fb-0624ed0eb1f9.png)

これで（ミスしていなければ）発行したAPIトークンがGitHub Actions上で扱えるようになりました。

# PyPIへのアップロードのGitHub Actionsのジョブを直す

アップロード用のGitHub ActionsのジョブのYAMLをAPIトークンを使う形に直していきます。

※以前対応した時の古いGitHub Actionsの記事は以下となります。

https://qiita.com/simonritchie/items/629a02fc1ad0fd02d267

下記の資料を読んでいたらpypa/gh-action-pypi-publish@masterのGitHub Actionsのものを使うとシンプルそう・・・だったため、ついでにそちらを使う形に移行してみます。

https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/

最終的にデプロイのジョブ部分は以下のような記述になりました（デプロイに関係ない箇所は一部省略しています）。

```yaml
  DeployToPyPI:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Setup the Python dependencies
        uses: ./.github/actions/setup_py_dependencies
        with:
          python-version: ${{ needs.SetGlobalConstants.outputs.PYTHON_36_VERSION }}
      - name: Execute the Python package build
        run: python ./scripts/build.py
      - name: Upload to PyPI
        uses: pypa/gh-action-pypi-publish@master
        with:
          password: ${{ secrets.PYPI_TOKEN }}
```

やっていることとしては

- リポジトリのclone
- Python実行環境の整備
- setup.pyなどを使ったアップロード用の各種ファイル用のビルドを通す
- pypa/gh-action-pypi-publish@masterを使ったPyPIへのアップロード

だけです。pypa/gh-action-pypi-publish@masterを始めて使ってみましたが設定がシンプルで素敵です・・・！

`${{ secrets.PYPI_TOKEN }}`部分にはGitHub上で設定したSecretsの名前を設定します。

ビルドの処理は以下のスクリプトでsetup.pyを動かす感じで対応しています。ここでは主題からは外れるので詳しくは触れません。

※最終的なGitHub ActionsのYAMLは以下のようになっています。一応リンクは貼っておきますがこちらも各ジョブは今回の主題から外れるので本記事では触れません。また、日々アップデートされていくので記事の内容と将来ずれる可能性があります。

https://github.com/simon-ritchie/apysc/blob/main/.github/workflows/deploy_to_pypi.yml

あとはpushなどしてジョブを動かして終わるのを待てば完了です。

何度か調整などしたりはしましたが無事通ったようです・・・！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/7630081a-b625-654c-a4e3-b01614365f43.png)

# 参考文献・参考サイト

https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/

https://qiita.com/simonritchie/items/629a02fc1ad0fd02d267