[Python]pipenv + Github ActionsでDevOps
Pythonでネタコマンドラインツールを作ったのですが、pipenv + Github Actions を交えて、(ネタツールにしては)堅牢にDevOpsをしたので、ハマったポイント等を覚書します。
pipenv
Pythonのパッケージマネージャー。Pythonバージョンの npm なイメージですが、virtualenv の様にPythonの仮想環境をアクティベート出来るので、プロジェクトに閉じたオンリーワンな環境をあっさりと作り上げることが可。
Github Actions
Githubがサポートしているワークフローサービス。YAML を上手く書くと、ビルド環境を立てて、テストやリリース等を行える。パブリックにされている汎用アクションの様な物を用いると、リポジトリのチェックアウトやパッケージリリース等も楽に実現可と、とても便利。
pipenv 覚書
仮想環境のセットアップ
$ pipenv --python 3
pipenv で依存管理を行うファイル Pipfile が作られます。
パッケージインストール
$ pipenv install pybaseball
テストやビルド、フォーマット等に必要なパッケージを入れる場合は、--dev オプションを入れて、dev-packages としてインストールします。
$ pipenv install --dev twine wheel
これらのパッケージはPythonの「仮想環境」にインストールされているので、ローカルマシンはクリーンなままです。仮想環境の中の pip にパッケージが入っているため、プロジェクトに閉じたオンリーワンな環境に Python とパッケージが詰まっている、そんな状況です。
Pipfile.lock
pipenv install でパッケージを入れると、インストールしたパッケージのバージョンを保持する Pipfile.lock が作られます。npm で言う package-lock.json と同等。
ただし、このファイルに人力で手を入れることは無いので、「お、あるなー」ぐらいなテンションで良いです。
スクリプト実行
pipenv run
npm と同じく、pipenv もスクリプトを定義の上、実行が出来ます。
&& でつないで複数コマンドを実行する場合は、bash -c でパスしてあげる必要がある様です。
...
[scripts]
test = "bash -c 'python -m pip install -e . && pytest tests'"
build = "bash -c 'python setup.py sdist && python setup.py bdist_wheel'"
と書き、例えば「あー、テストでもするかー」との気分になれば
$ pipenv run test
で実行。
仮想環境の中でコマンド実行
$ pipenv shell
で、仮想環境の中に入ります。docker exec の様なイメージ。
この中では、仮想環境の中の Python pip にアクセス出来るため、自作パッケージのローカルインストールやテストをラフに書くことが可。
Github Actions 覚書
主に pipenv を利用しながらのフロー作り、との観点で。とは言え、基本は YAML にコマンドをステップ毎に書く形なので、あんまりハマるポイントは無かったです。
pipenv 環境の再現
Pipfile と Pipfile.lock が存在する場合は、pipenv sync --dev で開発用パッケージも入れたインストールが可。
Warning: Python 3.10 was not found on your system...
が、、Pipfile の中にPythonバージョンが 3.10 とされていましたが、ワークフロー環境上に無いため、エラーになってしまった様です。
Github Actions 側の環境がどうなっているかは分からんので、pipenv のドキュメントにオススメされる形で管理を直します。
複数バージョンのPythonを対象とする場合は、 Pipfile.lock はバージョン管理に含めないでください。
この上で、
# Pipfile.lockを生成
$ pipenv lock
# syncする
$ pipenv sync --dev
ワークフロー全体
テスト
name: test
on:
push:
branches:
- main
jobs:
test:
runs-on: ubuntu-20.04
steps:
- name: checkout
uses: actions/checkout@v2
- name: install pipenv
run: |
python -m pip install --upgrade pip
python -m pip install pipenv
- name: lock package version
run: pipenv lock
- name: install packages
run: pipenv sync --dev
- name: run test
run: pipenv run test
リリース
name: release
on:
workflow_dispatch:
jobs:
release:
runs-on: ubuntu-20.04
steps:
- name: checkout
uses: actions/checkout@v2
- name: install pipenv
run: |
python -m pip install --upgrade pip
python -m pip install pipenv
- name: lock package version
run: pipenv lock
- name: install packages
run: pipenv sync --dev
- name: build
run: pipenv run build
- name: release
uses: pypa/gh-action-pypi-publish@master
with:
user: __token__
password: ${{ secrets.PYPI_API_TOKEN }}
まとめ
クリーンに環境を作りつつ、テストやリリースも楽にぐるぐる回せて、とても良かったです。ネタコマンドラインツールにはリッチすぎるぐらい、、
Pythonの場合はほとんどこのスクリプトを流用出来る気がするので、これからはDevOpsが楽に実現出来そうです!
Github Actions のデバッグが辛かったなー、との気はするので、今度は act をテストしてみよう、、
Discussion