🛺

Docker+poetryの開発環境とCI

2022/10/01に公開

はじめに・経緯

 みなさん、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できればいい、という主張がコードからもわかると思います。

server/Dockerfile
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立ち上げてる)。

docker-compose.yml
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の設定の例を以下に載せておきます。

.pre-commit-config.yaml
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が立っている)とかはあると思います。

.github/workflows/server.yaml
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