LoginSignup
4
1

More than 3 years have passed since last update.

GitHub Actionsを使ってsetup.cfgをもとに_version.pyを更新する

Last updated at Posted at 2021-03-30

pipとpipenvとpoetryの技術的・歴史的背景とその展望という記事を読みました。Pythonのビルドシステムに微妙さを感じている自分には

単一のtomlファイルをrequirements.txtやそれらを参照するsetup.pyの代替とする事が出来るようになっている

という一文に心がぴょんぴょんしました。

偶然にも(本当に偶然だぞ!)新しくPythonのプロジェクトを作る機会があったので、試しにpyproject.tomlを使ってみました。
そしたら、初手で詰みました。バージョンの指定がつらかったからです。

よくあるsetup.pyでのバージョン読み込み

Pythonパッケージでは、よく、パッケージ名.__version__で、パッケージのバージョンを取得できるようになっています。
これは自動でそうなるのではなく、人手でそのように書かれていて、そういう風に書くという作法になっています。

そして、バージョンをsetup.pyにも書かなければならないのですが、パッケージ名.__version__との二重管理を防ぐために、

パッケージ名/_version.py
__version__ = "0.4.2"
setup.pyの最初の方
with open("パッケージ名/_version.py", "r", encoding="utf-8") as f:
    exec(f.read())

のようにsetup.pyに黒魔術を仕込んでいることが多いです。

では、setup.pyを使わない場合、これはどうすればいいでしょう。
setuptoolsでは、バージョンはsetup.cfgに書くことになります。その際、attr:という機能を使えばバージョンが読めそうなのですが、そうするとビルド時に自身をimportすることになり、ビルド環境に自身の依存関係をインストールしないといけなくなるようでした。

それは避けたいのですが、かといって、setup.cfg_version.pyの両方に同じことを書くのはもっと避けたいです。ということで、今回、GitHubアクションを使って機能を実現することにしました。

masterブランチのsetup.cfgが更新されたとき、_version.pyを更新し、pushする

というアクションを書きました。それにより、setup.cfgさえ更新すれば_version.pyのことはGitHub Actionsにおまかせできるようになりました。どのブランチにするかなどは、プロジェクトによって違うので、適宜、プロジェクトに合わせて書き換えてください。

.github/workflows/update_version_file.yml
# This is a basic workflow to help you get started with Actions
name: "Update _version.py"

# Controls when the action will run.
on:
  # Triggers the workflow on push or pull request events but only for the main branch
  push:
    branches: [ master ]
    paths:
      - "setup.cfg"
  pull_request:
    branches: [ master ]
    paths:
      - "setup.cfg"

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v2

      # !!!!runの行の > 以降を、_version.pyのパスに書き換え!!!!
      - name: Update version
        run: sed -n 's/^version\s*=\s*\(.*\)/__version__ = "\1"/p' setup.cfg > bqbraket/_version.py

      - name: Commit version file
        uses: EndBug/add-and-commit@v7.1.0
        with:
          author_name: "コミットに使う名前"
          author_email: "コミットに使うメールアドレス"
          message: "コミットメッセージ"
          add: "上で指定した_version.pyのパス"

ライセンス

本YAMLファイルはBlueqatプロジェクトがこちらでオープンソースとして公開しており、ライセンスも同パッケージに準じて、Apache-2ライセンスとします。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1