TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

cshogiをGitHub ActionsでビルドしてPyPIに公開する

Pythonの将棋ライブラリcshogiPyPIで公開しているが、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/*

まとめ

今までcshogiのビルドとPyPIへの公開を手動で行っていたが、手順が多く大変だったので、GitHub ActionsでビルドとPyPIへの公開を自動化した。
GitHub Actionsは、mac osにも対応しているので、今後気が向いたときに対応したい。