Docker+poetryの開発環境とCI
はじめに・経緯
みなさん、pythonの開発環境に何を使っていますか?localのスパゲッティ環境でゴリ押し、仮想環境作る、いろいろあると思います。かくいう僕は「環境依存における差異」が非常に嫌いなので、できればDocker内で何とかしたい、みたいな思想が強かったりします(docker環境にも差異があったりする話は別で......)。
加えてpoetryが最近のpythonのパッケージ管理のトレンドらしく、pythonを使ったアプリケーションではpoetryが候補の一つに入ってきます。これらを両立しつつ快適なpython開発環境が何となく自分の中で固まりつつあるのでつらつら書いていこうかなという感じです。
対象読者
- poetry+docker構成を試してみたい人
- チーム開発でpythonを採用している人
構成・解説
pythonは自由度が比較的高い言語であり、何も対策しないと各々が好き勝手なコードを書きます。というわけで少なくともpre-commit+CIでコーディング規約的に止めることが必須だと感じています。
- importのsort→isort(pre-commit+CI)
- formatter→black(pre-commit+CI)
- ファイル終わりの改行とか→pre-commit
Dockerfile
一応構成を載せておきます。packageのhot reloadだけ出来てないので何とかしたいつもり...です。要するにmoduleまわりがちゃんとinstallできればいい、という主張がコードからもわかると思います。
FROM python:3.9.13-bullseye
WORKDIR /server
COPY poetry.lock pyproject.toml ./
RUN apt-get update && apt-get install -y \
libpq-dev
RUN pip install --upgrade --no-cache-dir pip && \
pip install --no-cache-dir poetry && \
poetry config virtualenvs.create false && \
poetry install
WORKDIR /server/src
EXPOSE 8080
自分はいつもdocker composeつかってるのでそれも載せておきます(この例ではfastapi立ち上げてる)。
version: "3"
services:
server:
build: ./server
container_name: server
restart: always
env_file:
- server.env
- server_secret.env
volumes:
- ./server/:/server/
ports:
- 8080:8080
command: uvicorn main:fastapi_app --reload --host 0.0.0.0 --port 8080
pre-commit
git管理下のコードをcommit前にcheckしてくれます。下の手順を踏んでおくこと。
pip install pre-commit
pre-commitの設定の例を以下に載せておきます。
repos:
- repo: https://github.com/pycqa/isort
rev: 5.5.2
hooks:
- id: isort
args: ["--profile", "black"]
- repo: https://github.com/psf/black
rev: stable
hooks:
- id: black
language_version: python3
設定をinstallして使うには以下のコマンド。
pre-commit install
git commit --allow-empty -m test-lint
CI
github actionsを採用しています。CircleCIとかでもいいとは思いますが、ログとかを見たいときにわざわざ外部に飛ぶ必要もないと思うので。強いて言うなら複雑な構成を連携させたいときなどはCircleCIのほうが知見がたまっている(issueが立っている)とかはあると思います。
name: server
on: [push]
jobs:
checks:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9"]
steps:
- uses: actions/checkout@v3
- name: Set up python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
working-directory: ./server
run: |
python -m pip install --upgrade pip
pip install poetry
poetry config virtualenvs.create false
poetry install
- name: Test with pytest
working-directory: ./server/src
run:
python -m pytest tests
- name: Lint with black
working-directory: ./server/src
run:
black . --check
- name: Sort import with isort
working-directory: ./server/src
run:
isort . --check-only
最後に
コードを書く人を信用しないようにしましょう。あの人はコード書くのがうまいとか、あの人は下手とか、そういう議論があるのはそもそも論で基盤がおかしいので(戒め)。
Discussion