概要
SQLAlchemyでDBを使ったpytestをgithub actionsで自動チェック出来るようにしたいと思いました。
最初は、ローカルのDBに接続しようとし、エラーになってしまいましたが、github actionsのservicesを使うことで解決したので、記載していきます。
環境
Python==3.11.7
Flask==3.0.3
SQLAlchemy==2.0.35
pytest==8.3.3
コード例
.github/workflows/code-check.yml
# 1
name: Code Check
# 2
on:
push:
branches:
- "**"
pull_request:
types:
- closed
jobs:
pytest:
# 3
runs-on: ubuntu-24.04
services:
# 4
postgres:
image: postgres:16
env:
POSTGRES_HOST: localhost
POSTGRES_USER: postgres
POSTGRES_PORT: 5432
POSTGRES_DB: puppet_ci_test
POSTGRES_PASSWORD: postgres
ports:
- 5432:5432
steps:
# 5
- name: Checkout code
uses: actions/checkout@v4
# 6
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.11"
# 7
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install --no-cache-dir -r requirements.txt
# 8
- name: Run Pytest
env:
POSTGRES_HOST: localhost
POSTGRES_USER: postgres
POSTGRES_PORT: 5432
POSTGRES_DB: puppet_ci_test
POSTGRES_PASSWORD: postgres
run: pytest tests
解説
1, ワークフロー名(任意の名前)
name: Code Check
2, 全てのブランチのpush時、プルリクエストがマージされた時に実行。
on:
push:
branches:
- "**"
pull_request:
types:
- closed
3, jobの実行環境を指定
runs-on: ubuntu-24.04
4, postgreSQL16を使用、envに接続情報を設定
postgres:
image: postgres:16
env:
POSTGRES_HOST: localhost
POSTGRES_USER: postgres
POSTGRES_PORT: 5432
POSTGRES_DB: puppet_ci_test
POSTGRES_PASSWORD: postgres
ports:
- 5432:5432
5, コードをワークフロー内にクローン
- name: Checkout code
uses: actions/checkout@v4
6, pythonバージョン3.11系の最新版をセットアップ
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.11"
7, pipを最新化し、requirements.txt記載のライブラリインストール
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install --no-cache-dir -r requirements.txt
8, コード内で使う環境変数を設定し、testsディレクトリ内のpytest実行
- name: Run Pytest
env:
POSTGRES_HOST: localhost
POSTGRES_USER: postgres
POSTGRES_PORT: 5432
POSTGRES_DB: puppet_ci_test
POSTGRES_PASSWORD: postgres
run: pytest tests
補足
実装のDB接続箇所では、下記でgithub actionsの場合に分岐できるので、8で設定した環境変数を使うよう切り替えます。
import os
# github actions workflow内の場合の処理
if "GITHUB_ACTIONS" in os.environ:
# 環境変数POSTGRES_USER読み込み
os.getenv("POSTGRES_USER")
参考サイト