docker × django 環境を github actions を使って CI してみたのでメモ

2022年5月3日

参考

階層

色々省略はしていますが階層は下の感じです。
backend と frontend で分けているので django のプロジェクトは backend になります。
下の django.yml のファイルが今回メインになります。
自分で作成しても良いのですが、github の actions タブから django で検索するとテンプレがでるのでそれを使って必要に応じて修正しました。

.
|-- .github
|   `-- workflows
|       `-- django.yml # 作成
|-- backend
|   |-- app
|   |   `-- tests.py # テストコード
|   |-- manage.py
|   |-- config
|   |   `-- local.py
|   `-- ...
|-- docker-compose.yml
|-- dockerfile
|-- frontend
|   |-- node_modules
|   |-- package-lock.json
|   |-- package.json
|   `-- webpack.config.js
`-- requirements.txt

config/local.py (settings.py)

settings は下記のとおりです。
テストを実行するので test_database を追加しています。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'hoge_database',
        'USER': 'hoge_user',
        'PASSWORD': 'user_password',
        'HOST': 'db',
        'PORT': 3306,
        'OPTIONS': {
            'charset': 'utf8mb4'
        },
        'TEST': {
            'NAME': 'test_database',
        },
    }
}

django.yml

今回メインのファイルです。

name: Django CI
on:
  # push: push したら jobs を実行する。
  # workflow_dispatch: github で手動で実行可能にする。
  push:
  workflow_dispatch:
jobs:
  build:
    # runs-on: OSを指定する。
    # max-parallel: 同時に実行できるジョブの最大数を指定する。
    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [3.7, 3.8, 3.9]
    # name: steps に名前を指定する。
    # uses: clone してくるリポジトリを指定する。
    # run: 実行コマンドを指定する。
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v3
      with:
        python-version: ${{ matrix.python-version }}
    # Docker
    - name: Install Dependencies
      run: |
        docker-compose build web
        docker-compose up -d
        sleep 15s
        docker ps -a
    # MySql
    - name: Grant Privilages To MySql User
      run: |
        docker exec -t hoge_db_1 mysql -uroot -proot_password -e"GRANT ALL PRIVILEGES ON test_database.*to 'hoge_user';"
    # Django
    - name: Execute Tests
      run: |
        docker exec hoge_web_1 /bin/bash -c 'cd ./backend && python3.9 manage.py test app.tests'

殆どコメントで記載しているので少しだけ補足を入れておきます。

on:

on には github actions が起動する条件が記載できるようです。
push した時にテストを実行したいので :push と記載しています。この場合はどのブランチをプッシュしても、github actions が動作するようです。もし master ブランチをのみを指定する場合は次のように記載できるようです。

on:
  push:
    branches: [master]

ちなみにプルリクエストで実行する時は次のように書くこともできます。

on:
  pull_request:
    branches: [master]

workflow_dispatch:

テストを実行するのに、プッシュやプルリクを送りたくない場合に記述しておくと良いかもしれません。
これを入れることで github 上で手動で github actions を実行できるようになります。

jobs

実際に github actions が動作したら行う事を記述していきます。
「# Docker」部分では dockerfile と docker-compose を使って環境を構築しています。
「# MySql」部分ではコンテナにログインして mysql のユーザーがテスト用データベースにアクセス出来るよう権限を与えています。もちろん docker-compose と settings.py に記載したユーザー名を指定します。
「# Django」部分では コンテナにログインしてテストコマンドを実行しています。

2022年5月3日