Pythonの将棋ライブラリcshogiをPyPIで公開しているが、PyPIに公開するまでの手順が多いため、GitHub Actionsを使って自動化を行った。
前提
cshogiは、CythonとC++を使用しているため、ビルドが必要になる。
WindowsではVisual Studioが必要になる。
Linuxでは複数ディストリビューションに対応したバイナリを作成する必要があるため、manylinuxを使用してビルドが必要である。
また、Pythonのバージョンごとにバイナリを用意する必要がある。
Actions secrets
PyPIにアップロードする際に、アカウント情報が必要になるため、事前にGitHubのActions secretsに登録を行う。
手順は公式のドキュメントを参照した。
https://docs.github.com/ja/actions/security-guides/encrypted-secrets
Repository secretsにユーザ名とパスワードをそれぞれPYPI_USERNAMEとPYPI_PASSWORDとして登録した。
GitHub Actionsの定義作成
.github/workflowsにpublish.ymlを作成し、公式のドキュメントを参照しながら、GitHub Actionsの定義を記述した。
https://docs.github.com/ja/actions/quickstart
リリース時に実行する
GitHubのreleaseに公開した際に実行するように、以下の通り定義した。
name: Build and publish on: release: types: [published]
Windows用定義
GitHub Actions Virtual Environmentsは、OSごとに用意されている。
Windowsの向けには、Python3.6も含まれる、windows-2019を使用した。
以下の通りジョブを定義した。
Pythonの複数バージョンに対応するため、matrixを使用している。
Python 3.10のみnumpyのバージョンが異なるため、if:で条件分岐している。
deploy-windows: runs-on: windows-2019 strategy: matrix: python-version: [ '3.6', '3.7', '3.8', '3.9', '3.10' ] steps: - name: Check out repository code uses: actions/checkout@v3 - uses: actions/setup-python@v3 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install setuptools wheel twine Cython - name: Build and publish 3_6-3_9 if: ${{ matrix.python-version != '3.10' }} env: TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} run: | pip install numpy==1.19.5 python setup.py bdist_wheel twine upload dist/* - name: Build and publish 3_10 if: ${{ matrix.python-version == '3.10' }} env: TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} run: | pip install numpy==1.21.5 python setup.py sdist bdist_wheel twine upload dist/*
Linux用定義
manylinuxには複数のdockerイメージが用意されているが、新しいイメージの方が対応するPythonの新しいバージョンに対応しているが、利用者側でpipの新しいバージョンが必要になる。
できるだけ多くの環境に対応できるように、Python3.6から3.9は、manylinux2010を使い、Python3.10向けにはmanylinux_2_24を使うことにした。
GitHub Actionsで、実行環境にコンテナを指定できるが、ソースをホスト側にチェックアウトしたかったため、docker runコマンドでコンテナを起動するようにした。
manylinux2010とmanylinux_2_24でジョブを分けて、以下の通り定義した。
deploy-manylinux2010: runs-on: ubuntu-20.04 strategy: matrix: python-version: [ 'cp36-cp36m', 'cp37-cp37m', 'cp38-cp38', 'cp39-cp39' ] steps: - name: Check out repository code uses: actions/checkout@v3 - uses: actions/setup-python@v3 with: python-version: '3.x' - name: Install dependencies run: | python -m pip install --upgrade pip pip install twine - name: Build and publish env: TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} run: | docker run --rm -v $(pwd):/work -w /work quay.io/pypa/manylinux2010_x86_64 sh -c "/opt/python/${{ matrix.python-version }}/bin/pip install numpy==1.19.5 Cython && /opt/python/${{ matrix.python-version }}/bin/python setup.py bdist_wheel && cd dist && auditwheel repair *.whl" twine upload dist/wheelhouse/* deploy-manylinux_2_24: runs-on: ubuntu-20.04 strategy: matrix: python-version: [ 'cp310-cp310' ] steps: - name: Check out repository code uses: actions/checkout@v3 - uses: actions/setup-python@v3 with: python-version: '3.x' - name: Install dependencies run: | python -m pip install --upgrade pip pip install twine - name: Build and publish env: TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} run: | docker run --rm -v $(pwd):/work -w /work quay.io/pypa/manylinux_2_24_x86_64 sh -c "/opt/python/${{ matrix.python-version }}/bin/pip install numpy==1.21.5 Cython && /opt/python/${{ matrix.python-version }}/bin/python setup.py bdist_wheel && cd dist && auditwheel repair *.whl" twine upload dist/wheelhouse/*