😸

pipenv + docker + github actionsでpython開発環境作成

2021/10/09に公開

それぞれ使う理由はこちらです。

  1. 開発PCの環境を汚したくない => dockerを使う。
  2. ライブラリの依存関係を管理したい => pipenvを使う。
    versionを管理する必要がないため。
  3. テストを自動実行するようにしたい => github actionsを使う。

参考リポジトリ
https://github.com/ushknn/trial-pipenv

実装

1. dockerでpython動かす

1.1 Dockerfileとdocke-compose.ymlを作成して以下のように編集。

Dockerfile

FROM python:3.9![](https://storage.googleapis.com/zenn-user-upload/795c1285e735a0ef5688bd5d.png)

WORKDIR /app

SHELL ["/bin/bash", "-c"]

RUN apt-get update &

RUN pip install --upgrade pip && \
    pip install pipenv

docker-compose.yml

version: '3'
services:
  app:
    build: .
    volumes:
      - ./:/app
    tty: true

1.2 コンテナを立ち上げる
以下のコマンドをターミナル実行します。

$ docker-compose build
$ docker-compose up -d
$docker-compose ps

以下のようにStateが「Up」であればOK

$docker-compose ps
       Name          Command   State   Ports
--------------------------------------------
trial-pipenv_app_1   python3   Up         

1.3 コンテナに入ります。
以下を実行すれば入れます。

docker-compose exec app bash

こんな感じで入力箇所左が「app#」になっていればOK!

root@d1eb115d66b4:/app# 

2. pipenv installする方法

Dockerfileでpython3.8のイメージを使っているためコンテナ起動すればpip使えます。
また、Dockerfileでpipenvをインストールするようにしてるのでコンテナが起動さればpipenvも使えます。

# pipenvをインストールする箇所
RUN pip install --upgrade pip && \
    pip install pipenv

3. pytest install

以下を実行するとpipenvの環境下にpytestがインストールされ、pipfileとpipfile.lockが更新されます。

root@d1eb115d66b4:/app# pipenv install pytest

4. pytest実行

test/test_pytest.pyを作成し以下のコードを追加します。
pytestが実行できればなんでもいいのですが今回はpytestのversionをチェックするテストにしました。'6.2.5'はインストールしたpytestのversionになります。

import pytest

def test_version():
    assert pytest.__version__ == '6.2.5'

root@d1eb115d66b4:/app# pipenv run pytest

結果はこんな感じになり、passedが表示されてれば成功です。(実行環境で表示内容は変わるかもしれないです。)

$ pipenv run pytest 
===================================================== test session starts ======================================================
platform linux -- Python 3.9.2, pytest-6.2.5, py-1.10.0, pluggy-1.0.0
rootdir: /app
collected 1 item                                                                                                               

tests/test_pytest.py .                                                                                                   [100%]

====================================================== 1 passed in 0.01s =======================================================

5. github actionsでpytest実行

.github/workflow/pytest.ymlを作成し以下を記入します。

name: PyTest

on:
  pull_request:
    branches:
      - main
  push:
    branches:
      - main
jobs:
  pytest:
    name: Run tests with pytest
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: docker Build
        run: docker-compose build
      - name: Docker Compose Up
        run: docker-compose up -d
      - name: Pipenv Install
        run: docker-compose exec -T app pipenv install
      - name: Pipenv Run Pytest
        run: docker-compose exec -T app pipenv run pytest

git commitを実行して、githubにpushすればテストが動きます。
実行中は黄色のマーク。

成功すると緑のチェックがつきます。

docker-composeのTオプションは結果の出力先をコンテナ内ではなくホストへするために付ける必要があります。(そうしないとテスト結果の成否が判定できない。)
(参考)
https://matsuand.github.io/docs.docker.jp.onthefly/compose/reference/exec/

終わりに

以上で環境構築は終わりになります。
あとはpipenv installで使いたいライブラリをインストールしていけばOKです。

Discussion